diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index 3b43c6a11..558344403 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -81,10 +81,12 @@ ClutterStage * meta_compositor_get_stage (MetaCompositor *compositor); gboolean meta_compositor_is_switching_workspace (MetaCompositor *compositor); -gboolean meta_compositor_drag_window (MetaCompositor *compositor, - MetaWindow *window, - MetaGrabOp grab_op, - uint32_t timestamp); +gboolean meta_compositor_drag_window (MetaCompositor *compositor, + MetaWindow *window, + MetaGrabOp grab_op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + uint32_t timestamp); MetaWindowDrag * meta_compositor_get_current_window_drag (MetaCompositor *compositor); diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index dbc4aea50..90c9e817e 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -1688,10 +1688,12 @@ on_window_drag_ended (MetaWindowDrag *window_drag, } gboolean -meta_compositor_drag_window (MetaCompositor *compositor, - MetaWindow *window, - MetaGrabOp grab_op, - uint32_t timestamp) +meta_compositor_drag_window (MetaCompositor *compositor, + MetaWindow *window, + MetaGrabOp grab_op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + uint32_t timestamp) { MetaCompositorPrivate *priv = meta_compositor_get_instance_private (compositor); @@ -1702,7 +1704,7 @@ meta_compositor_drag_window (MetaCompositor *compositor, window_drag = meta_window_drag_new (window, grab_op); - if (!meta_window_drag_begin (window_drag, timestamp)) + if (!meta_window_drag_begin (window_drag, device, sequence, timestamp)) return FALSE; g_signal_connect (window_drag, "ended", diff --git a/src/compositor/meta-window-drag.c b/src/compositor/meta-window-drag.c index d3b3f0404..2a99704fa 100644 --- a/src/compositor/meta-window-drag.c +++ b/src/compositor/meta-window-drag.c @@ -55,6 +55,8 @@ struct _MetaWindowDrag { MetaGrabOp grab_op; ClutterGrab *grab; + ClutterInputDevice *leading_device; + ClutterEventSequence *leading_touch_sequence; int anchor_root_x; int anchor_root_y; MetaRectangle anchor_window_pos; @@ -1572,6 +1574,7 @@ process_pointer_event (MetaWindowDrag *window_drag, const ClutterEvent *event) { ClutterEventSequence *sequence = clutter_event_get_event_sequence (event); + ClutterInputDevice *device = clutter_event_get_device (event); ClutterModifierType modifier_state; MetaEdgeResistanceFlags flags; MetaWindow *window; @@ -1580,6 +1583,10 @@ process_pointer_event (MetaWindowDrag *window_drag, window = window_drag->effective_grab_window; if (!window) return; + if (window_drag->leading_device != device) + return; + if (window_drag->leading_touch_sequence != sequence) + return; switch (event->type) { @@ -1592,21 +1599,18 @@ process_pointer_event (MetaWindowDrag *window_drag, end_grab_op (window_drag, event); break; case CLUTTER_TOUCH_END: - if (!meta_display_is_pointer_emulating_sequence (window->display, sequence)) - return; - end_grab_op (window_drag, event); break; case CLUTTER_BUTTON_RELEASE: + if (window_drag->leading_touch_sequence) + return; + if (event->button.button == 1 || event->button.button == (unsigned int) meta_prefs_get_mouse_button_resize ()) end_grab_op (window_drag, event); break; case CLUTTER_TOUCH_UPDATE: - if (!meta_display_is_pointer_emulating_sequence (window->display, sequence)) - return; - G_GNUC_FALLTHROUGH; case CLUTTER_MOTION: modifier_state = clutter_event_get_state (event); @@ -1659,8 +1663,10 @@ on_window_drag_event (MetaWindowDrag *window_drag, } gboolean -meta_window_drag_begin (MetaWindowDrag *window_drag, - uint32_t timestamp) +meta_window_drag_begin (MetaWindowDrag *window_drag, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + uint32_t timestamp) { MetaWindow *window = window_drag->window, *grab_window = NULL; MetaDisplay *display = meta_window_get_display (window); @@ -1678,11 +1684,9 @@ meta_window_drag_begin (MetaWindowDrag *window_drag, { ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); - ClutterInputDevice *device; graphene_point_t pos; - device = clutter_seat_get_pointer (seat); - clutter_seat_query_state (seat, device, NULL, &pos, NULL); + clutter_seat_query_state (seat, device, sequence, &pos, NULL); root_x = pos.x; root_y = pos.y; } @@ -1756,6 +1760,8 @@ meta_window_drag_begin (MetaWindowDrag *window_drag, G_CALLBACK (on_grab_window_size_changed), window_drag); } + window_drag->leading_device = device; + window_drag->leading_touch_sequence = sequence; window_drag->tile_mode = grab_window->tile_mode; window_drag->tile_monitor_number = grab_window->tile_monitor_number; window_drag->anchor_root_x = root_x; diff --git a/src/compositor/meta-window-drag.h b/src/compositor/meta-window-drag.h index 59e36cde8..65fbe6ab6 100644 --- a/src/compositor/meta-window-drag.h +++ b/src/compositor/meta-window-drag.h @@ -32,8 +32,10 @@ G_DECLARE_FINAL_TYPE (MetaWindowDrag, meta_window_drag, MetaWindowDrag * meta_window_drag_new (MetaWindow *window, MetaGrabOp grab_op); -gboolean meta_window_drag_begin (MetaWindowDrag *drag, - uint32_t timestamp); +gboolean meta_window_drag_begin (MetaWindowDrag *drag, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + uint32_t timestamp); void meta_window_drag_end (MetaWindowDrag *drag); diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 513e0976e..f72c8ad30 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -2705,9 +2705,17 @@ handle_begin_move (MetaDisplay *display, { if (window->has_move_func) { + MetaContext *context = meta_display_get_context (display); + MetaBackend *backend = meta_context_get_backend (context); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); + ClutterInputDevice *device; + + device = clutter_seat_get_pointer (seat); meta_window_begin_grab_op (window, META_GRAB_OP_KEYBOARD_MOVING | META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED, + device, NULL, event->time); } } @@ -2721,9 +2729,17 @@ handle_begin_resize (MetaDisplay *display, { if (window->has_resize_func) { + MetaContext *context = meta_display_get_context (display); + MetaBackend *backend = meta_context_get_backend (context); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); + ClutterInputDevice *device; + + device = clutter_seat_get_pointer (seat); meta_window_begin_grab_op (window, META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN | META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED, + device, NULL, event->time); } } diff --git a/src/core/window.c b/src/core/window.c index 8546f1f90..ceb8f5ac8 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -6084,13 +6084,24 @@ meta_window_is_ancestor_of_transient (MetaWindow *window, return d.found; } +/** + * meta_window_begin_grab_op: + * @window: + * @op: + * @device: (nullable): + * @sequence: (nullable): + * @timestamp: + **/ gboolean -meta_window_begin_grab_op (MetaWindow *window, - MetaGrabOp op, - guint32 timestamp) +meta_window_begin_grab_op (MetaWindow *window, + MetaGrabOp op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + guint32 timestamp) { return meta_compositor_drag_window (window->display->compositor, window, op, + device, sequence, timestamp); } @@ -7703,6 +7714,8 @@ meta_window_handle_ungrabbed_event (MetaWindow *window, op |= META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED; meta_window_begin_grab_op (window, op, + clutter_event_get_device (event), + clutter_event_get_event_sequence (event), event->any.time); } } @@ -7722,6 +7735,8 @@ meta_window_handle_ungrabbed_event (MetaWindow *window, meta_window_begin_grab_op (window, META_GRAB_OP_MOVING | META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED, + clutter_event_get_device (event), + clutter_event_get_event_sequence (event), event->any.time); } } diff --git a/src/meta/window.h b/src/meta/window.h index e799f0f57..7da886ab2 100644 --- a/src/meta/window.h +++ b/src/meta/window.h @@ -409,9 +409,11 @@ void meta_window_get_work_area_all_monitors (MetaWindow *window, MetaRectangle *area); META_EXPORT -gboolean meta_window_begin_grab_op (MetaWindow *window, - MetaGrabOp op, - guint32 timestamp); +gboolean meta_window_begin_grab_op (MetaWindow *window, + MetaGrabOp op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + guint32 timestamp); META_EXPORT gboolean meta_window_can_maximize (MetaWindow *window); diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index d0e21b019..86104bbf0 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -1543,11 +1543,13 @@ meta_wayland_surface_create (MetaWaylandCompositor *compositor, } gboolean -meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, - MetaWaylandSeat *seat, - MetaGrabOp grab_op, - gfloat x, - gfloat y) +meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, + MetaWaylandSeat *seat, + MetaGrabOp grab_op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + gfloat x, + gfloat y) { MetaWindow *window = meta_wayland_surface_get_window (surface); @@ -1559,6 +1561,7 @@ meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, being moved/resized via a SSD event. */ return meta_window_begin_grab_op (window, grab_op, + device, sequence, meta_display_get_current_time_roundtrip (window->display)); } diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h index 9ba526475..9cb6277c7 100644 --- a/src/wayland/meta-wayland-surface.h +++ b/src/wayland/meta-wayland-surface.h @@ -341,11 +341,13 @@ MetaWaylandSurface * meta_wayland_surface_role_get_surface (MetaWaylandSurfaceRo cairo_region_t * meta_wayland_surface_calculate_input_region (MetaWaylandSurface *surface); -gboolean meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, - MetaWaylandSeat *seat, - MetaGrabOp grab_op, - gfloat x, - gfloat y); +gboolean meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, + MetaWaylandSeat *seat, + MetaGrabOp grab_op, + ClutterInputDevice *device, + ClutterEventSequence *sequence, + gfloat x, + gfloat y); void meta_wayland_surface_window_managed (MetaWaylandSurface *surface, MetaWindow *window); diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c index 13fec6a7f..1140587ed 100644 --- a/src/wayland/meta-wayland-xdg-shell.c +++ b/src/wayland/meta-wayland-xdg-shell.c @@ -318,6 +318,8 @@ xdg_toplevel_move (struct wl_client *client, MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource); MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource); MetaWindow *window; + ClutterInputDevice *device; + ClutterEventSequence *sequence; float x, y; window = meta_wayland_surface_get_window (surface); @@ -325,10 +327,11 @@ xdg_toplevel_move (struct wl_client *client, return; if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, - NULL, NULL, &x, &y)) + &device, &sequence, &x, &y)) return; - meta_wayland_surface_begin_grab_op (surface, seat, META_GRAB_OP_MOVING, x, y); + meta_wayland_surface_begin_grab_op (surface, seat, META_GRAB_OP_MOVING, + device, sequence, x, y); } static MetaGrabOp @@ -366,6 +369,8 @@ xdg_toplevel_resize (struct wl_client *client, MetaWindow *window; gfloat x, y; MetaGrabOp grab_op; + ClutterInputDevice *device; + ClutterEventSequence *sequence; window = meta_wayland_surface_get_window (surface); if (!window) @@ -375,11 +380,12 @@ xdg_toplevel_resize (struct wl_client *client, return; if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, - NULL, NULL, &x, &y)) + &device, &sequence, &x, &y)) return; grab_op = grab_op_for_xdg_toplevel_resize_edge (edges); - meta_wayland_surface_begin_grab_op (surface, seat, grab_op, x, y); + meta_wayland_surface_begin_grab_op (surface, seat, grab_op, + device, sequence, x, y); } static void diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index 63e1aaf9d..1fc4eb98f 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -3349,7 +3349,15 @@ meta_window_x11_client_message (MetaWindow *window, ((window->has_move_func && op == META_GRAB_OP_KEYBOARD_MOVING) || (window->has_resize_func && op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN))) { - meta_window_begin_grab_op (window, op, timestamp); + MetaContext *context = meta_display_get_context (display); + MetaBackend *backend = meta_context_get_backend (context); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); + + meta_window_begin_grab_op (window, op, + clutter_seat_get_pointer (seat), + NULL, + timestamp); } else if (op != META_GRAB_OP_NONE && ((window->has_move_func && op == META_GRAB_OP_MOVING) || @@ -3357,12 +3365,17 @@ meta_window_x11_client_message (MetaWindow *window, (op != META_GRAB_OP_MOVING && op != META_GRAB_OP_KEYBOARD_MOVING)))) { + MetaContext *context = meta_display_get_context (display); + MetaBackend *backend = meta_context_get_backend (context); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); int button_mask; meta_topic (META_DEBUG_WINDOW_OPS, "Beginning move/resize with button = %d", button); - meta_window_begin_grab_op (window, - op, + meta_window_begin_grab_op (window, op, + clutter_seat_get_pointer (seat), + NULL, timestamp); button_mask = query_pressed_buttons (window);