diff --git a/src/backends/native/meta-pointer-constraint-native.c b/src/backends/native/meta-pointer-constraint-native.c index 94ad243793358084fe8e62410428b1087380cc4b..fe3a99447660a6b7fe87e55e3fb3ea4553e9c5b0 100644 --- a/src/backends/native/meta-pointer-constraint-native.c +++ b/src/backends/native/meta-pointer-constraint-native.c @@ -443,13 +443,13 @@ get_motion_directions (MetaLine2 *motion) } static void -meta_pointer_constraint_impl_native_constraint (MetaPointerConstraintImpl *constraint_impl, - ClutterInputDevice *device, - uint32_t time, - float prev_x, - float prev_y, - float *x_inout, - float *y_inout) +meta_pointer_constraint_impl_native_constrain (MetaPointerConstraintImpl *constraint_impl, + ClutterInputDevice *device, + uint32_t time, + float prev_x, + float prev_y, + float *x_inout, + float *y_inout) { MetaPointerConstraintImplNative *constraint_impl_native; g_autoptr (MtkRegion) region = NULL; @@ -496,12 +496,12 @@ meta_pointer_constraint_impl_native_constraint (MetaPointerConstraintImpl *const motion = (MetaLine2) { .a = (MetaVector2) { - .x = prev_x, - .y = prev_y, + .x = prev_x - constraint_impl_native->origin.x, + .y = prev_y - constraint_impl_native->origin.y, }, .b = (MetaVector2) { - .x = x, - .y = y, + .x = x - constraint_impl_native->origin.x, + .y = y - constraint_impl_native->origin.y, }, }; directions = get_motion_directions (&motion); @@ -522,8 +522,8 @@ meta_pointer_constraint_impl_native_constraint (MetaPointerConstraintImpl *const } } - *x_inout = motion.b.x; - *y_inout = motion.b.y; + *x_inout = motion.b.x + constraint_impl_native->origin.x; + *y_inout = motion.b.y + constraint_impl_native->origin.y; } static float @@ -602,6 +602,8 @@ meta_pointer_constraint_impl_native_ensure_constrained (MetaPointerConstraintImp g_autoptr (MtkRegion) region = NULL; float x; float y; + float rel_x; + float rel_y; constraint_impl_native = META_POINTER_CONSTRAINT_IMPL_NATIVE (constraint_impl); region = mtk_region_ref (constraint_impl_native->region); @@ -610,16 +612,20 @@ meta_pointer_constraint_impl_native_ensure_constrained (MetaPointerConstraintImp clutter_seat_query_state (seat, device, NULL, &point, NULL); x = point.x; y = point.y; + rel_x = x - constraint_impl_native->origin.x; + rel_y = y - constraint_impl_native->origin.y; if (mtk_region_is_empty (region)) { if (x != constraint_impl_native->origin.x || y != constraint_impl_native->origin.y) - clutter_seat_warp_pointer (seat, x, y); + { + clutter_seat_warp_pointer (seat, + constraint_impl_native->origin.x, + constraint_impl_native->origin.y); + } } - else if (!mtk_region_contains_point (region, - (int) x - constraint_impl_native->origin.x, - (int) y - constraint_impl_native->origin.y)) + else if (!mtk_region_contains_point (region, (int) rel_x, (int) rel_y)) { g_autoptr (GArray) borders = NULL; float closest_distance_2 = FLT_MAX; @@ -635,7 +641,7 @@ meta_pointer_constraint_impl_native_ensure_constrained (MetaPointerConstraintImp MetaBorder *border = &g_array_index (borders, MetaBorder, i); float distance_2; - distance_2 = point_to_border_distance_2 (border, x, y); + distance_2 = point_to_border_distance_2 (border, rel_x, rel_y); if (distance_2 < closest_distance_2) { closest_border = border; @@ -643,9 +649,11 @@ meta_pointer_constraint_impl_native_ensure_constrained (MetaPointerConstraintImp } } - closest_point_behind_border (closest_border, &x, &y); + closest_point_behind_border (closest_border, &rel_x, &rel_y); - clutter_seat_warp_pointer (seat, x, y); + clutter_seat_warp_pointer (seat, + rel_x + constraint_impl_native->origin.x, + rel_y + constraint_impl_native->origin.y); } } @@ -674,7 +682,7 @@ meta_pointer_constraint_impl_native_class_init (MetaPointerConstraintImplNativeC object_class->finalize = meta_pointer_constraint_impl_native_finalize; constraint_impl_class = META_POINTER_CONSTRAINT_IMPL_CLASS (klass); - constraint_impl_class->constrain = meta_pointer_constraint_impl_native_constraint; + constraint_impl_class->constrain = meta_pointer_constraint_impl_native_constrain; constraint_impl_class->ensure_constrained = meta_pointer_constraint_impl_native_ensure_constrained; } diff --git a/src/wayland/meta-pointer-confinement-wayland.c b/src/wayland/meta-pointer-confinement-wayland.c index ffb537ab0607e694e3d8b5b8672cde2d36c64b13..5a06207d8497dcb0b64c6b46b86d8dad0ba2f5f9 100644 --- a/src/wayland/meta-pointer-confinement-wayland.c +++ b/src/wayland/meta-pointer-confinement-wayland.c @@ -247,7 +247,7 @@ meta_pointer_confinement_wayland_create_constraint (MetaPointerConfinementWaylan meta_wayland_surface_get_absolute_coordinates (surface, 0, 0, &dx, &dy); min_edge_distance = wl_fixed_to_double (1) * geometry_scale; - constraint = meta_pointer_constraint_new (g_steal_pointer (®ion), + constraint = meta_pointer_constraint_new (region, GRAPHENE_POINT_INIT (dx, dy), min_edge_distance); diff --git a/src/wayland/meta-pointer-lock-wayland.c b/src/wayland/meta-pointer-lock-wayland.c index 96d181236651d3e36bfaeab5ac6151bf138604e4..e2a9b6905dcc0eb651f8e072c39ec65cfd1ee6a9 100644 --- a/src/wayland/meta-pointer-lock-wayland.c +++ b/src/wayland/meta-pointer-lock-wayland.c @@ -77,7 +77,7 @@ meta_pointer_lock_wayland_create_constraint (MetaPointerConfinementWayland *conf rect = (MtkRectangle) { .x = 0, .y = 0, .width = 0, .height = 0 }; region = mtk_region_create_rectangle (&rect); - constraint = meta_pointer_constraint_new (g_steal_pointer (®ion), + constraint = meta_pointer_constraint_new (region, GRAPHENE_POINT_INIT (x, y), 0.0); diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c index 4f8cc319697922ff2c42cc40cb97ce977dc3c3a7..069ee29ba73731f9572674d8314d9bce1398bb51 100644 --- a/src/wayland/meta-wayland-pointer-constraints.c +++ b/src/wayland/meta-wayland-pointer-constraints.c @@ -433,6 +433,9 @@ meta_wayland_pointer_constraint_disable (MetaWaylandPointerConstraint *constrain void meta_wayland_pointer_constraint_destroy (MetaWaylandPointerConstraint *constraint) { + g_clear_signal_handler (&constraint->pointer_focus_surface_handler_id, + constraint->seat->pointer); + if (meta_wayland_pointer_constraint_is_enabled (constraint)) meta_wayland_pointer_constraint_disable (constraint); @@ -1133,18 +1136,6 @@ bind_pointer_constraints (struct wl_client *client, NULL); } -static void -meta_wayland_pointer_constraint_finalize (GObject *object) -{ - MetaWaylandPointerConstraint *constraint = - META_WAYLAND_POINTER_CONSTRAINT (object); - - g_clear_signal_handler (&constraint->pointer_focus_surface_handler_id, - constraint->seat->pointer); - - G_OBJECT_CLASS (meta_wayland_pointer_constraint_parent_class)->finalize (object); -} - void meta_wayland_pointer_constraints_init (MetaWaylandCompositor *compositor) { @@ -1162,11 +1153,6 @@ meta_wayland_pointer_constraint_init (MetaWaylandPointerConstraint *constraint) static void meta_wayland_pointer_constraint_class_init (MetaWaylandPointerConstraintClass *klass) { - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = meta_wayland_pointer_constraint_finalize; - quark_pending_constraint_state = g_quark_from_static_string ("-meta-wayland-pointer-constraint-pending_state"); quark_surface_pointer_constraints_data =