Hello community,

here is the log from the commit of package mutter for openSUSE:Factory checked 
in at 2018-06-02 11:55:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mutter (Old)
 and      /work/SRC/openSUSE:Factory/.mutter.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mutter"

Sat Jun  2 11:55:29 2018 rev:128 rq:612870 version:3.28.2+20180526.abc7ad8e9

Changes:
--------
--- /work/SRC/openSUSE:Factory/mutter/mutter.changes    2018-05-22 
16:59:39.217265670 +0200
+++ /work/SRC/openSUSE:Factory/.mutter.new/mutter.changes       2018-06-02 
11:55:34.532457562 +0200
@@ -2 +2,16 @@
-Wed May 09 16:00:40 UTC 2018 - [email protected]
+Mon May 28 17:34:20 UTC 2018 - [email protected]
+
+- Update to version 3.28.2+20180526.abc7ad8e9:
+  + wayland: Don't reset input focus on text commit.
+  + frames: Allow for unknown mouse buttons.
+  + wayland: update enter/leave output after effects.
+  + window-actor: add new signal "effects-completed".
+  + wayland: Compare geometries after chaining up.
+  + frames: Handle touch events.
+  + frames: Make 1st button/motion handlers take generic events.
+  + clutter/evdev: Don't ignore CAPS lock as modifier.
+  + clutter/evdev: ignore injected events from IM.
+  + wayland: Use cursor position in logical monitor.
+
+-------------------------------------------------------------------
+Wed May 09 16:00:40 UTC 2018 - [email protected]
@@ -49,0 +65,7 @@
+
+-------------------------------------------------------------------
+Thu Apr  5 19:30:24 UTC 2018 - [email protected]
+
+- Pass --enable-gles2=yes to configure, build gles2 support in
+  cogl, disabled by default from upstream. We already had the
+  needed pkgconfig(glesv2) BuildRequires in place.

Old:
----
  mutter-3.28.2+20180507.41303bc01.tar.xz

New:
----
  mutter-3.28.2+20180526.abc7ad8e9.tar.xz

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

Other differences:
------------------
++++++ mutter.spec ++++++
--- /var/tmp/diff_new_pack.fGaniO/_old  2018-06-02 11:55:36.228395355 +0200
+++ /var/tmp/diff_new_pack.fGaniO/_new  2018-06-02 11:55:36.232395208 +0200
@@ -19,7 +19,7 @@
 %define mutter_major 2
 %define mutter_minor 0
 Name:           mutter
-Version:        3.28.2+20180507.41303bc01
+Version:        3.28.2+20180526.abc7ad8e9
 Release:        0
 Summary:        Window and compositing manager based on Clutter
 License:        GPL-2.0-or-later
@@ -40,8 +40,6 @@
 Patch1001:      mutter-SLE-relax-some-constraints-on-CSD-windows.patch
 # PATCH-FIX-UPSTREAM mutter-SLE-bsc984738-grab-display.patch bsc#984738 
bgo#769387 [email protected] -- Revert a upstream commit to avoid X11 race 
condition that results in wrong dialog sizes.
 Patch1002:      mutter-SLE-bsc984738-grab-display.patch
-# Not available in openSUSE yet
-# BuildRequires:  pkgconfig(libpipewire-0.1)
 BuildRequires:  Mesa-libGLESv3-devel
 BuildRequires:  fdupes
 BuildRequires:  intltool
@@ -155,13 +153,13 @@
 %endif
 
 %build
-# FIXME add --enable-remote-desktop when libpipewire-0.1 is available
 NOCONFIGURE=1 ./autogen.sh
 %configure \
        --enable-wayland \
        --enable-native-backend \
        --disable-static \
        --enable-egl-device \
+       --enable-gles2=yes \
        --enable-compile-warnings=maximum \
        %{nil}
 %make_build
@@ -185,6 +183,7 @@
 
 # These so files are not split out since they are private to mutter
 %{_libdir}/mutter/libmutter-clutter-%{mutter_major}.so
+%{_libdir}/mutter/libmutter-cogl-gles2-%{mutter_major}.so
 %{_libdir}/mutter/libmutter-cogl-pango-%{mutter_major}.so
 %{_libdir}/mutter/libmutter-cogl-path-%{mutter_major}.so
 %{_libdir}/mutter/libmutter-cogl-%{mutter_major}.so
@@ -231,6 +230,7 @@
 %{_libdir}/pkgconfig/mutter-clutter-%{mutter_major}.pc
 %{_libdir}/pkgconfig/mutter-clutter-x11-%{mutter_major}.pc
 %{_libdir}/pkgconfig/mutter-cogl-%{mutter_major}.pc
+%{_libdir}/pkgconfig/mutter-cogl-gles2-%{mutter_major}.pc
 %{_libdir}/pkgconfig/mutter-cogl-pango-%{mutter_major}.pc
 %{_libdir}/pkgconfig/mutter-cogl-path-%{mutter_major}.pc
 

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.fGaniO/_old  2018-06-02 11:55:36.280393447 +0200
+++ /var/tmp/diff_new_pack.fGaniO/_new  2018-06-02 11:55:36.280393447 +0200
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.gnome.org/GNOME/mutter.git</param>
-              <param 
name="changesrevision">41303bc01be873e684f11a3407aa556af2922426</param></service></servicedata>
\ No newline at end of file
+              <param 
name="changesrevision">abc7ad8e9f67a720516fb739c5dfe4b49748d423</param></service></servicedata>
\ No newline at end of file

++++++ mutter-3.28.2+20180507.41303bc01.tar.xz -> 
mutter-3.28.2+20180526.abc7ad8e9.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/clutter/clutter/evdev/clutter-input-device-evdev.c
 
new/mutter-3.28.2+20180526.abc7ad8e9/clutter/clutter/evdev/clutter-input-device-evdev.c
--- 
old/mutter-3.28.2+20180507.41303bc01/clutter/clutter/evdev/clutter-input-device-evdev.c
     2018-05-07 22:29:42.000000000 +0200
+++ 
new/mutter-3.28.2+20180526.abc7ad8e9/clutter/clutter/evdev/clutter-input-device-evdev.c
     2018-05-26 15:26:09.000000000 +0200
@@ -433,6 +433,8 @@
     case XKB_KEY_Super_R:
     case XKB_KEY_Hyper_L:
     case XKB_KEY_Hyper_R:
+    case XKB_KEY_Caps_Lock:
+    case XKB_KEY_Shift_Lock:
       return TRUE;
     default:
       return FALSE;
@@ -584,6 +586,12 @@
     }
 
   depressed_mods = xkb_state_serialize_mods (seat->xkb, 
XKB_STATE_MODS_DEPRESSED);
+  /* Ignore the lock modifier mask, that one cannot be sticky, yet the
+   * CAPS_LOCK key itself counts as a modifier as it might be remapped
+   * to some other modifier which can be sticky.
+   */
+  depressed_mods &= ~CLUTTER_LOCK_MASK;
+
   new_latched_mask = device->stickykeys_latched_mask;
   new_locked_mask = device->stickykeys_locked_mask;
 
@@ -1122,6 +1130,10 @@
 {
   ClutterInputDeviceEvdev *device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 
+  /* Ignore key events injected from IM */
+  if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD)
+    goto emit_event;
+
   if (!device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED)
     goto emit_event;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/backends/meta-cursor-renderer.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/backends/meta-cursor-renderer.c
--- old/mutter-3.28.2+20180507.41303bc01/src/backends/meta-cursor-renderer.c    
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/backends/meta-cursor-renderer.c    
2018-05-26 15:26:09.000000000 +0200
@@ -264,6 +264,18 @@
   update_cursor (renderer, priv->displayed_cursor);
 }
 
+ClutterPoint
+meta_cursor_renderer_get_position (MetaCursorRenderer *renderer)
+{
+  MetaCursorRendererPrivate *priv =
+    meta_cursor_renderer_get_instance_private (renderer);
+
+  return (ClutterPoint) {
+    .x = priv->current_x,
+    .y = priv->current_y
+  };
+}
+
 MetaCursorSprite *
 meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/backends/meta-cursor-renderer.h 
new/mutter-3.28.2+20180526.abc7ad8e9/src/backends/meta-cursor-renderer.h
--- old/mutter-3.28.2+20180507.41303bc01/src/backends/meta-cursor-renderer.h    
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/backends/meta-cursor-renderer.h    
2018-05-26 15:26:09.000000000 +0200
@@ -62,6 +62,7 @@
 void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
                                         float               x,
                                         float               y);
+ClutterPoint meta_cursor_renderer_get_position (MetaCursorRenderer *renderer);
 void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
 
 MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer 
*renderer);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/compositor/meta-window-actor-private.h 
new/mutter-3.28.2+20180526.abc7ad8e9/src/compositor/meta-window-actor-private.h
--- 
old/mutter-3.28.2+20180507.41303bc01/src/compositor/meta-window-actor-private.h 
    2018-05-07 22:29:42.000000000 +0200
+++ 
new/mutter-3.28.2+20180526.abc7ad8e9/src/compositor/meta-window-actor-private.h 
    2018-05-26 15:26:09.000000000 +0200
@@ -58,5 +58,6 @@
 
 MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
 void meta_window_actor_update_surface (MetaWindowActor *self);
+MetaWindowActor *meta_window_actor_from_window (MetaWindow *window);
 
 #endif /* META_WINDOW_ACTOR_PRIVATE_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/compositor/meta-window-actor.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/compositor/meta-window-actor.c
--- old/mutter-3.28.2+20180507.41303bc01/src/compositor/meta-window-actor.c     
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/compositor/meta-window-actor.c     
2018-05-26 15:26:09.000000000 +0200
@@ -142,6 +142,8 @@
 enum
 {
   FIRST_FRAME,
+  EFFECTS_COMPLETED,
+
   LAST_SIGNAL
 };
 
@@ -238,6 +240,21 @@
                   NULL, NULL, NULL,
                   G_TYPE_NONE, 0);
 
+  /**
+   * MetaWindowActor::effects-completed:
+   * @actor: the #MetaWindowActor instance
+   *
+   * The ::effects-completed signal will be emitted once all pending compositor
+   * effects are completed.
+   */
+  signals[EFFECTS_COMPLETED] =
+    g_signal_new ("effects-completed",
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE, 0);
+
   pspec = g_param_spec_object ("meta-window",
                                "MetaWindow",
                                "The displayed MetaWindow",
@@ -1131,6 +1148,7 @@
       return;
     }
 
+  g_signal_emit (self, signals[EFFECTS_COMPLETED], 0);
   meta_window_actor_sync_visibility (self);
   meta_window_actor_sync_actor_geometry (self, FALSE);
 }
@@ -2157,3 +2175,9 @@
 
   meta_window_actor_set_updates_frozen (self, meta_window_updates_are_frozen 
(window));
 }
+
+MetaWindowActor *
+meta_window_actor_from_window (MetaWindow *window)
+{
+  return META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.28.2+20180507.41303bc01/src/ui/frames.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/ui/frames.c
--- old/mutter-3.28.2+20180507.41303bc01/src/ui/frames.c        2018-05-07 
22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/ui/frames.c        2018-05-26 
15:26:09.000000000 +0200
@@ -71,6 +71,14 @@
 
 G_DEFINE_TYPE (MetaFrames, meta_frames, GTK_TYPE_WINDOW);
 
+enum {
+  META_ACTION_CLICK,
+  META_ACTION_RIGHT_CLICK,
+  META_ACTION_MIDDLE_CLICK,
+  META_ACTION_DOUBLE_CLICK,
+  META_ACTION_IGNORE
+};
+
 static GObject *
 meta_frames_constructor (GType                  gtype,
                          guint                  n_properties,
@@ -742,17 +750,25 @@
 }
 
 static gboolean
-meta_frame_titlebar_event (MetaUIFrame *frame,
-                           ClutterButtonEvent *event,
-                           int action)
+meta_frame_titlebar_event (MetaUIFrame        *frame,
+                           const ClutterEvent *event,
+                           int                 action)
 {
   MetaFrameFlags flags;
   Display *display;
+  uint32_t evtime;
+  float x, y;
+
+  g_assert (event->type == CLUTTER_BUTTON_PRESS ||
+            event->type == CLUTTER_TOUCH_BEGIN);
 
   display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
 
   flags = meta_frame_get_flags (frame->meta_window->frame);
 
+  evtime = clutter_event_get_time (event);
+  clutter_event_get_coords (event, &x, &y);
+
   switch (action)
     {
     case G_DESKTOP_TITLEBAR_ACTION_TOGGLE_SHADE:
@@ -760,9 +776,9 @@
         if (flags & META_FRAME_ALLOWS_SHADE)
           {
             if (flags & META_FRAME_SHADED)
-              meta_window_unshade (frame->meta_window, event->time);
+              meta_window_unshade (frame->meta_window, evtime);
             else
-              meta_window_shade (frame->meta_window, event->time);
+              meta_window_shade (frame->meta_window, evtime);
           }
       }
       break;
@@ -808,16 +824,14 @@
     case G_DESKTOP_TITLEBAR_ACTION_LOWER:
       meta_core_user_lower_and_unfocus (display,
                                         frame->xwindow,
-                                        event->time);
+                                        evtime);
       break;
 
     case G_DESKTOP_TITLEBAR_ACTION_MENU:
       meta_core_show_window_menu (display,
                                   frame->xwindow,
                                   META_WINDOW_MENU_WM,
-                                  event->x,
-                                  event->y,
-                                  event->time);
+                                  x, y, evtime);
       break;
     }
 
@@ -825,8 +839,8 @@
 }
 
 static gboolean
-meta_frame_double_click_event (MetaUIFrame  *frame,
-                               ClutterButtonEvent *event)
+meta_frame_double_click_event (MetaUIFrame        *frame,
+                               const ClutterEvent *event)
 {
   int action = meta_prefs_get_action_double_click_titlebar ();
 
@@ -839,7 +853,8 @@
 {
   int action = meta_prefs_get_action_middle_click_titlebar();
 
-  return meta_frame_titlebar_event (frame, event, action);
+  return meta_frame_titlebar_event (frame, (const ClutterEvent *) event,
+                                    action);
 }
 
 static gboolean
@@ -848,7 +863,8 @@
 {
   int action = meta_prefs_get_action_right_click_titlebar();
 
-  return meta_frame_titlebar_event (frame, event, action);
+  return meta_frame_titlebar_event (frame, (const ClutterEvent *) event,
+                                    action);
 }
 
 static gboolean
@@ -879,6 +895,8 @@
       frames->grab_x = grab_x;
       frames->grab_y = grab_y;
     }
+  else
+    frames->grab_touch = NULL;
 
   return ret;
 }
@@ -889,6 +907,7 @@
 {
   Display *display;
   MetaGrabOp op;
+  gboolean ret;
 
   if (frames->current_grab_op == META_GRAB_OP_NONE)
     return TRUE;
@@ -897,16 +916,20 @@
   frames->current_grab_op = META_GRAB_OP_NONE;
   display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
 
-  return meta_core_begin_grab_op (display,
-                                  frames->grab_frame->xwindow,
-                                  op,
-                                  FALSE,
-                                  TRUE,
-                                  frames->grab_frame->grab_button,
-                                  0,
-                                  time,
-                                  frames->grab_x,
-                                  frames->grab_y);
+  ret = meta_core_begin_grab_op (display,
+                                 frames->grab_frame->xwindow,
+                                 op,
+                                 FALSE,
+                                 TRUE,
+                                 frames->grab_frame->grab_button,
+                                 0,
+                                 time,
+                                 frames->grab_x,
+                                 frames->grab_y);
+  if (ret)
+    frames->grab_touch = NULL;
+
+  return ret;
 }
 
 static MetaGrabOp
@@ -935,12 +958,65 @@
     }
 }
 
+static guint
+get_action (const ClutterEvent *event)
+{
+  if (event->type == CLUTTER_BUTTON_PRESS ||
+      event->type == CLUTTER_BUTTON_RELEASE)
+    {
+      switch (event->button.button)
+        {
+        case CLUTTER_BUTTON_PRIMARY:
+          if (clutter_event_get_click_count (event) == 2)
+            return META_ACTION_DOUBLE_CLICK;
+          else
+            return META_ACTION_CLICK;
+        case CLUTTER_BUTTON_SECONDARY:
+          return META_ACTION_RIGHT_CLICK;
+        case CLUTTER_BUTTON_MIDDLE:
+          return META_ACTION_MIDDLE_CLICK;
+        default:
+          meta_verbose ("No action triggered for button %u %s\n",
+                        event->button.button,
+                        (event->type == CLUTTER_BUTTON_PRESS) ? "press" : 
"release");
+        }
+    }
+  else if (event->type == CLUTTER_TOUCH_BEGIN ||
+           event->type == CLUTTER_TOUCH_UPDATE ||
+           event->type == CLUTTER_TOUCH_END)
+    {
+      return META_ACTION_CLICK;
+    }
+
+  return META_ACTION_IGNORE;
+}
+
+static uint32_t
+get_button_number (const ClutterEvent *event)
+{
+  if (event->type == CLUTTER_TOUCH_BEGIN ||
+      event->type == CLUTTER_TOUCH_UPDATE ||
+      event->type == CLUTTER_TOUCH_END)
+    return -1;
+  else if (event->type == CLUTTER_BUTTON_PRESS ||
+           event->type == CLUTTER_BUTTON_RELEASE)
+    return clutter_event_get_button (event);
+
+  g_assert_not_reached ();
+}
+
 static gboolean
-meta_frame_left_click_event (MetaUIFrame *frame,
-                             ClutterButtonEvent *event)
+meta_frame_left_click_event (MetaUIFrame        *frame,
+                             const ClutterEvent *event)
 {
   Display *display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
-  MetaFrameControl control = get_control (frame, event->x, event->y);
+  MetaFrameControl control;
+  guint32 evtime;
+  gfloat x, y;
+
+  evtime = clutter_event_get_time (event);
+  clutter_event_get_coords (event, &x, &y);
+  control = get_control (frame, x, y);
 
   switch (control)
     {
@@ -950,7 +1026,7 @@
     case META_FRAME_CONTROL_DELETE:
     case META_FRAME_CONTROL_MENU:
     case META_FRAME_CONTROL_APPMENU:
-      frame->grab_button = event->button;
+      frame->grab_button = get_button_number (event);
       frame->button_state = META_BUTTON_STATE_PRESSED;
       frame->prelit_control = control;
       redraw_control (frame, control);
@@ -987,13 +1063,12 @@
                                                frame->xwindow,
                                                menu,
                                                &root_rect,
-                                               event->time);
+                                               evtime);
         }
       else
         {
           meta_frames_try_grab_op (frame, META_GRAB_OP_FRAME_BUTTON,
-                                   event->x, event->y,
-                                   event->time);
+                                   x, y, evtime);
         }
 
       return TRUE;
@@ -1007,8 +1082,7 @@
     case META_FRAME_CONTROL_RESIZE_W:
       meta_frames_try_grab_op (frame,
                                grab_op_from_resize_control (control),
-                               event->x, event->y,
-                               event->time);
+                               x, y, evtime);
 
       return TRUE;
     case META_FRAME_CONTROL_TITLE:
@@ -1019,8 +1093,7 @@
           {
             meta_frames_try_grab_op (frame,
                                      META_GRAB_OP_MOVING,
-                                     event->x, event->y,
-                                     event->time);
+                                     x, y, evtime);
           }
       }
 
@@ -1036,21 +1109,31 @@
 }
 
 static gboolean
-handle_button_press_event (MetaUIFrame *frame,
-                           ClutterButtonEvent *event)
+handle_press_event (MetaUIFrame        *frame,
+                    const ClutterEvent *event)
 {
   MetaFrameControl control;
   Display *display;
+  uint32_t evtime, action;
+  float x, y;
 
-  display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+  g_assert (event->type == CLUTTER_BUTTON_PRESS ||
+            event->type == CLUTTER_TOUCH_BEGIN);
 
-  control = get_control (frame, event->x, event->y);
+  action = get_action (event);
+  if (action == META_ACTION_IGNORE)
+    return FALSE;
 
+  display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+
+  evtime = clutter_event_get_time (event);
+  clutter_event_get_coords (event, &x, &y);
+  control = get_control (frame, x, y);
   /* don't do the rest of this if on client area */
   if (control == META_FRAME_CONTROL_CLIENT_AREA)
     return FALSE; /* not on the frame, just passed through from client */
 
-  if (event->button == 1 &&
+  if (action == META_ACTION_CLICK &&
       !(control == META_FRAME_CONTROL_MINIMIZE ||
         control == META_FRAME_CONTROL_DELETE ||
         control == META_FRAME_CONTROL_MAXIMIZE))
@@ -1058,52 +1141,60 @@
       meta_topic (META_DEBUG_FOCUS,
                   "Focusing window with frame 0x%lx due to button 1 press\n",
                   frame->xwindow);
-      meta_window_focus (frame->meta_window, event->time);
+      meta_window_focus (frame->meta_window, evtime);
     }
 
   /* We want to shade even if we have a GrabOp, since we'll have a move grab
    * if we double click the titlebar.
    */
   if (control == META_FRAME_CONTROL_TITLE &&
-      event->button == 1 &&
-      event->click_count == 2)
+      action == META_ACTION_DOUBLE_CLICK)
     {
-      meta_core_end_grab_op (display, event->time);
+      meta_core_end_grab_op (display, evtime);
       return meta_frame_double_click_event (frame, event);
     }
 
   if (meta_core_get_grab_op (display) != META_GRAB_OP_NONE)
     return FALSE; /* already up to something */
 
-  frame->grab_button = event->button;
+  frame->grab_button = get_button_number (event);
 
-  switch (event->button)
+  switch (action)
     {
-    case 1:
+    case META_ACTION_CLICK:
       return meta_frame_left_click_event (frame, event);
-    case 2:
-      return meta_frame_middle_click_event (frame, event);
-    case 3:
-      return meta_frame_right_click_event (frame, event);
+    case META_ACTION_MIDDLE_CLICK:
+      return meta_frame_middle_click_event (frame, (ClutterButtonEvent *) 
event);
+    case META_ACTION_RIGHT_CLICK:
+      return meta_frame_right_click_event (frame, (ClutterButtonEvent *) 
event);
     default:
       return FALSE;
     }
 }
 
 static gboolean
-handle_button_release_event (MetaUIFrame *frame,
-                             ClutterButtonEvent *event)
+handle_release_event (MetaUIFrame        *frame,
+                      const ClutterEvent *event)
 {
   Display *display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+  guint32 evtime, button;
+  gfloat x, y;
+
+  g_assert (event->type == CLUTTER_BUTTON_RELEASE ||
+            event->type == CLUTTER_TOUCH_END);
+
+  evtime = clutter_event_get_time (event);
+  clutter_event_get_coords (event, &x, &y);
+  button = get_button_number (event);
 
   frame->frames->current_grab_op = META_GRAB_OP_NONE;
-  meta_core_end_grab_op (display, event->time);
+  meta_core_end_grab_op (display, evtime);
 
   /* We only handle the releases we handled the presses for (things
    * involving frame controls). Window ops that don't require a
    * frame are handled in the Xlib part of the code, display.c/window.c
    */
-  if (((int) event->button) == frame->grab_button &&
+  if (((int) button) == frame->grab_button &&
       frame->button_state == META_BUTTON_STATE_PRESSED)
     {
       switch (frame->prelit_control)
@@ -1113,7 +1204,7 @@
           break;
         case META_FRAME_CONTROL_MAXIMIZE:
           /* Focus the window on the maximize */
-          meta_window_focus (frame->meta_window, event->time);
+          meta_window_focus (frame->meta_window, evtime);
           if (meta_prefs_get_raise_on_click ())
             meta_window_raise (frame->meta_window);
           meta_window_maximize (frame->meta_window, META_MAXIMIZE_BOTH);
@@ -1124,7 +1215,7 @@
           meta_window_unmaximize (frame->meta_window, META_MAXIMIZE_BOTH);
           break;
         case META_FRAME_CONTROL_DELETE:
-          meta_window_delete (frame->meta_window, event->time);
+          meta_window_delete (frame->meta_window, evtime);
           break;
         default:
           break;
@@ -1135,7 +1226,7 @@
        * prelit so to let the user know that it can now be pressed.
        * :)
        */
-      MetaFrameControl control = get_control (frame, event->x, event->y);
+      MetaFrameControl control = get_control (frame, x, y);
       meta_ui_frame_update_prelit_control (frame, control);
     }
 
@@ -1236,13 +1327,22 @@
 }
 
 static gboolean
-handle_motion_notify_event (MetaUIFrame *frame,
-                            ClutterMotionEvent *event)
+handle_motion_event (MetaUIFrame        *frame,
+                     const ClutterEvent *event)
 {
   MetaFrames *frames = frame->frames;
   MetaFrameControl control;
-
-  control = get_control (frame, event->x, event->y);
+  ClutterModifierType modifiers;
+  guint32 evtime;
+  gfloat x, y;
+
+  g_assert (event->type == CLUTTER_MOTION ||
+            event->type == CLUTTER_TOUCH_UPDATE);
+
+  modifiers = clutter_event_get_state (event);
+  evtime = clutter_event_get_time (event);
+  clutter_event_get_coords (event, &x, &y);
+  control = get_control (frame, x, y);
 
   if (frame->button_state == META_BUTTON_STATE_PRESSED)
     {
@@ -1260,9 +1360,11 @@
       meta_ui_frame_update_prelit_control (frame, control);
     }
 
-  if ((event->modifier_state & CLUTTER_BUTTON1_MASK) &&
-      frames->current_grab_op != META_GRAB_OP_NONE)
-    meta_frames_retry_grab_op (frames, event->time);
+  if (frames->current_grab_op != META_GRAB_OP_NONE &&
+      (event->type == CLUTTER_TOUCH_UPDATE ||
+       (event->type == CLUTTER_MOTION &&
+        (modifiers & CLUTTER_BUTTON1_MASK))))
+    meta_frames_retry_grab_op (frames, evtime);
 
   return TRUE;
 }
@@ -1516,14 +1618,51 @@
 meta_ui_frame_handle_event (MetaUIFrame *frame,
                             const ClutterEvent *event)
 {
+  if (event->type == CLUTTER_TOUCH_BEGIN ||
+      event->type == CLUTTER_TOUCH_UPDATE ||
+      event->type == CLUTTER_TOUCH_END)
+    {
+      ClutterEventSequence *sequence;
+      MetaFrames *frames = frame->frames;
+
+      /* In X11, mutter sets up passive touch grabs which basically
+       * means we handle those events twice (once through the passive
+       * grab, and then through XISelectEvents).
+       *
+       * Receiving touch events here means we are going through the
+       * former, but passive grabs are exclusively for gesture
+       * recognition purposes.
+       *
+       * We do actually want this to happen though the regular event
+       * selection paths to avoid breaking internal state, which means
+       * we will get pointer events, because we don't select for XI_Touch*.
+       */
+      if (!meta_is_wayland_compositor ())
+        return FALSE;
+
+      sequence = clutter_event_get_event_sequence (event);
+
+      /* Lock onto a single touch */
+      if (frames->grab_touch && frames->grab_touch != sequence)
+        return FALSE;
+
+      if (event->type == CLUTTER_TOUCH_BEGIN)
+        frames->grab_touch = sequence;
+      else if (event->type == CLUTTER_TOUCH_END)
+        frames->grab_touch = NULL;
+    }
+
   switch (event->any.type)
     {
     case CLUTTER_BUTTON_PRESS:
-      return handle_button_press_event (frame, (ClutterButtonEvent *) event);
+    case CLUTTER_TOUCH_BEGIN:
+      return handle_press_event (frame, event);
     case CLUTTER_BUTTON_RELEASE:
-      return handle_button_release_event (frame, (ClutterButtonEvent *) event);
+    case CLUTTER_TOUCH_END:
+      return handle_release_event (frame, event);
     case CLUTTER_MOTION:
-      return handle_motion_notify_event (frame, (ClutterMotionEvent *) event);
+    case CLUTTER_TOUCH_UPDATE:
+      return handle_motion_event (frame, event);
     case CLUTTER_ENTER:
       return handle_enter_notify_event (frame, (ClutterCrossingEvent *) event);
     case CLUTTER_LEAVE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-3.28.2+20180507.41303bc01/src/ui/frames.h 
new/mutter-3.28.2+20180526.abc7ad8e9/src/ui/frames.h
--- old/mutter-3.28.2+20180507.41303bc01/src/ui/frames.h        2018-05-07 
22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/ui/frames.h        2018-05-26 
15:26:09.000000000 +0200
@@ -99,6 +99,8 @@
   guint grab_button;
   gdouble grab_x;
   gdouble grab_y;
+
+  ClutterEventSequence *grab_touch;
 };
 
 struct _MetaFramesClass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-legacy-xdg-shell.c
 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-legacy-xdg-shell.c
--- 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-legacy-xdg-shell.c
    2018-05-07 22:29:42.000000000 +0200
+++ 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-legacy-xdg-shell.c
    2018-05-26 15:26:09.000000000 +0200
@@ -585,17 +585,6 @@
           (new_max_height == 0 || new_min_height <= new_max_height));
 }
 
-static inline gboolean
-did_geometry_change (MetaWaylandZxdgSurfaceV6 *xdg_surface,
-                     MetaWaylandPendingState  *pending)
-{
-  MetaWaylandZxdgSurfaceV6Private *priv =
-    meta_wayland_zxdg_surface_v6_get_instance_private (xdg_surface);
-
-  return pending->has_new_geometry &&
-         !meta_rectangle_equal (&priv->geometry, &pending->new_geometry);
-}
-
 static void
 meta_wayland_zxdg_toplevel_v6_commit (MetaWaylandSurfaceRole  *surface_role,
                                       MetaWaylandPendingState *pending)
@@ -611,11 +600,10 @@
     meta_wayland_surface_role_get_surface (surface_role);
   MetaWindow *window = surface->window;
   MetaRectangle window_geometry;
+  MetaRectangle old_geometry;
   gboolean geometry_changed;
 
-  /* This check must happen before chaining up, otherwise the new geometry
-   * is applied and it'll always return FALSE. */
-  geometry_changed = did_geometry_change (xdg_surface, pending);
+  old_geometry = xdg_surface_priv->geometry;
 
   surface_role_class =
     META_WAYLAND_SURFACE_ROLE_CLASS 
(meta_wayland_zxdg_toplevel_v6_parent_class);
@@ -634,6 +622,8 @@
   if (!window)
     return;
 
+  geometry_changed = !meta_rectangle_equal (&old_geometry, 
&xdg_surface_priv->geometry);
+
   if (geometry_changed || meta_window_wayland_needs_move_resize (window))
     {
       window_geometry =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-surface-role-cursor.c
 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-surface-role-cursor.c
--- 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-surface-role-cursor.c
 2018-05-07 22:29:42.000000000 +0200
+++ 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-surface-role-cursor.c
 2018-05-26 15:26:09.000000000 +0200
@@ -195,14 +195,15 @@
     META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role);
   MetaWaylandSurfaceRoleCursorPrivate *priv =
     meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-  ClutterRect rect;
+  ClutterPoint point;
   ClutterRect logical_monitor_rect;
 
-  rect = meta_cursor_renderer_calculate_rect (priv->cursor_renderer,
-                                              priv->cursor_sprite);
   logical_monitor_rect =
     meta_rectangle_to_clutter_rect (&logical_monitor->rect);
-  return clutter_rect_intersection (&rect, &logical_monitor_rect, NULL);
+
+  point = meta_cursor_renderer_get_position (priv->cursor_renderer);
+
+  return clutter_rect_contains_point (&logical_monitor_rect, &point);
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-surface.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-surface.c
--- old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-surface.c     
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-surface.c     
2018-05-26 15:26:09.000000000 +0200
@@ -54,6 +54,7 @@
 
 #include "compositor/region-utils.h"
 #include "compositor/meta-shaped-texture-private.h"
+#include "compositor/meta-window-actor-private.h"
 
 #include "meta-surface-actor.h"
 #include "meta-surface-actor-wayland.h"
@@ -142,6 +143,9 @@
 static void
 window_position_changed (MetaWindow         *window,
                          MetaWaylandSurface *surface);
+static void
+window_actor_effects_completed (MetaWindowActor    *window_actor,
+                                MetaWaylandSurface *surface);
 
 static void
 role_assignment_valist_to_properties (GType       role_type,
@@ -1138,6 +1142,9 @@
       g_signal_handlers_disconnect_by_func (surface->window,
                                             window_position_changed,
                                             surface);
+      g_signal_handlers_disconnect_by_func (meta_window_actor_from_window 
(surface->window),
+                                            window_actor_effects_completed,
+                                            surface);
     }
 
   surface->window = window;
@@ -1154,6 +1161,10 @@
                                "position-changed",
                                G_CALLBACK (window_position_changed),
                                surface, 0);
+      g_signal_connect_object (meta_window_actor_from_window (window),
+                               "effects-completed",
+                               G_CALLBACK (window_actor_effects_completed),
+                               surface, 0);
     }
 }
 
@@ -1254,6 +1265,13 @@
 {
   meta_wayland_surface_update_outputs_recursively (surface);
 }
+
+static void
+window_actor_effects_completed (MetaWindowActor    *window_actor,
+                                MetaWaylandSurface *surface)
+{
+  meta_wayland_surface_update_outputs_recursively (surface);
+}
 
 void
 meta_wayland_surface_create_surface_actor (MetaWaylandSurface *surface)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-text-input.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-text-input.c
--- old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-text-input.c  
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-text-input.c  
2018-05-26 15:26:09.000000000 +0200
@@ -120,8 +120,6 @@
       gtk_text_input_send_preedit_string (resource, NULL, 0);
       gtk_text_input_send_commit_string (resource, text);
     }
-
-  clutter_input_focus_reset (focus);
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-xdg-shell.c 
new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-xdg-shell.c
--- old/mutter-3.28.2+20180507.41303bc01/src/wayland/meta-wayland-xdg-shell.c   
2018-05-07 22:29:42.000000000 +0200
+++ new/mutter-3.28.2+20180526.abc7ad8e9/src/wayland/meta-wayland-xdg-shell.c   
2018-05-26 15:26:09.000000000 +0200
@@ -608,17 +608,6 @@
           (new_max_height == 0 || new_min_height <= new_max_height));
 }
 
-static inline gboolean
-did_geometry_change (MetaWaylandXdgSurface   *xdg_surface,
-                     MetaWaylandPendingState *pending)
-{
-  MetaWaylandXdgSurfacePrivate *priv =
-    meta_wayland_xdg_surface_get_instance_private (xdg_surface);
-
-  return pending->has_new_geometry &&
-         !meta_rectangle_equal (&priv->geometry, &pending->new_geometry);
-}
-
 static void
 meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole  *surface_role,
                                   MetaWaylandPendingState *pending)
@@ -632,6 +621,7 @@
     meta_wayland_surface_role_get_surface (surface_role);
   MetaWindow *window;
   MetaRectangle window_geometry;
+  MetaRectangle old_geometry;
   gboolean geometry_changed;
 
   if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
@@ -641,10 +631,7 @@
     }
 
   window = surface->window;
-
-  /* This check must happen before chaining up, otherwise the new geometry
-   * is applied and it'll always return FALSE. */
-  geometry_changed = did_geometry_change (xdg_surface, pending);
+  old_geometry = xdg_surface_priv->geometry;
 
   surface_role_class =
     META_WAYLAND_SURFACE_ROLE_CLASS (meta_wayland_xdg_toplevel_parent_class);
@@ -659,6 +646,8 @@
   if (!pending->newly_attached)
     return;
 
+  geometry_changed = !meta_rectangle_equal (&old_geometry, 
&xdg_surface_priv->geometry);
+
   if (geometry_changed || meta_window_wayland_needs_move_resize (window))
     {
       window_geometry = meta_wayland_xdg_surface_get_window_geometry 
(xdg_surface);


Reply via email to