Hello community,

here is the log from the commit of package mutter for openSUSE:Factory checked 
in at 2017-02-20 14:28:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mutter (Old)
 and      /work/SRC/openSUSE:Factory/.mutter.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mutter"

Changes:
--------
--- /work/SRC/openSUSE:Factory/mutter/mutter.changes    2016-12-04 
15:05:36.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.mutter.new/mutter.changes       2017-02-20 
14:28:50.716883205 +0100
@@ -1,0 +2,24 @@
+Thu Feb 16 23:02:12 UTC 2017 - [email protected]
+
+- Update to version 3.22.3:
+  + Fix switching between two finger- and edge scrolling on wayland
+    (bgo#771744).
+  + Fix frequent freezes in multihead setups on wayland
+    (bgo#774557).
+  + Preserve root window mask on XSelectionRequest (bgo#776128).
+  + Fix window menu placement with HiDPI (bgo#776055).
+  + Fix HiDPI detection on vertical monitor layouts (bgo#777687).
+  + Fix erroneous key event repeats (bgo#774989).
+  + Fix "ghost" cursors in multi-monitor setups (bgo#771056).
+  + Use eglGetPlatformDisplay (bgo#772422).
+  + Fix erratic raise_or_lower behavior (bgo#705200).
+  + Extend tablet device checks (bgo#773779).
+  + Set right scale for tablet tool cursors on HiDPI (bgo#778474).
+  + Allow edge-scrolling without 2fg-scroll capable devices
+    (bgo#778554).
+  + Misc. bug fixes: bgo#771297, bgo#774135, bgo#775986,
+    bgo#777691, bgo#777470, bgo#778262, bgo#776919.
+  + Updated translations.
+- Drop mutter-x11-meta.patch: Fixed upstream.
+
+-------------------------------------------------------------------

Old:
----
  mutter-3.22.2.tar.xz
  mutter-x11-meta.patch

New:
----
  mutter-3.22.3.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mutter.spec ++++++
--- /var/tmp/diff_new_pack.azU0yT/_old  2017-02-20 14:28:51.832725750 +0100
+++ /var/tmp/diff_new_pack.azU0yT/_new  2017-02-20 14:28:51.836725186 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package mutter
 #
-# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -25,7 +25,7 @@
 %global __provides_exclude_from ^%{_libdir}/mutter/.*.typelib$
 
 Name:           mutter
-Version:        3.22.2
+Version:        3.22.3
 Release:        0
 Summary:        Window and compositing manager based on Clutter
 License:        GPL-2.0+
@@ -40,8 +40,6 @@
 Patch3:         mutter-bsc984738-grab-display.patch
 # PATCH-FIX-UPSTREAM mutter-fix-startup.patch bgo#768531 [email protected] 
-- Fix slow startup notification on wayland
 Patch6:         mutter-fix-startup.patch
-# PATCH-FIX-UPSTREAM mutter-x11-meta.patch bgo#775337 bgo#771744 boo#1011356 
[email protected] -- meta-input-settings-x11: Don't try setting unavailable 
scroll methods
-Patch7:         mutter-x11-meta.patch
 BuildRequires:  fdupes
 BuildRequires:  gobject-introspection-devel >= 0.9.5
 BuildRequires:  libSM-devel
@@ -141,7 +139,6 @@
 %patch3 -p1
 %endif
 %patch6 -p1
-%patch7 -p1
 
 %build
 %configure \

++++++ mutter-3.22.2.tar.xz -> mutter-3.22.3.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/NEWS new/mutter-3.22.3/NEWS
--- old/mutter-3.22.2/NEWS      2016-11-10 15:11:28.000000000 +0100
+++ new/mutter-3.22.3/NEWS      2017-02-16 18:11:49.000000000 +0100
@@ -1,3 +1,27 @@
+3.22.3
+======
+* Fix switching between two finger- and edge scrolling on wayland [Rui; 
#771744]
+* Fix frequent freezes in multihead setups on wayland [Rui; #774557]
+* Preserve root window mask on XSelectionRequest [Olivier; #776128]
+* Fix window menu placement with HiDPI [Jonas; #776055]
+* Fix HiDPI detection on vertical monitor layouts [Carlos; #777687]
+* Fix erroneous key event repeats [Rui; #774989]
+* Fix "ghost" cursors in multi-monitor setups [Jonas; #771056]
+* Use eglGetPlatformDisplay [Adam; #772422]
+* Fix erratic raise_or_lower behavior [Jose; #705200]
+* Extend tablet device checks [Carlos; #773779]
+* Set right scale for tablet tool cursors on HiDPI [Carlos; #778474]
+* Allow edge-scrolling without 2fg-scroll capable devices [Rui; #778554]
+* Misc. bug fixes [Jonas, Rui, Carlos, Peter; #771297, #774135, #775986,
+  #777691, #777470, #778262, #776919]
+
+Contributors:
+  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Peter Hutterer, Adam Jackson,
+  Jose Marino, Rui Matos
+
+Translations:
+  Mandy Wang [zh_CN]
+
 3.22.2
 ======
 * Really fix framebuffer capture origin offset [Rui; #771502]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/clutter/build/Makefile.in 
new/mutter-3.22.3/clutter/build/Makefile.in
--- old/mutter-3.22.2/clutter/build/Makefile.in 2016-11-10 15:12:03.000000000 
+0100
+++ new/mutter-3.22.3/clutter/build/Makefile.in 2017-02-16 17:43:31.000000000 
+0100
@@ -162,7 +162,7 @@
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 am__DIST_COMMON = $(srcdir)/Makefile.in compile config.guess \
-       config.sub depcomp install-sh ltmain.sh missing
+       config.sub install-sh ltmain.sh missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/clutter/clutter/evdev/clutter-device-manager-evdev.c 
new/mutter-3.22.3/clutter/clutter/evdev/clutter-device-manager-evdev.c
--- old/mutter-3.22.2/clutter/clutter/evdev/clutter-device-manager-evdev.c      
2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/clutter/clutter/evdev/clutter-device-manager-evdev.c      
2017-02-16 17:24:02.000000000 +0100
@@ -2261,6 +2261,12 @@
   return next_id;
 }
 
+void
+_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev 
*manager_evdev)
+{
+  dispatch_libinput (manager_evdev);
+}
+
 static int
 compare_ids (gconstpointer a,
              gconstpointer b)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/clutter/clutter/evdev/clutter-device-manager-evdev.h 
new/mutter-3.22.3/clutter/clutter/evdev/clutter-device-manager-evdev.h
--- old/mutter-3.22.2/clutter/clutter/evdev/clutter-device-manager-evdev.h      
2016-10-27 14:27:30.000000000 +0200
+++ new/mutter-3.22.3/clutter/clutter/evdev/clutter-device-manager-evdev.h      
2017-02-16 17:24:02.000000000 +0100
@@ -76,6 +76,8 @@
                                                       float                    
 *new_x,
                                                       float                    
 *new_y);
 
+void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev 
*manager_evdev);
+
 static inline guint64
 us (guint64 us)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/clutter/clutter/evdev/clutter-seat-evdev.c 
new/mutter-3.22.3/clutter/clutter/evdev/clutter-seat-evdev.c
--- old/mutter-3.22.2/clutter/clutter/evdev/clutter-seat-evdev.c        
2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/clutter/clutter/evdev/clutter-seat-evdev.c        
2017-02-16 17:24:02.000000000 +0100
@@ -185,15 +185,19 @@
 {
   ClutterSeatEvdev *seat = data;
   GSource *source;
-  guint32 time_ms;
+
+  /* There might be events queued in libinput that could cancel the
+     repeat timer. */
+  _clutter_device_manager_evdev_dispatch (seat->manager_evdev);
+  if (!seat->repeat_timer)
+    return G_SOURCE_REMOVE;
 
   g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
   source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
-  time_ms = g_source_get_time (source) / 1000;
 
   clutter_seat_evdev_notify_key (seat,
                                  seat->repeat_device,
-                                 ms2us (time_ms),
+                                 g_source_get_time (source),
                                  seat->repeat_key,
                                  AUTOREPEAT_VALUE,
                                  FALSE);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/cogl/cogl/winsys/cogl-winsys-egl-x11.c 
new/mutter-3.22.3/cogl/cogl/winsys/cogl-winsys-egl-x11.c
--- old/mutter-3.22.2/cogl/cogl/winsys/cogl-winsys-egl-x11.c    2016-10-19 
16:54:40.000000000 +0200
+++ new/mutter-3.22.3/cogl/cogl/winsys/cogl-winsys-egl-x11.c    2017-02-16 
17:24:00.000000000 +0100
@@ -261,6 +261,39 @@
   g_slice_free (CoglRendererEGL, egl_renderer);
 }
 
+static EGLDisplay
+_cogl_winsys_egl_get_display (void *native)
+{
+  EGLDisplay dpy = NULL;
+  const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
+
+  if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
+    {
+      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
+       (void *) eglGetProcAddress ("eglGetPlatformDisplay");
+
+      if (get_platform_display)
+       dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
+
+      if (dpy)
+       return dpy;
+    }
+
+  if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
+    {
+      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
+       (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
+
+      if (get_platform_display)
+       dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
+
+      if (dpy)
+       return dpy;
+    }
+
+  return eglGetDisplay ((EGLNativeDisplayType) native);
+}
+
 static CoglBool
 _cogl_winsys_renderer_connect (CoglRenderer *renderer,
                                CoglError **error)
@@ -277,8 +310,7 @@
   if (!_cogl_xlib_renderer_connect (renderer, error))
     goto error;
 
-  egl_renderer->edpy =
-    eglGetDisplay ((EGLNativeDisplayType) xlib_renderer->xdpy);
+  egl_renderer->edpy = _cogl_winsys_egl_get_display (xlib_renderer->xdpy);
 
   if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
     goto error;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/configure new/mutter-3.22.3/configure
--- old/mutter-3.22.2/configure 2016-11-10 15:11:53.000000000 +0100
+++ new/mutter-3.22.3/configure 2017-02-16 18:12:12.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mutter 3.22.2.
+# Generated by GNU Autoconf 2.69 for mutter 3.22.3.
 #
 # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=mutter>.
 #
@@ -591,8 +591,8 @@
 # Identity of this package.
 PACKAGE_NAME='mutter'
 PACKAGE_TARNAME='mutter'
-PACKAGE_VERSION='3.22.2'
-PACKAGE_STRING='mutter 3.22.2'
+PACKAGE_VERSION='3.22.3'
+PACKAGE_STRING='mutter 3.22.3'
 PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=mutter'
 PACKAGE_URL=''
 
@@ -1428,7 +1428,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mutter 3.22.2 to adapt to many kinds of systems.
+\`configure' configures mutter 3.22.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1502,7 +1502,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mutter 3.22.2:";;
+     short | recursive ) echo "Configuration of mutter 3.22.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1670,7 +1670,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mutter configure 3.22.2
+mutter configure 3.22.3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2085,7 +2085,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mutter $as_me 3.22.2, which was
+It was created by mutter $as_me 3.22.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2959,7 +2959,7 @@
 
 # Define the identity of the package.
  PACKAGE='mutter'
- VERSION='3.22.2'
+ VERSION='3.22.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4733,7 +4733,7 @@
 
 MUTTER_MAJOR_VERSION=3
 MUTTER_MINOR_VERSION=22
-MUTTER_MICRO_VERSION=2
+MUTTER_MICRO_VERSION=3
 MUTTER_PLUGIN_API_VERSION=3
 
 
@@ -18786,7 +18786,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mutter $as_me 3.22.2, which was
+This file was extended by mutter $as_me 3.22.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -18852,7 +18852,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mutter config.status 3.22.2
+mutter config.status 3.22.3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/configure.ac 
new/mutter-3.22.3/configure.ac
--- old/mutter-3.22.2/configure.ac      2016-11-10 15:11:37.000000000 +0100
+++ new/mutter-3.22.3/configure.ac      2017-02-16 18:11:49.000000000 +0100
@@ -2,7 +2,7 @@
 
 m4_define([mutter_major_version], [3])
 m4_define([mutter_minor_version], [22])
-m4_define([mutter_micro_version], [2])
+m4_define([mutter_micro_version], [3])
 
 m4_define([mutter_version],
           [mutter_major_version.mutter_minor_version.mutter_micro_version])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/data/50-mutter-navigation.xml 
new/mutter-3.22.3/data/50-mutter-navigation.xml
--- old/mutter-3.22.2/data/50-mutter-navigation.xml     2016-08-19 
23:20:03.000000000 +0200
+++ new/mutter-3.22.3/data/50-mutter-navigation.xml     2016-11-22 
16:27:46.000000000 +0100
@@ -1,78 +1,140 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<KeyListEntries wm_name="Mutter" schema="org.gnome.desktop.wm.keybindings" 
package="mutter" group="system" name="Navigation">
+<?xml version="1.0" encoding="UTF-8" ?>
+<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
+                group="system"
+                name="Navigation"
+                wm_name="Mutter"
+                package="mutter">
 
-       <KeyListEntry name="move-to-workspace-1" description="Move window to 
workspace 1"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-1"
+                     description="Move window to workspace 1" />
 
-       <KeyListEntry name="move-to-workspace-2" description="Move window to 
workspace 2"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-2"
+                     description="Move window to workspace 2" />
 
-       <KeyListEntry name="move-to-workspace-3" description="Move window to 
workspace 3"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-3"
+                     description="Move window to workspace 3" />
 
-       <KeyListEntry name="move-to-workspace-4" description="Move window to 
workspace 4"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-4"
+                     description="Move window to workspace 4" />
 
-        <KeyListEntry name="move-to-workspace-last" description="Move window 
to last workspace"></KeyListEntry>
+        <KeyListEntry name="move-to-workspace-last"
+                      description="Move window to last workspace" />
 
-       <KeyListEntry name="move-to-workspace-left" description="Move window 
one workspace to the left"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-left"
+                     description="Move window one workspace to the left" />
 
-       <KeyListEntry name="move-to-workspace-right" description="Move window 
one workspace to the right"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-right"
+                     description="Move window one workspace to the right" />
 
-       <KeyListEntry name="move-to-workspace-up" description="Move window one 
workspace up"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-up"
+                     description="Move window one workspace up" />
 
-       <KeyListEntry name="move-to-workspace-down" description="Move window 
one workspace down"></KeyListEntry>
+       <KeyListEntry name="move-to-workspace-down"
+                     description="Move window one workspace down" />
 
-       <KeyListEntry name="move-to-monitor-left" description="Move window one 
monitor to the left"></KeyListEntry>
+       <KeyListEntry name="move-to-monitor-left"
+                     description="Move window one monitor to the left" />
 
-       <KeyListEntry name="move-to-monitor-right" description="Move window one 
monitor to the right"></KeyListEntry>
+       <KeyListEntry name="move-to-monitor-right"
+                     description="Move window one monitor to the right" />
 
-       <KeyListEntry name="move-to-monitor-up" description="Move window one 
monitor up"></KeyListEntry>
+       <KeyListEntry name="move-to-monitor-up"
+                     description="Move window one monitor up" />
 
-       <KeyListEntry name="move-to-monitor-down" description="Move window one 
monitor down"></KeyListEntry>
+       <KeyListEntry name="move-to-monitor-down"
+                     description="Move window one monitor down" />
 
-       <KeyListEntry reverse-entry="switch-applications-backward" 
name="switch-applications" description="Switch applications"></KeyListEntry>
+       <KeyListEntry name="switch-applications"
+                     reverse-entry="switch-applications-backward"
+                     description="Switch applications"/>
 
-       <KeyListEntry reverse-entry="switch-applications" 
name="switch-applications-backward" hidden="true" description="Switch to 
previous application"></KeyListEntry>
+       <KeyListEntry name="switch-applications-backward"
+                     reverse-entry="switch-applications"
+                     hidden="true"
+                     description="Switch to previous application"/>
 
-       <KeyListEntry reverse-entry="switch-windows-backward" 
name="switch-windows" description="Switch windows"></KeyListEntry>
+       <KeyListEntry name="switch-windows"
+                     reverse-entry="switch-windows-backward"
+                     description="Switch windows"/>
 
-       <KeyListEntry reverse-entry="switch-windows" 
name="switch-windows-backward" hidden="true" description="Switch to previous 
window"></KeyListEntry>
+       <KeyListEntry name="switch-windows-backward"
+                     reverse-entry="switch-windows"
+                     hidden="true"
+                     description="Switch to previous window"/>
 
-       <KeyListEntry reverse-entry="switch-group-backward" name="switch-group" 
description="Switch windows of an application"></KeyListEntry>
+       <KeyListEntry name="switch-group"
+                     reverse-entry="switch-group-backward"
+                     description="Switch windows of an application"/>
 
-       <KeyListEntry reverse-entry="switch-group" name="switch-group-backward" 
hidden="true" description="Switch to previous window of an 
application"></KeyListEntry>
+       <KeyListEntry name="switch-group-backward"
+                     reverse-entry="switch-group"
+                     hidden="true"
+                     description="Switch to previous window of an 
application"/>
 
-       <KeyListEntry reverse-entry="switch-panels-backward" 
name="switch-panels" description="Switch system controls"></KeyListEntry>
+       <KeyListEntry name="switch-panels"
+                     reverse-entry="switch-panels-backward"
+                     description="Switch system controls"/>
 
-       <KeyListEntry reverse-entry="switch-panels" 
name="switch-panels-backward" hidden="true" description="Switch to previous 
system control"></KeyListEntry>
+       <KeyListEntry name="switch-panels-backward"
+                     reverse-entry="switch-panels"
+                     hidden="true"
+                     description="Switch to previous system control"/>
 
-       <KeyListEntry reverse-entry="cycle-windows-backward" 
name="cycle-windows" description="Switch windows directly"></KeyListEntry>
+       <KeyListEntry name="cycle-windows"
+                     reverse-entry="cycle-windows-backward"
+                     description="Switch windows directly"/>
 
-       <KeyListEntry reverse-entry="cycle-windows" 
name="cycle-windows-backward" hidden="true" description="Switch directly to 
previous window"></KeyListEntry>
+       <KeyListEntry name="cycle-windows-backward"
+                     reverse-entry="cycle-windows"
+                     hidden="true"
+                     description="Switch directly to previous window"/>
 
-       <KeyListEntry reverse-entry="cycle-group-backward" name="cycle-group" 
description="Switch windows of an app directly"></KeyListEntry>
+       <KeyListEntry name="cycle-group"
+                     reverse-entry="cycle-group-backward"
+                     description="Switch windows of an app directly"/>
 
-       <KeyListEntry reverse-entry="cycle-group" name="cycle-group-backward" 
hidden="true" description="Switch directly to previous window of an 
app"></KeyListEntry>
+       <KeyListEntry name="cycle-group-backward"
+                     reverse-entry="cycle-group"
+                     hidden="true"
+                     description="Switch directly to previous window of an 
app"/>
 
-       <KeyListEntry reverse-entry="cycle-panels-backward" name="cycle-panels" 
description="Switch system controls directly"></KeyListEntry>
+       <KeyListEntry name="cycle-panels"
+                     reverse-entry="cycle-panels-backward"
+                     description="Switch system controls directly"/>
 
-       <KeyListEntry reverse-entry="cycle-panels" name="cycle-panels-backward" 
hidden="true" description="Switch directly to previous system 
control"></KeyListEntry>
+       <KeyListEntry name="cycle-panels-backward"
+                     reverse-entry="cycle-panels"
+                     hidden="true"
+                     description="Switch directly to previous system control"/>
 
-       <KeyListEntry name="show-desktop" description="Hide all normal 
windows"></KeyListEntry>
+       <KeyListEntry name="show-desktop"
+                     description="Hide all normal windows"/>
 
-       <KeyListEntry name="switch-to-workspace-1" description="Switch to 
workspace 1"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-1"
+                     description="Switch to workspace 1" />
 
-       <KeyListEntry name="switch-to-workspace-2" description="Switch to 
workspace 2"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-2"
+                     description="Switch to workspace 2" />
 
-       <KeyListEntry name="switch-to-workspace-3" description="Switch to 
workspace 3"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-3"
+                     description="Switch to workspace 3" />
 
-       <KeyListEntry name="switch-to-workspace-4" description="Switch to 
workspace 4"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-4"
+                     description="Switch to workspace 4" />
 
-       <KeyListEntry name="switch-to-workspace-last" description="Switch to 
last workspace"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-last"
+                     description="Switch to last workspace" />
 
-       <KeyListEntry name="switch-to-workspace-left" description="Move to 
workspace left"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-left"
+                     description="Move to workspace left" />
 
-       <KeyListEntry name="switch-to-workspace-right" description="Move to 
workspace right"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-right"
+                     description="Move to workspace right" />
 
-       <KeyListEntry name="switch-to-workspace-up" description="Move to 
workspace above"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-up"
+                     description="Move to workspace above" />
 
-       <KeyListEntry name="switch-to-workspace-down" description="Move to 
workspace below"></KeyListEntry>
+       <KeyListEntry name="switch-to-workspace-down"
+                     description="Move to workspace below" />
 
-</KeyListEntries>
\ No newline at end of file
+</KeyListEntries>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/data/50-mutter-system.xml 
new/mutter-3.22.3/data/50-mutter-system.xml
--- old/mutter-3.22.2/data/50-mutter-system.xml 2016-08-19 23:20:03.000000000 
+0200
+++ new/mutter-3.22.3/data/50-mutter-system.xml 2016-11-22 16:27:46.000000000 
+0100
@@ -1,8 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<KeyListEntries wm_name="Mutter" schema="org.gnome.desktop.wm.keybindings" 
package="mutter" group="system" name="System">
+<?xml version="1.0" encoding="UTF-8" ?>
+<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
+                group="system"
+                name="System"
+                wm_name="Mutter"
+                package="mutter">
 
-       <KeyListEntry name="panel-run-dialog" description="Show the run command 
prompt"></KeyListEntry>
+       <KeyListEntry name="panel-run-dialog" description="Show the run command 
prompt"/>
 
-       <KeyListEntry name="panel-main-menu" description="Show the activities 
overview"></KeyListEntry>
+       <KeyListEntry name="panel-main-menu" description="Show the activities 
overview"/>
+
+</KeyListEntries>
 
-</KeyListEntries>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/data/50-mutter-windows.xml 
new/mutter-3.22.3/data/50-mutter-windows.xml
--- old/mutter-3.22.2/data/50-mutter-windows.xml        2016-08-19 
23:20:03.000000000 +0200
+++ new/mutter-3.22.3/data/50-mutter-windows.xml        2016-11-22 
16:27:46.000000000 +0100
@@ -1,40 +1,50 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<KeyListEntries wm_name="Mutter" schema="org.gnome.desktop.wm.keybindings" 
package="mutter" group="system" name="Windows">
+<?xml version="1.0" encoding="UTF-8" ?>
+<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
+                group="system"
+                name="Windows"
+                wm_name="Mutter"
+                package="mutter">
 
-       <KeyListEntry name="activate-window-menu" description="Activate the 
window menu"></KeyListEntry>
+       <KeyListEntry name="activate-window-menu" description="Activate the 
window menu"/>
 
-       <KeyListEntry name="toggle-fullscreen" description="Toggle fullscreen 
mode"></KeyListEntry>
+       <KeyListEntry name="toggle-fullscreen" description="Toggle fullscreen 
mode"/>
 
-       <KeyListEntry name="toggle-maximized" description="Toggle maximization 
state"></KeyListEntry>
+       <KeyListEntry name="toggle-maximized" description="Toggle maximization 
state"/>
 
-       <KeyListEntry name="maximize" description="Maximize 
window"></KeyListEntry>
+       <KeyListEntry name="maximize" description="Maximize window"/>
 
-       <KeyListEntry name="unmaximize" description="Restore 
window"></KeyListEntry>
+       <KeyListEntry name="unmaximize" description="Restore window"/>
 
-       <KeyListEntry name="toggle-shaded" description="Toggle shaded 
state"></KeyListEntry>
+       <KeyListEntry name="toggle-shaded" description="Toggle shaded state"/>
 
-       <KeyListEntry name="close" description="Close window"></KeyListEntry>
+       <KeyListEntry name="close" description="Close window"/>
 
-       <KeyListEntry name="minimize" description="Hide window"></KeyListEntry>
+       <KeyListEntry name="minimize" description="Hide window"/>
 
-       <KeyListEntry name="begin-move" description="Move 
window"></KeyListEntry>
+       <KeyListEntry name="begin-move" description="Move window"/>
 
-       <KeyListEntry name="begin-resize" description="Resize 
window"></KeyListEntry>
+       <KeyListEntry name="begin-resize" description="Resize window"/>
 
-       <KeyListEntry name="toggle-on-all-workspaces" description="Toggle 
window on all workspaces or one"></KeyListEntry>
+       <KeyListEntry name="toggle-on-all-workspaces"
+                     description="Toggle window on all workspaces or one"/>
 
-       <KeyListEntry name="raise-or-lower" description="Raise window if 
covered, otherwise lower it"></KeyListEntry>
+       <KeyListEntry name="raise-or-lower" description="Raise window if 
covered, otherwise lower it"/>
 
-       <KeyListEntry name="raise" description="Raise window above other 
windows"></KeyListEntry>
+       <KeyListEntry name="raise" description="Raise window above other 
windows"/>
 
-       <KeyListEntry name="lower" description="Lower window below other 
windows"></KeyListEntry>
+       <KeyListEntry name="lower" description="Lower window below other 
windows"/>
 
-       <KeyListEntry name="maximize-vertically" description="Maximize window 
vertically"></KeyListEntry>
+       <KeyListEntry name="maximize-vertically" description="Maximize window 
vertically"/>
 
-       <KeyListEntry name="maximize-horizontally" description="Maximize window 
horizontally"></KeyListEntry>
+       <KeyListEntry name="maximize-horizontally" description="Maximize window 
horizontally"/>
 
-       <KeyListEntry schema="org.gnome.mutter.keybindings" 
name="toggle-tiled-left" description="View split on left"></KeyListEntry>
+       <KeyListEntry name="toggle-tiled-left"
+                      schema="org.gnome.mutter.keybindings"
+                      description="View split on left"/>
 
-       <KeyListEntry schema="org.gnome.mutter.keybindings" 
name="toggle-tiled-right" description="View split on right"></KeyListEntry>
+       <KeyListEntry name="toggle-tiled-right"
+                      schema="org.gnome.mutter.keybindings"
+                      description="View split on right"/>
+
+</KeyListEntries>
 
-</KeyListEntries>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/po/mutter.pot 
new/mutter-3.22.3/po/mutter.pot
--- old/mutter-3.22.2/po/mutter.pot     2016-08-19 22:39:44.000000000 +0200
+++ new/mutter-3.22.3/po/mutter.pot     2016-11-22 17:24:06.000000000 +0100
@@ -6,10 +6,10 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: mutter 3.21.90\n"
+"Project-Id-Version: mutter 3.23.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?";
 "product=mutter&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2016-08-19 22:39+0200\n"
+"POT-Creation-Date: 2016-11-22 17:24+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <[email protected]>\n"
@@ -424,11 +424,14 @@
 msgid "Switch to VT 12"
 msgstr ""
 
-#: src/backends/meta-input-settings.c:1707
+#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
+#. * mapping through the available outputs.
+#.
+#: src/backends/meta-input-settings.c:1739
 msgid "Switch monitor"
 msgstr ""
 
-#: src/backends/meta-input-settings.c:1709
+#: src/backends/meta-input-settings.c:1741
 msgid "Show on-screen help"
 msgstr ""
 
@@ -452,7 +455,9 @@
 msgid "%s %s"
 msgstr ""
 
-#: src/compositor/compositor.c:463
+#. This probably means that a non-WM compositor like xcompmgr is running;
+#. * we have no way to get it to exit
+#: src/compositor/compositor.c:471
 #, c-format
 msgid ""
 "Another compositing manager is already running on screen %i on display \"%s"
@@ -479,11 +484,11 @@
 msgstr ""
 
 #: src/core/delete.c:141
-msgid "_Wait"
+msgid "_Force Quit"
 msgstr ""
 
 #: src/core/delete.c:141
-msgid "_Force Quit"
+msgid "_Wait"
 msgstr ""
 
 #: src/core/display.c:590
@@ -566,7 +571,7 @@
 msgid "Mutter was compiled without support for verbose mode\n"
 msgstr ""
 
-#: src/wayland/meta-wayland-tablet-pad.c:595
+#: src/wayland/meta-wayland-tablet-pad.c:563
 #, c-format
 msgid "Mode Switch: Mode %d"
 msgstr ""
@@ -577,7 +582,7 @@
 "be restarted manually next time you log in."
 msgstr ""
 
-#: src/x11/window-props.c:548
+#: src/x11/window-props.c:559
 #, c-format
 msgid "%s (on %s)"
 msgstr ""
Binary files old/mutter-3.22.2/po/zh_CN.gmo and new/mutter-3.22.3/po/zh_CN.gmo 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/po/zh_CN.po 
new/mutter-3.22.3/po/zh_CN.po
--- old/mutter-3.22.2/po/zh_CN.po       2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/po/zh_CN.po       2017-02-16 17:24:02.000000000 +0100
@@ -17,8 +17,8 @@
 "Project-Id-Version: mutter master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?";
 "product=mutter&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2016-10-27 15:28+0000\n"
-"PO-Revision-Date: 2016-10-30 02:33+0800\n"
+"POT-Creation-Date: 2017-02-03 10:06+0000\n"
+"PO-Revision-Date: 2017-01-04 21:52+0800\n"
 "Last-Translator: Mandy Wang <[email protected]>\n"
 "Language-Team: Chinese (simplified) <[email protected]>\n"
 "Language: zh_CN\n"
@@ -26,7 +26,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 1.8.11\n"
+"X-Generator: Poedit 1.8.7.1\n"
 
 #: data/50-mutter-navigation.xml:6
 msgid "Navigation"
@@ -450,38 +450,37 @@
 #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
 #. * mapping through the available outputs.
 #.
-#: src/backends/meta-input-settings.c:1847
+#: src/backends/meta-input-settings.c:1861
 msgid "Switch monitor"
 msgstr "切换显示器"
 
-#: src/backends/meta-input-settings.c:1849
-#, fuzzy
+#: src/backends/meta-input-settings.c:1863
 msgid "Show on-screen help"
 msgstr "显示在屏帮助"
 
-#: src/backends/meta-monitor-manager.c:514
+#: src/backends/meta-monitor-manager.c:515
 msgid "Built-in display"
 msgstr "内置显示器"
 
-#: src/backends/meta-monitor-manager.c:537
+#: src/backends/meta-monitor-manager.c:538
 msgid "Unknown"
 msgstr "未知"
 
-#: src/backends/meta-monitor-manager.c:539
+#: src/backends/meta-monitor-manager.c:540
 msgid "Unknown Display"
-msgstr "未知的显示器"
+msgstr "未知的 Display"
 
 #. TRANSLATORS: this is a monitor vendor name, followed by a
 #. * size in inches, like 'Dell 15"'
 #.
-#: src/backends/meta-monitor-manager.c:547
+#: src/backends/meta-monitor-manager.c:548
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
 #. This probably means that a non-WM compositor like xcompmgr is running;
 #. * we have no way to get it to exit
-#: src/compositor/compositor.c:463
+#: src/compositor/compositor.c:471
 #, c-format
 msgid ""
 "Another compositing manager is already running on screen %i on display \"%s"
@@ -534,7 +533,7 @@
 
 #: src/core/main.c:199
 msgid "X Display to use"
-msgstr "要使用的 X 显示器"
+msgstr "要使用的 X Display"
 
 #: src/core/main.c:205
 msgid "Initialize session from savefile"
@@ -589,7 +588,7 @@
 "Display \"%s\" already has a window manager; try using the --replace option "
 "to replace the current window manager."
 msgstr ""
-"显示器“%s”已经有一个窗口管理器;请尝试使用 --replace 选项替换当前的窗口管理"
+"Display“%s”已经有一个窗口管理器;请尝试使用 --replace 选项替换当前的窗口管理"
 "器。"
 
 #: src/core/screen.c:606
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/meta-input-settings-private.h 
new/mutter-3.22.3/src/backends/meta-input-settings-private.h
--- old/mutter-3.22.2/src/backends/meta-input-settings-private.h        
2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/backends/meta-input-settings-private.h        
2017-02-16 17:24:02.000000000 +0100
@@ -107,6 +107,9 @@
   void (* set_trackball_accel_profile) (MetaInputSettings          *settings,
                                         ClutterInputDevice         *device,
                                         GDesktopPointerAccelProfile profile);
+
+  gboolean (* has_two_finger_scroll) (MetaInputSettings  *settings,
+                                      ClutterInputDevice *device);
 };
 
 GType meta_input_settings_get_type (void) G_GNUC_CONST;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/backends/meta-input-settings.c 
new/mutter-3.22.3/src/backends/meta-input-settings.c
--- old/mutter-3.22.2/src/backends/meta-input-settings.c        2016-11-10 
14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/backends/meta-input-settings.c        2017-02-16 
17:24:02.000000000 +0100
@@ -83,6 +83,8 @@
 #ifdef HAVE_LIBWACOM
   WacomDeviceDatabase *wacom_db;
 #endif
+
+  GHashTable *two_finger_devices;
 };
 
 typedef void (*ConfigBoolFunc)   (MetaInputSettings  *input_settings,
@@ -148,6 +150,8 @@
     libwacom_database_destroy (priv->wacom_db);
 #endif
 
+  g_clear_pointer (&priv->two_finger_devices, g_hash_table_destroy);
+
   G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
 }
 
@@ -484,6 +488,7 @@
   MetaInputSettingsClass *input_settings_class;
   gboolean edge_scroll_enabled;
   gboolean two_finger_scroll_enabled;
+  gboolean two_finger_scroll_available;
   MetaInputSettingsPrivate *priv;
 
   if (device &&
@@ -494,9 +499,10 @@
   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
   edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, 
"edge-scrolling-enabled");
   two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, 
"two-finger-scrolling-enabled");
+  two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) > 
0;
 
   /* If both are enabled we prefer two finger. */
-  if (edge_scroll_enabled && two_finger_scroll_enabled)
+  if (edge_scroll_enabled && two_finger_scroll_enabled && 
two_finger_scroll_available)
     edge_scroll_enabled = FALSE;
 
   if (device)
@@ -679,6 +685,9 @@
   delay = g_settings_get_uint (priv->keyboard_settings, "delay");
   interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
 
+  delay = MAX (1, delay);
+  interval = MAX (1, interval);
+
   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
   input_settings_class->set_keyboard_repeat (input_settings,
                                              repeat, delay, interval);
@@ -744,7 +753,9 @@
   MetaOutput *output = NULL;
   gboolean keep_aspect;
 
-  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
+  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
     return;
 
 #ifdef HAVE_LIBWACOM
@@ -792,6 +803,8 @@
   MetaOutput *output;
 
   if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
       clutter_input_device_get_device_type (device) != 
CLUTTER_TOUCHSCREEN_DEVICE)
     return;
 
@@ -825,7 +838,9 @@
   GDesktopTabletMapping mapping;
   DeviceMappingInfo *info;
 
-  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
+  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
     return;
 
 #ifdef HAVE_LIBWACOM
@@ -866,7 +881,9 @@
   const guint32 *area;
   gsize n_elems;
 
-  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
+  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
     return;
 
 #ifdef HAVE_LIBWACOM
@@ -905,7 +922,10 @@
   MetaInputSettingsClass *input_settings_class;
   gboolean enabled;
 
-  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
+  if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
+      clutter_input_device_get_device_type (device) != CLUTTER_PAD_DEVICE)
     return;
 
 #ifdef HAVE_LIBWACOM
@@ -1399,6 +1419,23 @@
 }
 
 static void
+evaluate_two_finger_scrolling (MetaInputSettings  *input_settings,
+                               ClutterInputDevice *device)
+{
+  MetaInputSettingsClass *klass;
+  MetaInputSettingsPrivate *priv;
+
+  if (clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
+    return;
+
+  klass = META_INPUT_SETTINGS_GET_CLASS (input_settings);
+  priv = meta_input_settings_get_instance_private (input_settings);
+
+  if (klass->has_two_finger_scroll (input_settings, device))
+    g_hash_table_add (priv->two_finger_devices, device);
+}
+
+static void
 meta_input_settings_device_added (ClutterDeviceManager *device_manager,
                                   ClutterInputDevice   *device,
                                   MetaInputSettings    *input_settings)
@@ -1406,6 +1443,8 @@
   if (clutter_input_device_get_device_mode (device) == 
CLUTTER_INPUT_MODE_MASTER)
     return;
 
+  evaluate_two_finger_scrolling (input_settings, device);
+
   apply_device_settings (input_settings, device);
   check_add_mappable_device (input_settings, device);
 }
@@ -1419,6 +1458,10 @@
 
   priv = meta_input_settings_get_instance_private (input_settings);
   g_hash_table_remove (priv->mappable_devices, device);
+
+  if (g_hash_table_remove (priv->two_finger_devices, device) &&
+      g_hash_table_size (priv->two_finger_devices) == 0)
+    apply_device_settings (input_settings, NULL);
 }
 
 static void
@@ -1445,6 +1488,13 @@
 meta_input_settings_constructed (GObject *object)
 {
   MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
+  GSList *devices, *d;
+
+  devices = meta_input_settings_get_devices (input_settings, 
CLUTTER_TOUCHPAD_DEVICE);
+  for (d = devices; d; d = d->next)
+    evaluate_two_finger_scrolling (input_settings, d->data);
+
+  g_slist_free (devices);
 
   apply_device_settings (input_settings, NULL);
   update_keyboard_repeat (input_settings);
@@ -1506,6 +1556,8 @@
                  "expect tablets to misbehave");
     }
 #endif
+
+  priv->two_finger_devices = g_hash_table_new (NULL, NULL);
 }
 
 MetaInputSettings *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/backends/meta-monitor-config.c 
new/mutter-3.22.3/src/backends/meta-monitor-config.c
--- old/mutter-3.22.2/src/backends/meta-monitor-config.c        2016-10-27 
14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/backends/meta-monitor-config.c        2017-02-16 
17:24:00.000000000 +0100
@@ -454,7 +454,7 @@
       {
         if (strcmp (element_name, "configuration") == 0 && 
parser->unknown_count == 0)
           {
-            MetaConfiguration *config = g_slice_new (MetaConfiguration);
+            MetaConfiguration *config = config_new ();
 
             g_assert (parser->key_array->len == parser->output_array->len);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/backends/meta-monitor-manager.c 
new/mutter-3.22.3/src/backends/meta-monitor-manager.c
--- old/mutter-3.22.2/src/backends/meta-monitor-manager.c       2016-10-27 
14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/backends/meta-monitor-manager.c       2017-02-16 
17:24:02.000000000 +0100
@@ -135,6 +135,7 @@
           info.width_mm = output->width_mm;
           info.height_mm = output->height_mm;
           info.winsys_id = output->winsys_id;
+          info.scale = output->scale;
         }
 
       /* hack */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/native/meta-cursor-renderer-native.c 
new/mutter-3.22.3/src/backends/native/meta-cursor-renderer-native.c
--- old/mutter-3.22.2/src/backends/native/meta-cursor-renderer-native.c 
2016-10-27 14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/backends/native/meta-cursor-renderer-native.c 
2017-02-16 17:24:02.000000000 +0100
@@ -63,6 +63,7 @@
 
 struct _MetaCursorRendererNativePrivate
 {
+  gboolean hw_state_invalidated;
   gboolean has_hw_cursor;
 
   MetaCursorSprite *last_cursor;
@@ -159,8 +160,7 @@
 static void
 set_crtc_cursor (MetaCursorRendererNative *native,
                  MetaCRTC                 *crtc,
-                 MetaCursorSprite         *cursor_sprite,
-                 gboolean                  force)
+                 MetaCursorSprite         *cursor_sprite)
 {
   MetaCursorRendererNativePrivate *priv = 
meta_cursor_renderer_native_get_instance_private (native);
 
@@ -177,7 +177,7 @@
       else
         bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
 
-      if (!force && bo == crtc->cursor_renderer_private)
+      if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private)
         return;
 
       crtc->cursor_renderer_private = bo;
@@ -197,7 +197,7 @@
     }
   else
     {
-      if (force || crtc->cursor_renderer_private != NULL)
+      if (priv->hw_state_invalidated || crtc->cursor_renderer_private != NULL)
         {
           drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
           crtc->cursor_renderer_private = NULL;
@@ -207,8 +207,7 @@
 
 static void
 update_hw_cursor (MetaCursorRendererNative *native,
-                  MetaCursorSprite         *cursor_sprite,
-                  gboolean                  force)
+                  MetaCursorSprite         *cursor_sprite)
 {
   MetaCursorRendererNativePrivate *priv = 
meta_cursor_renderer_native_get_instance_private (native);
   MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
@@ -241,7 +240,7 @@
       else
         crtc_cursor = NULL;
 
-      set_crtc_cursor (native, &crtcs[i], crtc_cursor, force);
+      set_crtc_cursor (native, &crtcs[i], crtc_cursor);
 
       if (crtc_cursor)
         {
@@ -252,6 +251,8 @@
         }
     }
 
+  priv->hw_state_invalidated = FALSE;
+
   if (painted)
     meta_cursor_renderer_emit_painted (renderer, cursor_sprite);
 }
@@ -394,7 +395,7 @@
   meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
 
   priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
-  update_hw_cursor (native, cursor_sprite, FALSE);
+  update_hw_cursor (native, cursor_sprite);
   return priv->has_hw_cursor;
 }
 
@@ -648,8 +649,11 @@
 force_update_hw_cursor (MetaCursorRendererNative *native)
 {
   MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
+  MetaCursorRendererNativePrivate *priv =
+    meta_cursor_renderer_native_get_instance_private (native);
 
-  update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE);
+  priv->hw_state_invalidated = TRUE;
+  update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer));
 }
 
 static void
@@ -670,6 +674,8 @@
   g_signal_connect_object (monitors, "monitors-changed",
                            G_CALLBACK (on_monitors_changed), native, 0);
 
+  priv->hw_state_invalidated = TRUE;
+
 #if defined(CLUTTER_WINDOWING_EGL)
   if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/native/meta-input-settings-native.c 
new/mutter-3.22.3/src/backends/native/meta-input-settings-native.c
--- old/mutter-3.22.2/src/backends/native/meta-input-settings-native.c  
2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/backends/native/meta-input-settings-native.c  
2017-02-16 17:24:02.000000000 +0100
@@ -189,6 +189,19 @@
   device_set_scroll_method (libinput_device, current | method);
 }
 
+static gboolean
+meta_input_settings_native_has_two_finger_scroll (MetaInputSettings  *settings,
+                                                  ClutterInputDevice *device)
+{
+  struct libinput_device *libinput_device;
+
+  libinput_device = clutter_evdev_input_device_get_libinput_device (device);
+  if (!libinput_device)
+    return FALSE;
+
+  return libinput_device_config_scroll_get_methods (libinput_device) & 
LIBINPUT_CONFIG_SCROLL_2FG;
+}
+
 static void
 meta_input_settings_native_set_scroll_button (MetaInputSettings  *settings,
                                               ClutterInputDevice *device,
@@ -418,6 +431,8 @@
 
   input_settings_class->set_mouse_accel_profile = 
meta_input_settings_native_set_mouse_accel_profile;
   input_settings_class->set_trackball_accel_profile = 
meta_input_settings_native_set_trackball_accel_profile;
+
+  input_settings_class->has_two_finger_scroll = 
meta_input_settings_native_has_two_finger_scroll;
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/native/meta-monitor-manager-kms.c 
new/mutter-3.22.3/src/backends/native/meta-monitor-manager-kms.c
--- old/mutter-3.22.2/src/backends/native/meta-monitor-manager-kms.c    
2016-10-27 14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/backends/native/meta-monitor-manager-kms.c    
2017-02-16 17:24:02.000000000 +0100
@@ -475,18 +475,31 @@
 static int
 compute_scale (MetaOutput *output)
 {
-  int scale = 1;
+  int scale = 1, width, height;
 
   if (!output->crtc)
     goto out;
 
+  width = output->crtc->rect.width;
+  height = output->crtc->rect.height;
+
+  /* Swap values on rotated transforms, so pixel and mm sizes
+   * from the same axes is compared.
+   */
+  if (meta_monitor_transform_is_rotated (output->crtc->transform))
+    {
+      int tmp = width;
+      width = height;
+      height = tmp;
+    }
+
   /* Scaling makes no sense */
-  if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
+  if (height < HIDPI_MIN_HEIGHT)
     goto out;
 
   /* 4K TV */
   if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
-      output->crtc->rect.width >= SMALLEST_4K_WIDTH)
+      width >= SMALLEST_4K_WIDTH)
     goto out;
 
   /* Somebody encoded the aspect ratio (16/9 or 16/10)
@@ -500,8 +513,9 @@
   if (output->width_mm > 0 && output->height_mm > 0)
     {
       double dpi_x, dpi_y;
-      dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
-      dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
+
+      dpi_x = (double)width / (output->width_mm / 25.4);
+      dpi_y = (double)height / (output->height_mm / 25.4);
       /* We don't completely trust these values so both
          must be high, and never pick higher ratio than
          2 automatically */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/native/meta-renderer-native.c 
new/mutter-3.22.3/src/backends/native/meta-renderer-native.c
--- old/mutter-3.22.2/src/backends/native/meta-renderer-native.c        
2016-10-27 14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/backends/native/meta-renderer-native.c        
2017-02-16 17:24:02.000000000 +0100
@@ -73,6 +73,9 @@
 
   gboolean pending_set_crtc;
 
+  int64_t pending_queue_swap_notify_frame_count;
+  int64_t pending_swap_notify_frame_count;
+
   MetaRendererView *view;
   int pending_flips;
 } MetaOnscreenNative;
@@ -124,16 +127,19 @@
 
       if (onscreen_native->pending_swap_notify)
         {
-          CoglFrameInfo *info =
-            g_queue_pop_head (&onscreen->pending_frame_infos);
+          CoglFrameInfo *info;
 
-          _cogl_onscreen_notify_frame_sync (onscreen, info);
-          _cogl_onscreen_notify_complete (onscreen, info);
+          while ((info = g_queue_peek_head (&onscreen->pending_frame_infos)) &&
+                 info->global_frame_counter <= 
onscreen_native->pending_swap_notify_frame_count)
+            {
+              _cogl_onscreen_notify_frame_sync (onscreen, info);
+              _cogl_onscreen_notify_complete (onscreen, info);
+              cogl_object_unref (info);
+              g_queue_pop_head (&onscreen->pending_frame_infos);
+            }
 
           onscreen_native->pending_swap_notify = FALSE;
           cogl_object_unref (onscreen);
-
-          cogl_object_unref (info);
         }
     }
 }
@@ -200,6 +206,9 @@
   CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
   MetaRendererNative *renderer_native = egl_renderer->platform;
 
+  onscreen_native->pending_swap_notify_frame_count =
+    onscreen_native->pending_queue_swap_notify_frame_count;
+
   /* We only want to notify that the swap is complete when the
    * application calls cogl_context_dispatch so instead of
    * immediately notifying we queue an idle callback */
@@ -222,6 +231,39 @@
   onscreen_native->pending_swap_notify = TRUE;
 }
 
+static EGLDisplay
+meta_egl_get_display (void *native)
+{
+  EGLDisplay dpy = NULL;
+  const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
+
+  if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
+    {
+      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
+       (void *) eglGetProcAddress ("eglGetPlatformDisplay");
+
+      if (get_platform_display)
+       dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
+
+      if (dpy)
+       return dpy;
+    }
+
+  if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
+    {
+      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
+       (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
+
+      if (get_platform_display)
+       dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
+
+      if (dpy)
+       return dpy;
+    }
+
+  return eglGetDisplay ((EGLNativeDisplayType) native);
+}
+
 static CoglBool
 meta_renderer_native_connect (CoglRenderer *cogl_renderer,
                               CoglError   **error)
@@ -246,8 +288,7 @@
       goto fail;
     }
 
-  egl_renderer->edpy =
-    eglGetDisplay ((EGLNativeDisplayType) renderer_native->gbm);
+  egl_renderer->edpy = meta_egl_get_display (renderer_native->gbm);
   if (egl_renderer->edpy == EGL_NO_DISPLAY)
     {
       _cogl_set_error (error, COGL_WINSYS_ERROR,
@@ -640,6 +681,7 @@
       onscreen_native->pending_set_crtc = FALSE;
     }
 
+  onscreen_native->pending_queue_swap_notify_frame_count = 
renderer_native->frame_counter;
   meta_onscreen_native_flip_crtcs (onscreen);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/backends/x11/meta-input-settings-x11.c 
new/mutter-3.22.3/src/backends/x11/meta-input-settings-x11.c
--- old/mutter-3.22.2/src/backends/x11/meta-input-settings-x11.c        
2016-11-10 14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/backends/x11/meta-input-settings-x11.c        
2017-02-16 17:24:02.000000000 +0100
@@ -222,19 +222,27 @@
                                          gboolean                      
edge_scroll_enabled)
 {
   guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The 
last value is unused */
-  guchar *current;
+  guchar *current = NULL;
+  guchar *available = NULL;
+
+  available = get_property (device, "libinput Scroll Methods Available",
+                            XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
+  if (!available || !available[SCROLL_METHOD_FIELD_EDGE])
+    goto out;
 
   current = get_property (device, "libinput Scroll Method Enabled",
                           XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
   if (!current)
-    return;
+    goto out;
 
   memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
 
   values[SCROLL_METHOD_FIELD_EDGE] = !!edge_scroll_enabled;
   change_property (device, "libinput Scroll Method Enabled",
                    XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
+ out:
   meta_XFree (current);
+  meta_XFree (available);
 }
 
 static void
@@ -243,19 +251,43 @@
                                                gboolean                      
two_finger_scroll_enabled)
 {
   guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The 
last value is unused */
-  guchar *current;
+  guchar *current = NULL;
+  guchar *available = NULL;
+
+  available = get_property (device, "libinput Scroll Methods Available",
+                            XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
+  if (!available || !available[SCROLL_METHOD_FIELD_2FG])
+    goto out;
 
   current = get_property (device, "libinput Scroll Method Enabled",
                           XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
   if (!current)
-    return;
+    goto out;
 
   memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
 
   values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
   change_property (device, "libinput Scroll Method Enabled",
                    XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
+ out:
   meta_XFree (current);
+  meta_XFree (available);
+}
+
+static gboolean
+meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings  *settings,
+                                               ClutterInputDevice *device)
+{
+  guchar *available = NULL;
+  gboolean has_two_finger = TRUE;
+
+  available = get_property (device, "libinput Scroll Methods Available",
+                            XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
+  if (!available || !available[SCROLL_METHOD_FIELD_2FG])
+    has_two_finger = FALSE;
+
+  meta_XFree (available);
+  return has_two_finger;
 }
 
 static void
@@ -527,6 +559,8 @@
 
   input_settings_class->set_mouse_accel_profile = 
meta_input_settings_x11_set_mouse_accel_profile;
   input_settings_class->set_trackball_accel_profile = 
meta_input_settings_x11_set_trackball_accel_profile;
+
+  input_settings_class->has_two_finger_scroll = 
meta_input_settings_x11_has_two_finger_scroll;
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/compositor/meta-window-actor.c 
new/mutter-3.22.3/src/compositor/meta-window-actor.c
--- old/mutter-3.22.2/src/compositor/meta-window-actor.c        2016-11-10 
14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/compositor/meta-window-actor.c        2017-02-16 
17:24:02.000000000 +0100
@@ -1129,6 +1129,7 @@
                                     MetaPluginEffect  event)
 {
   MetaWindowActorPrivate *priv   = self->priv;
+  gboolean inconsistent = FALSE;
 
   /* NB: Keep in mind that when effects get completed it possible
    * that the corresponding MetaWindow may have be been destroyed.
@@ -1145,6 +1146,7 @@
        {
          g_warning ("Error in minimize accounting.");
          priv->minimize_in_progress = 0;
+          inconsistent = TRUE;
        }
     }
     break;
@@ -1155,6 +1157,7 @@
        {
          g_warning ("Error in unminimize accounting.");
          priv->unminimize_in_progress = 0;
+         inconsistent = TRUE;
        }
     }
     break;
@@ -1169,6 +1172,7 @@
       {
        g_warning ("Error in map accounting.");
        priv->map_in_progress = 0;
+        inconsistent = TRUE;
       }
     break;
   case META_PLUGIN_DESTROY:
@@ -1178,6 +1182,7 @@
       {
        g_warning ("Error in destroy accounting.");
        priv->destroy_in_progress = 0;
+        inconsistent = TRUE;
       }
     break;
   case META_PLUGIN_SIZE_CHANGE:
@@ -1186,6 +1191,7 @@
       {
        g_warning ("Error in size change accounting.");
        priv->size_change_in_progress = 0;
+        inconsistent = TRUE;
       }
     break;
   case META_PLUGIN_SWITCH_WORKSPACE:
@@ -1193,7 +1199,7 @@
     break;
   }
 
-  if (is_freeze_thaw_effect (event))
+  if (is_freeze_thaw_effect (event) && !inconsistent)
     meta_window_actor_thaw (self);
 
   if (!meta_window_actor_effect_in_progress (self))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/core/constraints.c 
new/mutter-3.22.3/src/core/constraints.c
--- old/mutter-3.22.2/src/core/constraints.c    2016-10-27 14:27:30.000000000 
+0200
+++ new/mutter-3.22.3/src/core/constraints.c    2017-02-16 17:24:00.000000000 
+0100
@@ -784,10 +784,6 @@
   if (!placement_rule)
     return TRUE;
 
-  if (!meta_rectangle_could_fit_rect (&info->work_area_monitor,
-                                      &info->current))
-    return TRUE;
-
   meta_rectangle_intersect (&info->current, &info->work_area_monitor,
                             &intersection);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/core/keybindings.c 
new/mutter-3.22.3/src/core/keybindings.c
--- old/mutter-3.22.2/src/core/keybindings.c    2016-10-19 16:54:40.000000000 
+0200
+++ new/mutter-3.22.3/src/core/keybindings.c    2017-02-16 17:24:02.000000000 
+0100
@@ -3205,7 +3205,7 @@
     {
       MetaRectangle tmp, win_rect, above_rect;
 
-      if (above->mapped)
+      if (above->mapped && meta_window_should_be_showing (above))
         {
           meta_window_get_frame_rect (window, &win_rect);
           meta_window_get_frame_rect (above, &above_rect);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-wayland-keyboard.c 
new/mutter-3.22.3/src/wayland/meta-wayland-keyboard.c
--- old/mutter-3.22.2/src/wayland/meta-wayland-keyboard.c       2016-10-27 
14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-wayland-keyboard.c       2017-02-16 
17:24:02.000000000 +0100
@@ -514,7 +514,11 @@
           interval = g_settings_get_uint (keyboard->settings, 
"repeat-interval");
           /* Our setting is in the milliseconds between keys. "rate" is the 
number
            * of keys per second. */
-          rate = (1000 / interval);
+          if (interval > 0)
+            rate = (1000 / interval);
+          else
+            rate = 0;
+
           delay = g_settings_get_uint (keyboard->settings, "delay");
         }
       else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/wayland/meta-wayland-tablet-pad-ring.c 
new/mutter-3.22.3/src/wayland/meta-wayland-tablet-pad-ring.c
--- old/mutter-3.22.2/src/wayland/meta-wayland-tablet-pad-ring.c        
2016-10-19 16:54:40.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-wayland-tablet-pad-ring.c        
2017-02-16 17:24:02.000000000 +0100
@@ -62,7 +62,6 @@
 
   wl_resource_for_each_safe (resource, next, &ring->resource_list)
     {
-      zwp_tablet_tool_v2_send_removed (resource);
       wl_list_remove (wl_resource_get_link (resource));
       wl_list_init (wl_resource_get_link (resource));
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.22.2/src/wayland/meta-wayland-tablet-pad-strip.c 
new/mutter-3.22.3/src/wayland/meta-wayland-tablet-pad-strip.c
--- old/mutter-3.22.2/src/wayland/meta-wayland-tablet-pad-strip.c       
2016-10-19 16:54:40.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-wayland-tablet-pad-strip.c       
2017-02-16 17:24:02.000000000 +0100
@@ -62,7 +62,6 @@
 
   wl_resource_for_each_safe (resource, next, &strip->resource_list)
     {
-      zwp_tablet_tool_v2_send_removed (resource);
       wl_list_remove (wl_resource_get_link (resource));
       wl_list_init (wl_resource_get_link (resource));
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-wayland-tablet-tool.c 
new/mutter-3.22.3/src/wayland/meta-wayland-tablet-tool.c
--- old/mutter-3.22.2/src/wayland/meta-wayland-tablet-tool.c    2016-11-10 
14:53:11.000000000 +0100
+++ new/mutter-3.22.3/src/wayland/meta-wayland-tablet-tool.c    2017-02-16 
18:11:49.000000000 +0100
@@ -98,7 +98,7 @@
         cursor = NULL;
     }
   else if (tool->current_tablet)
-    cursor = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
+    cursor = tool->default_sprite;
   else
     cursor = NULL;
 
@@ -380,6 +380,22 @@
   meta_wayland_tablet_tool_set_cursor_surface (tool, NULL);
 }
 
+static void
+tool_cursor_prepare_at (MetaCursorSprite      *cursor_sprite,
+                        int                    x,
+                        int                    y,
+                        MetaWaylandTabletTool *tool)
+{
+  MetaDisplay *display = meta_get_display ();
+  const MetaMonitorInfo *monitor;
+
+  monitor = meta_screen_get_monitor_for_point (display->screen, x, y);
+
+  /* Reload the cursor texture if the scale has changed. */
+  if (monitor)
+    meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale);
+}
+
 MetaWaylandTabletTool *
 meta_wayland_tablet_tool_new (MetaWaylandTabletSeat  *seat,
                               ClutterInputDevice     *device,
@@ -397,6 +413,11 @@
   tool->focus_surface_destroy_listener.notify = 
tablet_tool_handle_focus_surface_destroy;
   tool->cursor_surface_destroy_listener.notify = 
tablet_tool_handle_cursor_surface_destroy;
 
+  tool->default_sprite = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
+  tool->prepare_at_signal_id =
+    g_signal_connect (tool->default_sprite, "prepare-at",
+                      G_CALLBACK (tool_cursor_prepare_at), tool);
+
   return tool;
 }
 
@@ -416,6 +437,9 @@
       wl_list_init (wl_resource_get_link (resource));
     }
 
+  g_signal_handler_disconnect (tool->default_sprite, 
tool->prepare_at_signal_id);
+  g_object_unref (tool->default_sprite);
+
   g_slice_free (MetaWaylandTabletTool, tool);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-wayland-tablet-tool.h 
new/mutter-3.22.3/src/wayland/meta-wayland-tablet-tool.h
--- old/mutter-3.22.2/src/wayland/meta-wayland-tablet-tool.h    2016-08-30 
00:17:55.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-wayland-tablet-tool.h    2017-02-16 
17:24:02.000000000 +0100
@@ -43,6 +43,8 @@
   MetaWaylandSurface *cursor_surface;
   struct wl_listener cursor_surface_destroy_listener;
   MetaCursorRenderer *cursor_renderer;
+  MetaCursorSprite *default_sprite;
+  guint prepare_at_signal_id;
 
   MetaWaylandSurface *current;
   guint32 pressed_buttons;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-wayland-xdg-shell.c 
new/mutter-3.22.3/src/wayland/meta-wayland-xdg-shell.c
--- old/mutter-3.22.2/src/wayland/meta-wayland-xdg-shell.c      2016-10-27 
14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-wayland-xdg-shell.c      2017-02-16 
17:24:02.000000000 +0100
@@ -227,13 +227,15 @@
 {
   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
+  int monitor_scale;
 
   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, 
NULL))
     return;
 
+  monitor_scale = surface->window->monitor->scale;
   meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
-                         surface->window->buffer_rect.x + x,
-                         surface->window->buffer_rect.y + y);
+                         surface->window->buffer_rect.x + (x * monitor_scale),
+                         surface->window->buffer_rect.y + (y * monitor_scale));
 }
 
 static void
@@ -839,6 +841,17 @@
 
       xdg_popup->popup = popup;
     }
+  else
+    {
+      /* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
+       * is pretty undefined. Same applies for subsurfaces, but in practice,
+       * subsurfaces never receive keyboard focus, so it makes sense to
+       * do the same for non-grabbing popups.
+       *
+       * See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
+       */
+      window->input = FALSE;
+    }
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-window-wayland.c 
new/mutter-3.22.3/src/wayland/meta-window-wayland.c
--- old/mutter-3.22.2/src/wayland/meta-window-wayland.c 2016-10-30 
21:27:09.000000000 +0100
+++ new/mutter-3.22.3/src/wayland/meta-window-wayland.c 2017-02-16 
17:24:02.000000000 +0100
@@ -117,24 +117,11 @@
 meta_window_wayland_focus (MetaWindow *window,
                            guint32     timestamp)
 {
-  MetaWaylandSurface *surface = window->surface;
-  MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
-     META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
-
-  /* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
-   * is pretty undefined. Same applies for subsurfaces, but in practice,
-   * subsurfaces never receive keyboard focus, so it makes sense to
-   * do the same for non-grabbing popups.
-   *
-   * See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
-   */
-  if (META_IS_WAYLAND_XDG_POPUP (shell_surface_role))
-    return;
-
-  meta_display_set_input_focus_window (window->display,
-                                       window,
-                                       FALSE,
-                                       timestamp);
+  if (window->input)
+    meta_display_set_input_focus_window (window->display,
+                                         window,
+                                         FALSE,
+                                         timestamp);
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.22.2/src/wayland/meta-xwayland-selection.c 
new/mutter-3.22.3/src/wayland/meta-xwayland-selection.c
--- old/mutter-3.22.2/src/wayland/meta-xwayland-selection.c     2016-10-27 
14:27:30.000000000 +0200
+++ new/mutter-3.22.3/src/wayland/meta-xwayland-selection.c     2017-02-16 
17:24:02.000000000 +0100
@@ -546,6 +546,8 @@
 wayland_selection_data_new (XSelectionRequestEvent *request_event,
                             MetaWaylandCompositor  *compositor)
 {
+  MetaDisplay *display = meta_get_display ();
+  MetaScreen *screen = display->screen;
   MetaWaylandDataDevice *data_device;
   MetaWaylandDataSource *wayland_source;
   MetaSelectionBridge *selection;
@@ -595,7 +597,8 @@
   data->window = meta_display_lookup_x_window (meta_get_display (),
                                                data->request_event.requestor);
 
-  if (!data->window)
+  /* Do *not* change the event mask on the root window, bugger! */
+  if (!data->window && data->request_event.requestor != screen->xroot)
     {
       /* Not a managed window, set the PropertyChangeMask
        * for INCR deletion notifications.
@@ -629,10 +632,12 @@
 static void
 wayland_selection_data_free (WaylandSelectionData *data)
 {
-  if (!data->window)
-    {
-      MetaDisplay *display = meta_get_display ();
+  MetaDisplay *display = meta_get_display ();
+  MetaScreen *screen = display->screen;
 
+  /* Do *not* change the event mask on the root window, bugger! */
+  if (!data->window && data->request_event.requestor != screen->xroot)
+    {
       meta_error_trap_push (display);
       XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
                     data->request_event.requestor, NoEventMask);


Reply via email to