|
|
|
@@ -293,13 +293,6 @@ on_device_added (ClutterDeviceManager *device_manager,
|
|
|
|
|
create_device_monitor (backend, device_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline gboolean
|
|
|
|
|
device_is_slave_touchscreen (ClutterInputDevice *device)
|
|
|
|
|
{
|
|
|
|
|
return (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
|
|
|
|
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline gboolean
|
|
|
|
|
check_has_pointing_device (ClutterDeviceManager *manager)
|
|
|
|
|
{
|
|
|
|
@@ -316,6 +309,9 @@ check_has_pointing_device (ClutterDeviceManager *manager)
|
|
|
|
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
|
|
|
|
|
clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE)
|
|
|
|
|
continue;
|
|
|
|
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE &&
|
|
|
|
|
meta_is_wayland_compositor ())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
@@ -324,9 +320,10 @@ check_has_pointing_device (ClutterDeviceManager *manager)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline gboolean
|
|
|
|
|
check_has_slave_touchscreen (ClutterDeviceManager *manager)
|
|
|
|
|
check_pointer_visibility (ClutterDeviceManager *manager)
|
|
|
|
|
{
|
|
|
|
|
const GSList *devices;
|
|
|
|
|
gboolean pointer_visible = TRUE;
|
|
|
|
|
|
|
|
|
|
devices = clutter_device_manager_peek_devices (manager);
|
|
|
|
|
|
|
|
|
@@ -334,12 +331,19 @@ check_has_slave_touchscreen (ClutterDeviceManager *manager)
|
|
|
|
|
{
|
|
|
|
|
ClutterInputDevice *device = devices->data;
|
|
|
|
|
|
|
|
|
|
if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
|
|
|
|
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
|
|
|
|
|
return TRUE;
|
|
|
|
|
if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_SLAVE)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
|
|
|
|
|
(clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE &&
|
|
|
|
|
meta_is_wayland_compositor ()))
|
|
|
|
|
{
|
|
|
|
|
pointer_visible = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
return pointer_visible;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
@@ -359,26 +363,16 @@ on_device_removed (ClutterDeviceManager *device_manager,
|
|
|
|
|
if (priv->current_device_id == device_id)
|
|
|
|
|
{
|
|
|
|
|
MetaCursorTracker *cursor_tracker = priv->cursor_tracker;
|
|
|
|
|
gboolean has_touchscreen, has_pointing_device;
|
|
|
|
|
ClutterInputDeviceType device_type;
|
|
|
|
|
gboolean pointer_hidden, has_pointing_device;
|
|
|
|
|
|
|
|
|
|
priv->current_device_id = 0;
|
|
|
|
|
|
|
|
|
|
device_type = clutter_input_device_get_device_type (device);
|
|
|
|
|
has_touchscreen = check_has_slave_touchscreen (device_manager);
|
|
|
|
|
pointer_hidden = !check_pointer_visibility (device_manager);
|
|
|
|
|
has_pointing_device = check_has_pointing_device (device_manager);
|
|
|
|
|
|
|
|
|
|
if (device_type == CLUTTER_TOUCHSCREEN_DEVICE && has_touchscreen)
|
|
|
|
|
{
|
|
|
|
|
/* There's more touchscreens left, keep the pointer hidden */
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
|
|
|
|
}
|
|
|
|
|
else if (device_type != CLUTTER_KEYBOARD_DEVICE)
|
|
|
|
|
{
|
|
|
|
|
has_pointing_device = check_has_pointing_device (device_manager);
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker,
|
|
|
|
|
has_pointing_device &&
|
|
|
|
|
!has_touchscreen);
|
|
|
|
|
}
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker,
|
|
|
|
|
has_pointing_device &&
|
|
|
|
|
!pointer_hidden);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -405,20 +399,11 @@ set_initial_pointer_visibility (MetaBackend *backend,
|
|
|
|
|
ClutterDeviceManager *device_manager)
|
|
|
|
|
{
|
|
|
|
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
|
|
|
|
const GSList *devices;
|
|
|
|
|
const GSList *l;
|
|
|
|
|
gboolean has_touchscreen = FALSE;
|
|
|
|
|
|
|
|
|
|
devices = clutter_device_manager_peek_devices (device_manager);
|
|
|
|
|
for (l = devices; l; l = l->next)
|
|
|
|
|
{
|
|
|
|
|
ClutterInputDevice *device = l->data;
|
|
|
|
|
|
|
|
|
|
has_touchscreen |= device_is_slave_touchscreen (device);
|
|
|
|
|
}
|
|
|
|
|
gboolean pointer_visible;
|
|
|
|
|
|
|
|
|
|
pointer_visible = check_pointer_visibility (device_manager);
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (priv->cursor_tracker,
|
|
|
|
|
!has_touchscreen);
|
|
|
|
|
pointer_visible);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static MetaInputSettings *
|
|
|
|
@@ -1054,6 +1039,12 @@ update_last_device (MetaBackend *backend)
|
|
|
|
|
{
|
|
|
|
|
case CLUTTER_KEYBOARD_DEVICE:
|
|
|
|
|
break;
|
|
|
|
|
case CLUTTER_TABLET_DEVICE:
|
|
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
|
|
|
|
else
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
|
|
|
|
|
break;
|
|
|
|
|
case CLUTTER_TOUCHSCREEN_DEVICE:
|
|
|
|
|
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
|
|
|
|
break;
|
|
|
|
|