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 - opensuse-packaging@opensuse.org +Mon May 28 17:34:20 UTC 2018 - bjorn.lie@gmail.com + +- 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 - bjorn.lie@gmail.com @@ -49,0 +65,7 @@ + +------------------------------------------------------------------- +Thu Apr 5 19:30:24 UTC 2018 - bjorn.lie@gmail.com + +- 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 hpj@suse.com -- 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);