summaryrefslogtreecommitdiff
path: root/src/backends/native/meta-seat-native.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/native/meta-seat-native.c')
-rw-r--r--src/backends/native/meta-seat-native.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 222acbd0b..63caeff26 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -2603,6 +2603,7 @@ meta_seat_native_finalize (GObject *object)
}
g_slist_free (seat->devices);
g_free (seat->touch_states);
+ g_hash_table_destroy (seat->reserved_virtual_slots);
g_object_unref (seat->udev_client);
@@ -2700,16 +2701,51 @@ meta_seat_native_apply_kbd_a11y_settings (ClutterSeat *seat,
settings);
}
+static guint
+bump_virtual_touch_slot_base (MetaSeatNative *seat_native)
+{
+ while (TRUE)
+ {
+ if (seat_native->virtual_touch_slot_base < 0x100)
+ seat_native->virtual_touch_slot_base = 0x100;
+
+ seat_native->virtual_touch_slot_base +=
+ CLUTTER_VIRTUAL_INPUT_DEVICE_MAX_TOUCH_SLOTS;
+
+ if (!g_hash_table_lookup (seat_native->reserved_virtual_slots,
+ GUINT_TO_POINTER (seat_native->virtual_touch_slot_base)))
+ break;
+ }
+
+ return seat_native->virtual_touch_slot_base;
+}
+
static ClutterVirtualInputDevice *
meta_seat_native_create_virtual_device (ClutterSeat *seat,
ClutterInputDeviceType device_type)
{
+ MetaSeatNative *seat_native = META_SEAT_NATIVE (seat);
+ guint slot_base;
+
+ slot_base = bump_virtual_touch_slot_base (seat_native);
+ g_hash_table_add (seat_native->reserved_virtual_slots,
+ GUINT_TO_POINTER (slot_base));
+
return g_object_new (META_TYPE_VIRTUAL_INPUT_DEVICE_NATIVE,
"seat", seat,
+ "slot-base", slot_base,
"device-type", device_type,
NULL);
}
+void
+meta_seat_native_release_touch_slots (MetaSeatNative *seat,
+ guint base_slot)
+{
+ g_hash_table_remove (seat->reserved_virtual_slots,
+ GUINT_TO_POINTER (base_slot));
+}
+
static ClutterVirtualDeviceType
meta_seat_native_get_supported_virtual_device_types (ClutterSeat *seat)
{
@@ -2854,6 +2890,8 @@ meta_seat_native_init (MetaSeatNative *seat)
seat->repeat = TRUE;
seat->repeat_delay = 250; /* ms */
seat->repeat_interval = 33; /* ms */
+
+ seat->reserved_virtual_slots = g_hash_table_new (NULL, NULL);
}
void