[mutter] wayland/pointer-confinement: Scale region with the geometry scale
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland/pointer-confinement: Scale region with the geometry scale
- Date: Tue, 14 Jun 2022 14:27:39 +0000 (UTC)
commit ccde353fb3015941f468acdce66cd0f2b2bd402a
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Mon Jun 13 10:25:02 2022 +0200
wayland/pointer-confinement: Scale region with the geometry scale
Without applying the geometry scale, to both the region and the minimum
edge distance, the confinement area becomes too small and offset on
HiDPI setups.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2110
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2460>
src/wayland/meta-pointer-confinement-wayland.c | 14 +++++++++++++-
src/wayland/meta-wayland-surface.c | 11 +++++++++++
src/wayland/meta-wayland-surface.h | 2 ++
3 files changed, 26 insertions(+), 1 deletion(-)
---
diff --git a/src/wayland/meta-pointer-confinement-wayland.c b/src/wayland/meta-pointer-confinement-wayland.c
index a54faf00cb..01c7d3ff33 100644
--- a/src/wayland/meta-pointer-confinement-wayland.c
+++ b/src/wayland/meta-pointer-confinement-wayland.c
@@ -41,6 +41,7 @@
#include "backends/meta-backend-private.h"
#include "backends/meta-pointer-constraint.h"
+#include "compositor/region-utils.h"
#include "wayland/meta-wayland-pointer-constraints.h"
#include "wayland/meta-wayland-pointer.h"
#include "wayland/meta-wayland-seat.h"
@@ -211,6 +212,7 @@ meta_pointer_confinement_wayland_create_constraint (MetaPointerConfinementWaylan
MetaPointerConstraint *constraint;
MetaWaylandSurface *surface;
cairo_region_t *region;
+ int geometry_scale;
float dx, dy;
double min_edge_distance;
@@ -220,10 +222,20 @@ meta_pointer_confinement_wayland_create_constraint (MetaPointerConfinementWaylan
region =
meta_wayland_pointer_constraint_calculate_effective_region (priv->constraint);
+ geometry_scale = meta_wayland_surface_get_geometry_scale (surface);
+ if (geometry_scale != 1)
+ {
+ cairo_region_t *scaled_region;
+
+ scaled_region = meta_region_scale (region, geometry_scale);
+ cairo_region_destroy (region);
+ region = scaled_region;
+ }
+
meta_wayland_surface_get_absolute_coordinates (surface, 0, 0, &dx, &dy);
cairo_region_translate (region, dx, dy);
- min_edge_distance = wl_fixed_to_double (1);
+ min_edge_distance = wl_fixed_to_double (1) * geometry_scale;
constraint = meta_pointer_constraint_new (region, min_edge_distance);
cairo_region_destroy (region);
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index d7f198a1e0..aad2dc35cf 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -2257,3 +2257,14 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
return TRUE;
}
+
+int
+meta_wayland_surface_get_geometry_scale (MetaWaylandSurface *surface)
+{
+ MetaWaylandActorSurface *actor_surface;
+
+ g_return_val_if_fail (META_IS_WAYLAND_ACTOR_SURFACE (surface->role), 1);
+
+ actor_surface = META_WAYLAND_ACTOR_SURFACE (surface->role);
+ return meta_wayland_actor_surface_get_geometry_scale (actor_surface);
+}
diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
index 7986c21ea7..54bea9d08e 100644
--- a/src/wayland/meta-wayland-surface.h
+++ b/src/wayland/meta-wayland-surface.h
@@ -374,6 +374,8 @@ meta_wayland_surface_can_scanout_untransformed (MetaWaylandSurface *surface,
MetaRendererView *view,
int geometry_scale);
+int meta_wayland_surface_get_geometry_scale (MetaWaylandSurface *surface);
+
static inline GNode *
meta_get_next_subsurface_sibling (GNode *n)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]