mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
backends/x11: Implement ClutterSeat::touch-mode for the X11 backend
This only checks touchscreen availability as we have no access to tablet-mode switch events as we do on the native backend. Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1242 https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1278
This commit is contained in:
parent
a3cc62c285
commit
38bbd9593b
@ -38,7 +38,10 @@ enum
|
|||||||
PROP_OPCODE,
|
PROP_OPCODE,
|
||||||
PROP_POINTER_ID,
|
PROP_POINTER_ID,
|
||||||
PROP_KEYBOARD_ID,
|
PROP_KEYBOARD_ID,
|
||||||
N_PROPS
|
N_PROPS,
|
||||||
|
|
||||||
|
/* This property is overridden */
|
||||||
|
PROP_TOUCH_MODE,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaSeatX11
|
struct _MetaSeatX11
|
||||||
@ -54,6 +57,8 @@ struct _MetaSeatX11
|
|||||||
int pointer_id;
|
int pointer_id;
|
||||||
int keyboard_id;
|
int keyboard_id;
|
||||||
int opcode;
|
int opcode;
|
||||||
|
guint has_touchscreens : 1;
|
||||||
|
guint touch_mode : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static GParamSpec *props[N_PROPS] = { 0 };
|
static GParamSpec *props[N_PROPS] = { 0 };
|
||||||
@ -605,6 +610,20 @@ pad_passive_button_grab (ClutterInputDevice *device)
|
|||||||
g_free (xi_event_mask.mask);
|
g_free (xi_event_mask.mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_touch_mode (MetaSeatX11 *seat_x11)
|
||||||
|
{
|
||||||
|
gboolean touch_mode;
|
||||||
|
|
||||||
|
touch_mode = seat_x11->has_touchscreens;
|
||||||
|
|
||||||
|
if (seat_x11->touch_mode == touch_mode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
seat_x11->touch_mode = touch_mode;
|
||||||
|
g_object_notify (G_OBJECT (seat_x11), "touch-mode");
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterInputDevice *
|
static ClutterInputDevice *
|
||||||
add_device (MetaSeatX11 *seat_x11,
|
add_device (MetaSeatX11 *seat_x11,
|
||||||
ClutterBackend *backend,
|
ClutterBackend *backend,
|
||||||
@ -635,6 +654,8 @@ add_device (MetaSeatX11 *seat_x11,
|
|||||||
info->attachment == seat_x11->keyboard_id))
|
info->attachment == seat_x11->keyboard_id))
|
||||||
{
|
{
|
||||||
seat_x11->devices = g_list_prepend (seat_x11->devices, device);
|
seat_x11->devices = g_list_prepend (seat_x11->devices, device);
|
||||||
|
seat_x11->has_touchscreens |=
|
||||||
|
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -663,18 +684,38 @@ add_device (MetaSeatX11 *seat_x11,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_touch_mode (seat_x11);
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
has_touchscreens (MetaSeatX11 *seat_x11)
|
||||||
|
{
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
for (l = seat_x11->devices; l; l = l->next)
|
||||||
|
{
|
||||||
|
if (clutter_input_device_get_device_type (l->data) == CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_device (MetaSeatX11 *seat_x11,
|
remove_device (MetaSeatX11 *seat_x11,
|
||||||
int device_id)
|
int device_id)
|
||||||
{
|
{
|
||||||
ClutterInputDevice *device;
|
ClutterInputDevice *device;
|
||||||
|
gboolean check_touchscreens = FALSE;
|
||||||
|
|
||||||
device = g_hash_table_lookup (seat_x11->devices_by_id,
|
device = g_hash_table_lookup (seat_x11->devices_by_id,
|
||||||
GINT_TO_POINTER (device_id));
|
GINT_TO_POINTER (device_id));
|
||||||
|
|
||||||
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
|
check_touchscreens = TRUE;
|
||||||
|
|
||||||
if (device != NULL)
|
if (device != NULL)
|
||||||
{
|
{
|
||||||
if (seat_x11->core_pointer == device)
|
if (seat_x11->core_pointer == device)
|
||||||
@ -695,6 +736,12 @@ remove_device (MetaSeatX11 *seat_x11,
|
|||||||
g_hash_table_remove (seat_x11->devices_by_id,
|
g_hash_table_remove (seat_x11->devices_by_id,
|
||||||
GINT_TO_POINTER (device_id));
|
GINT_TO_POINTER (device_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (check_touchscreens)
|
||||||
|
{
|
||||||
|
seat_x11->has_touchscreens = has_touchscreens (seat_x11);
|
||||||
|
update_touch_mode (seat_x11);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1272,6 +1319,7 @@ meta_seat_x11_set_property (GObject *object,
|
|||||||
case PROP_KEYBOARD_ID:
|
case PROP_KEYBOARD_ID:
|
||||||
seat_x11->keyboard_id = g_value_get_int (value);
|
seat_x11->keyboard_id = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_TOUCH_MODE:
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@ -1296,6 +1344,9 @@ meta_seat_x11_get_property (GObject *object,
|
|||||||
case PROP_KEYBOARD_ID:
|
case PROP_KEYBOARD_ID:
|
||||||
g_value_set_int (value, seat_x11->keyboard_id);
|
g_value_set_int (value, seat_x11->keyboard_id);
|
||||||
break;
|
break;
|
||||||
|
case PROP_TOUCH_MODE:
|
||||||
|
g_value_set_boolean (value, seat_x11->touch_mode);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@ -1547,6 +1598,9 @@ meta_seat_x11_class_init (MetaSeatX11Class *klass)
|
|||||||
G_PARAM_CONSTRUCT_ONLY);
|
G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
|
||||||
g_object_class_install_properties (object_class, N_PROPS, props);
|
g_object_class_install_properties (object_class, N_PROPS, props);
|
||||||
|
|
||||||
|
g_object_class_override_property (object_class, PROP_TOUCH_MODE,
|
||||||
|
"touch-mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user