virtual-input-device/native: Drop the separate "seat" property

The "seat" property is already used by the parent
ClutterVirtualInputDevice - re-using this property means the parent's
propery never gets set so clutter_virtual_input_device_get_seat()
returns NULL.

This causes mutter to crash if a tablet pad sends a key event via a pad
ring or strip.

Since this type is only ever constructed with a MetaSeatNative as seat
we can extract that object through the parent and drop our property.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4247>
This commit is contained in:
Peter Hutterer 2025-02-05 09:21:27 +10:00 committed by Marge Bot
parent 502e762ad0
commit 751277a7ef

View File

@ -33,7 +33,6 @@ enum
{ {
PROP_0, PROP_0,
PROP_SEAT,
PROP_SLOT_BASE, PROP_SLOT_BASE,
PROP_LAST PROP_LAST
@ -54,7 +53,6 @@ struct _MetaVirtualInputDeviceNative
{ {
ClutterVirtualInputDevice parent; ClutterVirtualInputDevice parent;
MetaSeatNative *seat;
guint slot_base; guint slot_base;
ImplState *impl_state; ImplState *impl_state;
}; };
@ -204,12 +202,22 @@ release_device_in_impl (GTask *task)
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
static MetaSeatNative*
meta_virtual_input_device_native_get_seat_native (MetaVirtualInputDeviceNative *virtual_native)
{
ClutterSeat *seat =
clutter_virtual_input_device_get_seat (CLUTTER_VIRTUAL_INPUT_DEVICE (virtual_native));
return META_SEAT_NATIVE (seat);
}
static gboolean static gboolean
notify_relative_motion_in_impl (GTask *task) notify_relative_motion_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventMotion *event = g_task_get_task_data (task); MetaVirtualEventMotion *event = g_task_get_task_data (task);
if (event->time_us == CLUTTER_CURRENT_TIME) if (event->time_us == CLUTTER_CURRENT_TIME)
@ -236,6 +244,8 @@ meta_virtual_input_device_native_notify_relative_motion (ClutterVirtualInputDevi
MetaVirtualEventMotion *event; MetaVirtualEventMotion *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -247,7 +257,7 @@ meta_virtual_input_device_native_notify_relative_motion (ClutterVirtualInputDevi
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_relative_motion_in_impl); (GSourceFunc) notify_relative_motion_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -257,7 +267,9 @@ notify_absolute_motion_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventMotion *event = g_task_get_task_data (task); MetaVirtualEventMotion *event = g_task_get_task_data (task);
if (event->time_us == CLUTTER_CURRENT_TIME) if (event->time_us == CLUTTER_CURRENT_TIME)
@ -282,6 +294,8 @@ meta_virtual_input_device_native_notify_absolute_motion (ClutterVirtualInputDevi
MetaVirtualEventMotion *event; MetaVirtualEventMotion *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -293,7 +307,7 @@ meta_virtual_input_device_native_notify_absolute_motion (ClutterVirtualInputDevi
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_absolute_motion_in_impl); (GSourceFunc) notify_absolute_motion_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -303,7 +317,9 @@ notify_button_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventButton *event = g_task_get_task_data (task); MetaVirtualEventButton *event = g_task_get_task_data (task);
int button_count; int button_count;
int evdev_button; int evdev_button;
@ -356,6 +372,8 @@ meta_virtual_input_device_native_notify_button (ClutterVirtualInputDevice *virtu
MetaVirtualEventButton *event; MetaVirtualEventButton *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -367,7 +385,7 @@ meta_virtual_input_device_native_notify_button (ClutterVirtualInputDevice *virtu
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_button_in_impl); (GSourceFunc) notify_button_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -377,7 +395,9 @@ notify_key_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventKey *event = g_task_get_task_data (task); MetaVirtualEventKey *event = g_task_get_task_data (task);
int key_count; int key_count;
@ -426,6 +446,8 @@ meta_virtual_input_device_native_notify_key (ClutterVirtualInputDevice *virtual_
MetaVirtualEventKey *event; MetaVirtualEventKey *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -437,7 +459,7 @@ meta_virtual_input_device_native_notify_key (ClutterVirtualInputDevice *virtual_
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_key_in_impl); (GSourceFunc) notify_key_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -450,6 +472,8 @@ pick_keycode_for_keyval_in_current_group_in_impl (ClutterVirtualInputDevice *vir
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
ClutterSeat *seat; ClutterSeat *seat;
ClutterKeymap *keymap; ClutterKeymap *keymap;
struct xkb_keymap *xkb_keymap; struct xkb_keymap *xkb_keymap;
@ -460,7 +484,7 @@ pick_keycode_for_keyval_in_current_group_in_impl (ClutterVirtualInputDevice *vir
seat = clutter_virtual_input_device_get_seat (virtual_device); seat = clutter_virtual_input_device_get_seat (virtual_device);
keymap = clutter_seat_get_keymap (seat); keymap = clutter_seat_get_keymap (seat);
xkb_keymap = meta_keymap_native_get_keyboard_map_in_impl (META_KEYMAP_NATIVE (keymap)); xkb_keymap = meta_keymap_native_get_keyboard_map_in_impl (META_KEYMAP_NATIVE (keymap));
state = meta_seat_impl_get_xkb_state_in_impl (virtual_native->seat->impl); state = meta_seat_impl_get_xkb_state_in_impl (seat_native->impl);
layout = xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE); layout = xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE);
min_keycode = xkb_keymap_min_keycode (xkb_keymap); min_keycode = xkb_keymap_min_keycode (xkb_keymap);
@ -498,6 +522,8 @@ apply_level_modifiers_in_impl (ClutterVirtualInputDevice *virtual_device,
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
guint keysym, keycode, evcode; guint keysym, keycode, evcode;
if (level == 0) if (level == 0)
@ -528,7 +554,7 @@ apply_level_modifiers_in_impl (ClutterVirtualInputDevice *virtual_device,
key_state == CLUTTER_KEY_STATE_PRESSED ? "press" : "release", key_state == CLUTTER_KEY_STATE_PRESSED ? "press" : "release",
evcode, virtual_device); evcode, virtual_device);
meta_seat_impl_notify_key_in_impl (virtual_native->seat->impl, meta_seat_impl_notify_key_in_impl (seat_native->impl,
virtual_native->impl_state->device, virtual_native->impl_state->device,
time_us, time_us,
evcode, evcode,
@ -543,7 +569,9 @@ notify_keyval_in_impl (GTask *task)
g_task_get_source_object (task); g_task_get_source_object (task);
ClutterVirtualInputDevice *virtual_device = ClutterVirtualInputDevice *virtual_device =
CLUTTER_VIRTUAL_INPUT_DEVICE (virtual_native); CLUTTER_VIRTUAL_INPUT_DEVICE (virtual_native);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventKey *event = g_task_get_task_data (task); MetaVirtualEventKey *event = g_task_get_task_data (task);
int key_count; int key_count;
guint keycode = 0, level = 0, evcode = 0; guint keycode = 0, level = 0, evcode = 0;
@ -616,6 +644,8 @@ meta_virtual_input_device_native_notify_keyval (ClutterVirtualInputDevice *virtu
MetaVirtualEventKey *event; MetaVirtualEventKey *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -627,7 +657,7 @@ meta_virtual_input_device_native_notify_keyval (ClutterVirtualInputDevice *virtu
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_keyval_in_impl); (GSourceFunc) notify_keyval_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -666,7 +696,9 @@ notify_discrete_scroll_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventScroll *event = g_task_get_task_data (task); MetaVirtualEventScroll *event = g_task_get_task_data (task);
double discrete_dx = 0.0, discrete_dy = 0.0; double discrete_dx = 0.0, discrete_dy = 0.0;
@ -695,6 +727,8 @@ meta_virtual_input_device_native_notify_discrete_scroll (ClutterVirtualInputDevi
MetaVirtualEventScroll *event; MetaVirtualEventScroll *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -706,7 +740,7 @@ meta_virtual_input_device_native_notify_discrete_scroll (ClutterVirtualInputDevi
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_discrete_scroll_in_impl); (GSourceFunc) notify_discrete_scroll_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -716,7 +750,9 @@ notify_scroll_continuous_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventScroll *event = g_task_get_task_data (task); MetaVirtualEventScroll *event = g_task_get_task_data (task);
if (event->time_us == CLUTTER_CURRENT_TIME) if (event->time_us == CLUTTER_CURRENT_TIME)
@ -756,6 +792,8 @@ meta_virtual_input_device_native_notify_scroll_continuous (ClutterVirtualInputDe
MetaVirtualEventScroll *event; MetaVirtualEventScroll *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -769,7 +807,7 @@ meta_virtual_input_device_native_notify_scroll_continuous (ClutterVirtualInputDe
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_scroll_continuous_in_impl); (GSourceFunc) notify_scroll_continuous_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -779,7 +817,9 @@ notify_touch_down_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventTouch *event = g_task_get_task_data (task); MetaVirtualEventTouch *event = g_task_get_task_data (task);
MetaTouchState *touch_state; MetaTouchState *touch_state;
@ -817,6 +857,8 @@ meta_virtual_input_device_native_notify_touch_down (ClutterVirtualInputDevice *v
MetaVirtualEventTouch *event; MetaVirtualEventTouch *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -829,7 +871,7 @@ meta_virtual_input_device_native_notify_touch_down (ClutterVirtualInputDevice *v
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_touch_down_in_impl); (GSourceFunc) notify_touch_down_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -839,7 +881,9 @@ notify_touch_motion_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventTouch *event = g_task_get_task_data (task); MetaVirtualEventTouch *event = g_task_get_task_data (task);
MetaTouchState *touch_state; MetaTouchState *touch_state;
@ -877,6 +921,8 @@ meta_virtual_input_device_native_notify_touch_motion (ClutterVirtualInputDevice
MetaVirtualEventTouch *event; MetaVirtualEventTouch *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -889,7 +935,7 @@ meta_virtual_input_device_native_notify_touch_motion (ClutterVirtualInputDevice
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_touch_motion_in_impl); (GSourceFunc) notify_touch_motion_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -899,7 +945,9 @@ notify_touch_up_in_impl (GTask *task)
{ {
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat = seat_native->impl;
MetaVirtualEventTouch *event = g_task_get_task_data (task); MetaVirtualEventTouch *event = g_task_get_task_data (task);
MetaTouchState *touch_state; MetaTouchState *touch_state;
@ -919,7 +967,7 @@ notify_touch_up_in_impl (GTask *task)
touch_state->coords.x, touch_state->coords.x,
touch_state->coords.y); touch_state->coords.y);
meta_seat_impl_release_touch_state_in_impl (virtual_native->seat->impl, meta_seat_impl_release_touch_state_in_impl (seat_native->impl,
touch_state->seat_slot); touch_state->seat_slot);
out: out:
@ -935,6 +983,8 @@ meta_virtual_input_device_native_notify_touch_up (ClutterVirtualInputDevice *vir
MetaVirtualEventTouch *event; MetaVirtualEventTouch *event;
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device); META_VIRTUAL_INPUT_DEVICE_NATIVE (virtual_device);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GTask *task; GTask *task;
g_return_if_fail (virtual_native->impl_state != NULL); g_return_if_fail (virtual_native->impl_state != NULL);
@ -945,7 +995,7 @@ meta_virtual_input_device_native_notify_touch_up (ClutterVirtualInputDevice *vir
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, event, g_free); g_task_set_task_data (task, event, g_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) notify_touch_up_in_impl); (GSourceFunc) notify_touch_up_in_impl);
g_object_unref (task); g_object_unref (task);
} }
@ -961,9 +1011,6 @@ meta_virtual_input_device_native_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_SEAT:
g_value_set_pointer (value, virtual_native->seat);
break;
case PROP_SLOT_BASE: case PROP_SLOT_BASE:
g_value_set_uint (value, virtual_native->slot_base); g_value_set_uint (value, virtual_native->slot_base);
break; break;
@ -984,9 +1031,6 @@ meta_virtual_input_device_native_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_SEAT:
virtual_native->seat = g_value_get_pointer (value);
break;
case PROP_SLOT_BASE: case PROP_SLOT_BASE:
virtual_native->slot_base = g_value_get_uint (value); virtual_native->slot_base = g_value_get_uint (value);
break; break;
@ -1002,7 +1046,9 @@ create_device_in_impl (GTask *task)
ImplState *impl_state = g_task_get_task_data (task); ImplState *impl_state = g_task_get_task_data (task);
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
g_task_get_source_object (task); g_task_get_source_object (task);
MetaSeatImpl *seat_impl = virtual_native->seat->impl; MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
MetaSeatImpl *seat_impl = seat_native->impl;
ClutterVirtualInputDevice *virtual_device = ClutterVirtualInputDevice *virtual_device =
CLUTTER_VIRTUAL_INPUT_DEVICE (virtual_native); CLUTTER_VIRTUAL_INPUT_DEVICE (virtual_native);
ClutterInputDeviceType device_type = ClutterInputDeviceType device_type =
@ -1026,6 +1072,8 @@ meta_virtual_input_device_native_constructed (GObject *object)
CLUTTER_VIRTUAL_INPUT_DEVICE (object); CLUTTER_VIRTUAL_INPUT_DEVICE (object);
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (object); META_VIRTUAL_INPUT_DEVICE_NATIVE (object);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
ClutterInputDeviceType device_type; ClutterInputDeviceType device_type;
g_autoptr (GTask) task = NULL; g_autoptr (GTask) task = NULL;
@ -1039,7 +1087,7 @@ meta_virtual_input_device_native_constructed (GObject *object)
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, virtual_native->impl_state, NULL); g_task_set_task_data (task, virtual_native->impl_state, NULL);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) create_device_in_impl); (GSourceFunc) create_device_in_impl);
} }
@ -1057,6 +1105,8 @@ meta_virtual_input_device_native_dispose (GObject *object)
CLUTTER_VIRTUAL_INPUT_DEVICE (object); CLUTTER_VIRTUAL_INPUT_DEVICE (object);
MetaVirtualInputDeviceNative *virtual_native = MetaVirtualInputDeviceNative *virtual_native =
META_VIRTUAL_INPUT_DEVICE_NATIVE (object); META_VIRTUAL_INPUT_DEVICE_NATIVE (object);
MetaSeatNative *seat_native =
meta_virtual_input_device_native_get_seat_native (virtual_native);
GObjectClass *object_class = GObjectClass *object_class =
G_OBJECT_CLASS (meta_virtual_input_device_native_parent_class); G_OBJECT_CLASS (meta_virtual_input_device_native_parent_class);
@ -1067,14 +1117,14 @@ meta_virtual_input_device_native_dispose (GObject *object)
task = g_task_new (virtual_device, NULL, NULL, NULL); task = g_task_new (virtual_device, NULL, NULL, NULL);
g_task_set_task_data (task, virtual_native->impl_state, g_task_set_task_data (task, virtual_native->impl_state,
(GDestroyNotify) impl_state_free); (GDestroyNotify) impl_state_free);
meta_seat_impl_run_input_task (virtual_native->seat->impl, task, meta_seat_impl_run_input_task (seat_native->impl, task,
(GSourceFunc) release_device_in_impl); (GSourceFunc) release_device_in_impl);
g_object_unref (task); g_object_unref (task);
virtual_native->impl_state = NULL; virtual_native->impl_state = NULL;
} }
meta_seat_native_release_touch_slots (virtual_native->seat, meta_seat_native_release_touch_slots (seat_native,
virtual_native->slot_base); virtual_native->slot_base);
object_class->dispose (object); object_class->dispose (object);
@ -1108,10 +1158,6 @@ meta_virtual_input_device_native_class_init (MetaVirtualInputDeviceNativeClass *
virtual_input_device_class->notify_touch_motion = meta_virtual_input_device_native_notify_touch_motion; virtual_input_device_class->notify_touch_motion = meta_virtual_input_device_native_notify_touch_motion;
virtual_input_device_class->notify_touch_up = meta_virtual_input_device_native_notify_touch_up; virtual_input_device_class->notify_touch_up = meta_virtual_input_device_native_notify_touch_up;
obj_props[PROP_SEAT] = g_param_spec_pointer ("seat", NULL, NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY);
obj_props[PROP_SLOT_BASE] = g_param_spec_uint ("slot-base", NULL, NULL, obj_props[PROP_SLOT_BASE] = g_param_spec_uint ("slot-base", NULL, NULL,
0, G_MAXUINT, 0, 0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_READWRITE |