summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-02-11 17:04:13 +0100
committerCarlos Garnacho <carlosg@gnome.org>2015-03-13 21:04:01 +0100
commit3471ef34411a00c3d19a8363b0daee1bfad0f250 (patch)
treee9580eba775ecf5a9467fa900faf88d52e056641
parentaf9d8f1931c9d56c8bcc009648e5c760483ecfe9 (diff)
backend: Update cursor visibility based on device availability
On startup, the cursor is kept hidden if there's any touchscreen available. If the device that was last interacted is removed, we check on available pointing devices though, so we don't possibly hide the pointer if there are further mice/touchpads/etc. Devices being added don't update cursor visibility, we wait for the user interacting with those instead. https://bugzilla.gnome.org/show_bug.cgi?id=712775
-rw-r--r--src/backends/meta-backend.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 474184aa..f55a4a02 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -137,6 +137,55 @@ 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)
+{
+ const GSList *devices;
+
+ devices = clutter_device_manager_peek_devices (manager);
+
+ for (; devices; devices = devices->next)
+ {
+ ClutterInputDevice *device = devices->data;
+
+ if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
+ continue;
+ if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
+ clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE)
+ continue;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static inline gboolean
+check_has_slave_touchscreen (ClutterDeviceManager *manager)
+{
+ const GSList *devices;
+
+ devices = clutter_device_manager_peek_devices (manager);
+
+ for (; devices; devices = devices->next)
+ {
+ 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;
+ }
+
+ return FALSE;
+}
+
static void
on_device_removed (ClutterDeviceManager *device_manager,
ClutterInputDevice *device,
@@ -146,6 +195,32 @@ on_device_removed (ClutterDeviceManager *device_manager,
int device_id = clutter_input_device_get_device_id (device);
destroy_device_monitor (backend, device_id);
+
+ /* If the device the user last interacted goes away, check again pointer
+ * visibility.
+ */
+ if (backend->current_device_id == device_id)
+ {
+ MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
+ gboolean has_touchscreen, has_pointing_device;
+ ClutterInputDeviceType device_type;
+
+ device_type = clutter_input_device_get_device_type (device);
+ has_touchscreen = check_has_slave_touchscreen (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);
+ }
+ }
}
static MetaMonitorManager *
@@ -178,7 +253,9 @@ meta_backend_real_post_init (MetaBackend *backend)
NULL, (GDestroyNotify) g_object_unref);
{
+ MetaCursorTracker *cursor_tracker;
ClutterDeviceManager *manager;
+ gboolean has_touchscreen = FALSE;
GSList *devices, *l;
/* Create the core device monitor. */
@@ -196,8 +273,12 @@ meta_backend_real_post_init (MetaBackend *backend)
{
ClutterInputDevice *device = l->data;
on_device_added (manager, device, backend);
+ has_touchscreen |= device_is_slave_touchscreen (device);
}
+ cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
+ meta_cursor_tracker_set_pointer_visible (cursor_tracker, !has_touchscreen);
+
g_slist_free (devices);
}