Compare commits

...

3 Commits

Author SHA1 Message Date
Carlos Garnacho
e5dd9b8fbc wayland: Use default cursor on tablet tools
Now that we "replace" the pointer cursor on tablet input, have it
use the default cursor so it blends in better.
2018-11-02 16:15:02 +01:00
Carlos Garnacho
83f496229b backends: Keep cursor hidden on tablet input on Wayland
Tablets have their own cursor, in order to avoid confusions just
hide the regular pointer like we do on touchscreens, so there's
the illusion that there is a single cursor.

Closes: https://gitlab.gnome.org/GNOME/mutter/issues/75
2018-11-02 16:14:55 +01:00
Carlos Garnacho
0fea0e383c backends: Unify cursor visibility checks
Instead of having device type checks spread around, unify cursor
visibility dependent on device availability on a single function.
2018-11-02 15:49:01 +01:00
2 changed files with 32 additions and 41 deletions

View File

@@ -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;

View File

@@ -418,7 +418,7 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
tool->focus_surface_destroy_listener.notify = tablet_tool_handle_focus_surface_destroy;
tool->cursor_surface_destroy_listener.notify = tablet_tool_handle_cursor_surface_destroy;
tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_CROSSHAIR);
tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_DEFAULT);
tool->prepare_at_signal_id =
g_signal_connect (tool->default_sprite, "prepare-at",
G_CALLBACK (tool_cursor_prepare_at), tool);