remote-desktop/session: Handle unable to transform coordinate gracefully

There may be a race between the ability to turn stream relative input
coordinates and turning them into screen coordinates, due to the future
scenario where the entity backing a stream is created and managed ad-hoc
depending on PipeWire stream negotiations.

When an input event is sent during this time, drop it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1698>
This commit is contained in:
Jonas Ådahl 2021-01-30 23:52:00 +01:00 committed by Marge Bot
parent 9b1b4eb843
commit 688280f82d
6 changed files with 57 additions and 36 deletions

View File

@ -678,11 +678,17 @@ handle_notify_pointer_motion_absolute (MetaDBusRemoteDesktopSession *skeleton,
return TRUE; return TRUE;
} }
meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y); if (meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y))
{
clutter_virtual_input_device_notify_absolute_motion (session->virtual_pointer, clutter_virtual_input_device_notify_absolute_motion (session->virtual_pointer,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
abs_x, abs_y); abs_x, abs_y);
}
else
{
meta_topic (META_DEBUG_REMOTE_DESKTOP,
"Dropping early absolute pointer motion (%f, %f)", x, y);
}
meta_dbus_remote_desktop_session_complete_notify_pointer_motion_absolute (skeleton, meta_dbus_remote_desktop_session_complete_notify_pointer_motion_absolute (skeleton,
invocation); invocation);
@ -731,12 +737,18 @@ handle_notify_touch_down (MetaDBusRemoteDesktopSession *skeleton,
return TRUE; return TRUE;
} }
meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y); if (meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y))
{
clutter_virtual_input_device_notify_touch_down (session->virtual_touchscreen, clutter_virtual_input_device_notify_touch_down (session->virtual_touchscreen,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
slot, slot,
abs_x, abs_y); abs_x, abs_y);
}
else
{
meta_topic (META_DEBUG_REMOTE_DESKTOP,
"Dropping early touch down (%f, %f)", x, y);
}
meta_dbus_remote_desktop_session_complete_notify_touch_down (skeleton, meta_dbus_remote_desktop_session_complete_notify_touch_down (skeleton,
invocation); invocation);
@ -786,12 +798,18 @@ handle_notify_touch_motion (MetaDBusRemoteDesktopSession *skeleton,
return TRUE; return TRUE;
} }
meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y); if (meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y))
{
clutter_virtual_input_device_notify_touch_motion (session->virtual_touchscreen, clutter_virtual_input_device_notify_touch_motion (session->virtual_touchscreen,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
slot, slot,
abs_x, abs_y); abs_x, abs_y);
}
else
{
meta_topic (META_DEBUG_REMOTE_DESKTOP,
"Dropping early touch motion (%f, %f)", x, y);
}
meta_dbus_remote_desktop_session_complete_notify_touch_motion (skeleton, meta_dbus_remote_desktop_session_complete_notify_touch_motion (skeleton,
invocation); invocation);

View File

@ -148,7 +148,7 @@ meta_screen_cast_area_stream_set_parameters (MetaScreenCastStream *stream,
area_stream->area.height)); area_stream->area.height));
} }
static void static gboolean
meta_screen_cast_area_stream_transform_position (MetaScreenCastStream *stream, meta_screen_cast_area_stream_transform_position (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
@ -160,6 +160,8 @@ meta_screen_cast_area_stream_transform_position (MetaScreenCastStream *stream,
*x = area_stream->area.x + (int) roundf (stream_x / area_stream->scale); *x = area_stream->area.x + (int) roundf (stream_x / area_stream->scale);
*y = area_stream->area.y + (int) roundf (stream_y / area_stream->scale); *y = area_stream->area.y + (int) roundf (stream_y / area_stream->scale);
return TRUE;
} }
static void static void

View File

@ -184,7 +184,7 @@ meta_screen_cast_monitor_stream_set_parameters (MetaScreenCastStream *stream,
logical_monitor_layout.height)); logical_monitor_layout.height));
} }
static void static gboolean
meta_screen_cast_monitor_stream_transform_position (MetaScreenCastStream *stream, meta_screen_cast_monitor_stream_transform_position (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
@ -200,6 +200,8 @@ meta_screen_cast_monitor_stream_transform_position (MetaScreenCastStream *stream
*x = logical_monitor_layout.x + stream_x; *x = logical_monitor_layout.x + stream_x;
*y = logical_monitor_layout.y + stream_y; *y = logical_monitor_layout.y + stream_y;
return TRUE;
} }
static void static void

View File

@ -177,18 +177,16 @@ meta_screen_cast_stream_get_src (MetaScreenCastStream *stream)
return priv->src; return priv->src;
} }
void gboolean
meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream, meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
double *x, double *x,
double *y) double *y)
{ {
META_SCREEN_CAST_STREAM_GET_CLASS (stream)->transform_position (stream, MetaScreenCastStreamClass *klass = META_SCREEN_CAST_STREAM_GET_CLASS (stream);
stream_x,
stream_y, return klass->transform_position (stream, stream_x, stream_y, x, y);
x,
y);
} }
MetaScreenCastCursorMode MetaScreenCastCursorMode

View File

@ -43,11 +43,11 @@ struct _MetaScreenCastStreamClass
GError **error); GError **error);
void (* set_parameters) (MetaScreenCastStream *stream, void (* set_parameters) (MetaScreenCastStream *stream,
GVariantBuilder *parameters_builder); GVariantBuilder *parameters_builder);
void (* transform_position) (MetaScreenCastStream *stream, gboolean (* transform_position) (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
double *x, double *x,
double *y); double *y);
}; };
MetaScreenCastSession * meta_screen_cast_stream_get_session (MetaScreenCastStream *stream); MetaScreenCastSession * meta_screen_cast_stream_get_session (MetaScreenCastStream *stream);
@ -61,11 +61,11 @@ char * meta_screen_cast_stream_get_object_path (MetaScreenCastStream *stream);
MetaScreenCastStreamSrc * meta_screen_cast_stream_get_src (MetaScreenCastStream *stream); MetaScreenCastStreamSrc * meta_screen_cast_stream_get_src (MetaScreenCastStream *stream);
void meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream, gboolean meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
double *x, double *x,
double *y); double *y);
MetaScreenCastCursorMode meta_screen_cast_stream_get_cursor_mode (MetaScreenCastStream *stream); MetaScreenCastCursorMode meta_screen_cast_stream_get_cursor_mode (MetaScreenCastStream *stream);

View File

@ -128,7 +128,7 @@ meta_screen_cast_window_stream_set_parameters (MetaScreenCastStream *stream,
window_stream->logical_height)); window_stream->logical_height));
} }
static void static gboolean
meta_screen_cast_window_stream_transform_position (MetaScreenCastStream *stream, meta_screen_cast_window_stream_transform_position (MetaScreenCastStream *stream,
double stream_x, double stream_x,
double stream_y, double stream_y,
@ -145,6 +145,7 @@ meta_screen_cast_window_stream_transform_position (MetaScreenCastStream *stream,
stream_y, stream_y,
x, x,
y); y);
return TRUE;
} }
static void static void