mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
backends/native: Drop external keyboard detection for ::touch-mode
This cannot be made to work reliably. Some factoids:
- Internal devices may be connected via USB.
- The ACPI spec provides the _PLD (Physical location of device) hook to
determine how is an USB device connected, with an anecdotal success
rate. Internal devices may be seen as external and vice-versa, there is
also an "unknown" value that is widely used.
- There may be non-USB keyboards, the old "AT Translated Set 2 Keyboard"
interface does not change on hotplugging.
- Libinput has an internal series of quirks to classify keyboards as
internal of external, also with an "unknown" value.
These heuristics are kinda hopeless to get right by our own hand. Drop
this external keyboard detection in the hope that there will be something
more deterministic to rely on in the future (e.g. the libinput quirks
made available to us directly or indirectly).
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2378
Related: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2353
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1277
(cherry picked from commit f8e2234ce5
)
This commit is contained in:
parent
a1bc2e0adc
commit
b425f11536
@ -682,7 +682,6 @@ clutter_seat_warp_pointer (ClutterSeat *seat,
|
|||||||
* requirements are fulfilled:
|
* requirements are fulfilled:
|
||||||
*
|
*
|
||||||
* - A touchscreen is available
|
* - A touchscreen is available
|
||||||
* - No external keyboard is attached to the device
|
|
||||||
* - A tablet mode switch, if present, is enabled
|
* - A tablet mode switch, if present, is enabled
|
||||||
*
|
*
|
||||||
* Returns: %TRUE if the device is a tablet that doesn't have an external
|
* Returns: %TRUE if the device is a tablet that doesn't have an external
|
||||||
|
@ -1380,35 +1380,6 @@ has_touchscreen (MetaSeatNative *seat)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
has_external_keyboard (MetaSeatNative *seat)
|
|
||||||
{
|
|
||||||
GList *devices, *l;
|
|
||||||
gboolean has_external = FALSE;
|
|
||||||
|
|
||||||
devices = g_udev_client_query_by_subsystem (seat->udev_client, "input");
|
|
||||||
|
|
||||||
for (l = devices; l; l = l->next)
|
|
||||||
{
|
|
||||||
if (!g_udev_device_has_property (l->data, "ID_INPUT_KEYBOARD"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* May be "hid" or something else, we don't care. This property
|
|
||||||
* will not be present in virtual "AT Translated Set 2 keyboard"
|
|
||||||
* devices.
|
|
||||||
*/
|
|
||||||
if (!g_udev_device_has_property (l->data, "ID_TYPE"))
|
|
||||||
break;
|
|
||||||
|
|
||||||
has_external = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_list_free_full (devices, g_object_unref);
|
|
||||||
|
|
||||||
return has_external;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_touch_mode (MetaSeatNative *seat)
|
update_touch_mode (MetaSeatNative *seat)
|
||||||
{
|
{
|
||||||
@ -1421,10 +1392,10 @@ update_touch_mode (MetaSeatNative *seat)
|
|||||||
else if (seat->has_tablet_switch && !seat->tablet_mode_switch_state)
|
else if (seat->has_tablet_switch && !seat->tablet_mode_switch_state)
|
||||||
touch_mode = FALSE;
|
touch_mode = FALSE;
|
||||||
/* If tablet mode is enabled, or if there is no tablet mode switch
|
/* If tablet mode is enabled, or if there is no tablet mode switch
|
||||||
* (eg. kiosk machines), check availability of external keyboards.
|
* (eg. kiosk machines), assume touch-mode.
|
||||||
*/
|
*/
|
||||||
else
|
else
|
||||||
touch_mode = !seat->has_external_keyboard;
|
touch_mode = TRUE;
|
||||||
|
|
||||||
if (seat->touch_mode != touch_mode)
|
if (seat->touch_mode != touch_mode)
|
||||||
{
|
{
|
||||||
@ -1465,12 +1436,7 @@ evdev_add_device (MetaSeatNative *seat,
|
|||||||
|
|
||||||
g_signal_emit_by_name (seat, "device-added", device);
|
g_signal_emit_by_name (seat, "device-added", device);
|
||||||
|
|
||||||
if (type == CLUTTER_KEYBOARD_DEVICE)
|
if (type == CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
{
|
|
||||||
seat->has_external_keyboard = has_external_keyboard (seat);
|
|
||||||
check_touch_mode = TRUE;
|
|
||||||
}
|
|
||||||
else if (type == CLUTTER_TOUCHSCREEN_DEVICE)
|
|
||||||
{
|
{
|
||||||
seat->has_touchscreen = TRUE;
|
seat->has_touchscreen = TRUE;
|
||||||
check_touch_mode = TRUE;
|
check_touch_mode = TRUE;
|
||||||
@ -1503,12 +1469,7 @@ evdev_remove_device (MetaSeatNative *seat,
|
|||||||
|
|
||||||
device_type = clutter_input_device_get_device_type (device);
|
device_type = clutter_input_device_get_device_type (device);
|
||||||
|
|
||||||
if (device_type == CLUTTER_KEYBOARD_DEVICE)
|
if (device_type == CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
{
|
|
||||||
seat->has_external_keyboard = has_external_keyboard (seat);
|
|
||||||
update_touch_mode (seat);
|
|
||||||
}
|
|
||||||
else if (device_type == CLUTTER_TOUCHSCREEN_DEVICE)
|
|
||||||
{
|
{
|
||||||
seat->has_touchscreen = has_touchscreen (seat);
|
seat->has_touchscreen = has_touchscreen (seat);
|
||||||
update_touch_mode (seat);
|
update_touch_mode (seat);
|
||||||
@ -2553,7 +2514,6 @@ meta_seat_native_constructed (GObject *object)
|
|||||||
xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL);
|
xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL);
|
||||||
}
|
}
|
||||||
|
|
||||||
seat->has_external_keyboard = has_external_keyboard (seat);
|
|
||||||
seat->has_touchscreen = has_touchscreen (seat);
|
seat->has_touchscreen = has_touchscreen (seat);
|
||||||
update_touch_mode (seat);
|
update_touch_mode (seat);
|
||||||
|
|
||||||
|
@ -120,7 +120,6 @@ struct _MetaSeatNative
|
|||||||
|
|
||||||
GUdevClient *udev_client;
|
GUdevClient *udev_client;
|
||||||
guint tablet_mode_switch_state : 1;
|
guint tablet_mode_switch_state : 1;
|
||||||
guint has_external_keyboard : 1;
|
|
||||||
guint has_touchscreen : 1;
|
guint has_touchscreen : 1;
|
||||||
guint has_tablet_switch : 1;
|
guint has_tablet_switch : 1;
|
||||||
guint touch_mode : 1;
|
guint touch_mode : 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user