diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2020-07-29 11:22:19 +0200 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2020-08-05 11:11:38 +0200 |
commit | eeee7bed1dbc58f159ecc4ef84848237452b87b1 (patch) | |
tree | d1f1fd672933b525276484cb59c351ea00318335 /src/backends/meta-cursor-tracker.c | |
parent | b24b95db15c84284e7f628eb336010fc0e690403 (diff) | |
download | mutter-eeee7bed1dbc58f159ecc4ef84848237452b87b1.tar.gz |
cursor-tracker: Add way to force tracking cursor position
On X11 we won't always receive cursor positions, as some other client
might have grabbed the pointer (e.g. for implementing a popup menu). To
make screen casting show a somewhat correct cursor position, we need to
actively poll the X server about the current cursor position.
We only really want to do this when screen casting or taking a
screenshot, so add an API that forces the cursor tracker to track the
cursor position.
On the native backend this is a no-op as we by default always track the
cursor position anyway.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1391
Diffstat (limited to 'src/backends/meta-cursor-tracker.c')
-rw-r--r-- | src/backends/meta-cursor-tracker.c | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c index f9331b6f6..a411413e2 100644 --- a/src/backends/meta-cursor-tracker.c +++ b/src/backends/meta-cursor-tracker.c @@ -62,6 +62,8 @@ typedef struct _MetaCursorTrackerPrivate gboolean is_showing; + int track_position_count; + float x; float y; @@ -176,6 +178,12 @@ sync_cursor (MetaCursorTracker *tracker) } static void +meta_cursor_tracker_real_set_force_track_position (MetaCursorTracker *tracker, + gboolean is_enabled) +{ +} + +static void meta_cursor_tracker_init (MetaCursorTracker *tracker) { MetaCursorTrackerPrivate *priv = @@ -251,6 +259,9 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass) object_class->set_property = meta_cursor_tracker_set_property; object_class->finalize = meta_cursor_tracker_finalize; + klass->set_force_track_position = + meta_cursor_tracker_real_set_force_track_position; + obj_props[PROP_BACKEND] = g_param_spec_object ("backend", "backend", @@ -491,8 +502,6 @@ meta_cursor_tracker_update_position (MetaCursorTracker *tracker, meta_backend_get_cursor_renderer (priv->backend); gboolean position_changed; - g_assert (meta_is_wayland_compositor ()); - if (priv->x != new_x || priv->y != new_y) { position_changed = TRUE; @@ -567,6 +576,40 @@ meta_cursor_tracker_get_pointer (MetaCursorTracker *tracker, get_pointer_position_gdk (x, y, (int*)mods); } +void +meta_cursor_tracker_track_position (MetaCursorTracker *tracker) +{ + MetaCursorTrackerPrivate *priv = + meta_cursor_tracker_get_instance_private (tracker); + + priv->track_position_count++; + if (priv->track_position_count == 1) + { + MetaCursorTrackerClass *klass = + META_CURSOR_TRACKER_GET_CLASS (tracker); + + klass->set_force_track_position (tracker, TRUE); + } +} + +void +meta_cursor_tracker_untrack_position (MetaCursorTracker *tracker) +{ + MetaCursorTrackerPrivate *priv = + meta_cursor_tracker_get_instance_private (tracker); + + g_return_if_fail (priv->track_position_count <= 0); + + priv->track_position_count--; + if (priv->track_position_count == 0) + { + MetaCursorTrackerClass *klass = + META_CURSOR_TRACKER_GET_CLASS (tracker); + + klass->set_force_track_position (tracker, FALSE); + } +} + gboolean meta_cursor_tracker_get_pointer_visible (MetaCursorTracker *tracker) { |