diff options
author | Rui Matos <tiagomatos@gmail.com> | 2015-05-29 20:10:38 +0200 |
---|---|---|
committer | Rui Matos <tiagomatos@gmail.com> | 2015-07-02 14:05:11 +0200 |
commit | 18f59cb8e3b9c6857cd35c8bd22dca2beae23d63 (patch) | |
tree | 0decda0e0ee7e34182e03def3b3d01c0567497cb | |
parent | db7e9d93635b6e09573f58bca015b6d4c09d8767 (diff) | |
download | gnome-settings-daemon-18f59cb8e3b9c6857cd35c8bd22dca2beae23d63.tar.gz |
common: Make device type presence checks work on libinput and wayland
Using GsdDeviceManager allows our device type presence checks work
both on libinput using X sessions and on Wayland sessions.
At the same time we still need to support systems using the synaptics
X driver so let's make that an explicit separate check.
https://bugzilla.gnome.org/show_bug.cgi?id=749818
-rw-r--r-- | plugins/common/gsd-input-helper.c | 101 | ||||
-rw-r--r-- | plugins/common/gsd-input-helper.h | 9 | ||||
-rw-r--r-- | plugins/mouse/gsd-mouse-manager.c | 36 |
3 files changed, 63 insertions, 83 deletions
diff --git a/plugins/common/gsd-input-helper.c b/plugins/common/gsd-input-helper.c index 7ea40616..e0f40154 100644 --- a/plugins/common/gsd-input-helper.c +++ b/plugins/common/gsd-input-helper.c @@ -29,6 +29,7 @@ #include <X11/extensions/XInput2.h> #include "gsd-input-helper.h" +#include "gsd-device-manager.h" #define INPUT_DEVICES_SCHEMA "org.gnome.settings-daemon.peripherals.input-devices" #define KEY_HOTPLUG_COMMAND "hotplug-command" @@ -163,7 +164,7 @@ supports_xinput2_devices (int *opcode) } gboolean -device_is_touchpad (XDevice *xdevice) +xdevice_is_synaptics (XDevice *xdevice) { Atom realtype, prop; int realformat; @@ -191,60 +192,13 @@ device_is_touchpad (XDevice *xdevice) } gboolean -device_info_is_touchpad (XDeviceInfo *device_info) -{ - return (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TOUCHPAD, False)); -} - -gboolean -device_info_is_touchscreen (XDeviceInfo *device_info) -{ - return (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TOUCHSCREEN, False)); -} - -gboolean -device_info_is_tablet (XDeviceInfo *device_info) -{ - /* Note that this doesn't match Wacom tablets */ - return (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TABLET, False)); -} - -gboolean -device_info_is_mouse (XDeviceInfo *device_info) -{ - return (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_MOUSE, False)); -} - -gboolean -device_info_is_trackball (XDeviceInfo *device_info) -{ - gboolean retval; - - retval = (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TRACKBALL, False)); - if (retval == FALSE && - device_info->name != NULL) { - char *lowercase; - - lowercase = g_ascii_strdown (device_info->name, -1); - retval = strstr (lowercase, "trackball") != NULL; - g_free (lowercase); - } - - return retval; -} - -static gboolean -device_type_is_present (InfoIdentifyFunc info_func, - DeviceIdentifyFunc device_func) +synaptics_is_present (void) { XDeviceInfo *device_info; gint n_devices; guint i; gboolean retval; - if (supports_xinput_devices () == FALSE) - return TRUE; - retval = FALSE; device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices); @@ -254,21 +208,12 @@ device_type_is_present (InfoIdentifyFunc info_func, for (i = 0; i < n_devices; i++) { XDevice *device; - /* Check with the device info first */ - retval = (info_func) (&device_info[i]); - if (retval == FALSE) - continue; - - /* If we only have an info func, we're done checking */ - if (device_func == NULL) - break; - gdk_error_trap_push (); device = XOpenDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device_info[i].id); if (gdk_error_trap_pop () || (device == NULL)) continue; - retval = (device_func) (device); + retval = xdevice_is_synaptics (device); xdevice_close (device); if (retval) break; @@ -278,32 +223,54 @@ device_type_is_present (InfoIdentifyFunc info_func, return retval; } +static gboolean +device_type_is_present (GsdDeviceType type) +{ + GList *l = gsd_device_manager_list_devices (gsd_device_manager_get (), + type); + g_list_free (l); + return l != NULL; +} + gboolean touchscreen_is_present (void) { - return device_type_is_present (device_info_is_touchscreen, - NULL); + return device_type_is_present (GSD_DEVICE_TYPE_TOUCHSCREEN); } gboolean touchpad_is_present (void) { - return device_type_is_present (device_info_is_touchpad, - device_is_touchpad); + return device_type_is_present (GSD_DEVICE_TYPE_TOUCHPAD); } gboolean mouse_is_present (void) { - return device_type_is_present (device_info_is_mouse, - NULL); + return device_type_is_present (GSD_DEVICE_TYPE_MOUSE); } gboolean trackball_is_present (void) { - return device_type_is_present (device_info_is_trackball, - NULL); + gboolean retval; + GList *l, *mice = gsd_device_manager_list_devices (gsd_device_manager_get (), + GSD_DEVICE_TYPE_MOUSE); + if (mice == NULL) + return FALSE; + + for (l = mice; l != NULL; l = l->next) { + gchar *lowercase; + const gchar *name = gsd_device_get_name (l->data); + if (!name) + continue; + lowercase = g_ascii_strdown (name, -1); + retval = strstr (lowercase, "trackball") != NULL; + g_free (lowercase); + } + + g_list_free (mice); + return retval; } char * diff --git a/plugins/common/gsd-input-helper.h b/plugins/common/gsd-input-helper.h index 4df8dc32..9f548068 100644 --- a/plugins/common/gsd-input-helper.h +++ b/plugins/common/gsd-input-helper.h @@ -60,14 +60,9 @@ gboolean set_device_enabled (int device_id, gboolean set_touchpad_device_enabled (int device_id, gboolean enabled); -gboolean device_is_touchpad (XDevice *xdevice); - -gboolean device_info_is_touchpad (XDeviceInfo *device_info); -gboolean device_info_is_touchscreen (XDeviceInfo *device_info); -gboolean device_info_is_tablet (XDeviceInfo *device_info); -gboolean device_info_is_mouse (XDeviceInfo *device_info); -gboolean device_info_is_trackball (XDeviceInfo *device_info); +gboolean xdevice_is_synaptics (XDevice *xdevice); +gboolean synaptics_is_present (void); gboolean touchpad_is_present (void); gboolean touchscreen_is_present (void); gboolean mouse_is_present (void); diff --git a/plugins/mouse/gsd-mouse-manager.c b/plugins/mouse/gsd-mouse-manager.c index 1e844e02..44497227 100644 --- a/plugins/mouse/gsd-mouse-manager.c +++ b/plugins/mouse/gsd-mouse-manager.c @@ -144,6 +144,24 @@ open_gdk_device (GdkDevice *device) } static gboolean +device_info_is_trackball (XDeviceInfo *device_info) +{ + gboolean retval; + + retval = (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TRACKBALL, False)); + if (retval == FALSE && + device_info->name != NULL) { + char *lowercase; + + lowercase = g_ascii_strdown (device_info->name, -1); + retval = strstr (lowercase, "trackball") != NULL; + g_free (lowercase); + } + + return retval; +} + +static gboolean device_is_trackball (GdkDevice *device) { XDeviceInfo *device_info; @@ -375,7 +393,7 @@ set_left_handed (GsdMouseManager *manager, /* If the device is a touchpad, swap tap buttons * around too, otherwise a tap would be a right-click */ - if (device_is_touchpad (xdevice)) { + if (xdevice_is_synaptics (xdevice)) { gboolean tap = g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TAP_TO_CLICK); gboolean single_button = touchpad_has_single_button (xdevice); @@ -440,7 +458,7 @@ set_motion (GsdMouseManager *manager, g_debug ("setting motion on %s", gdk_device_get_name (device)); - if (device_is_touchpad (xdevice)) + if (xdevice_is_synaptics (xdevice)) settings = manager->priv->touchpad_settings; else settings = manager->priv->mouse_settings; @@ -551,7 +569,7 @@ syndaemon_died (GPid pid, gint status, gpointer user_data) static int set_disable_w_typing (GsdMouseManager *manager, gboolean state) { - if (state && touchpad_is_present ()) { + if (state && synaptics_is_present ()) { GError *error = NULL; GPtrArray *args; @@ -622,7 +640,7 @@ set_tap_to_click (GdkDevice *device, if (xdevice == NULL) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } @@ -687,7 +705,7 @@ set_horiz_scroll (GdkDevice *device, if (xdevice == NULL) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } @@ -757,7 +775,7 @@ set_scroll_method (GsdMouseManager *manager, if (xdevice == NULL) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } @@ -830,7 +848,7 @@ set_touchpad_disabled (GdkDevice *device) if (xdevice == NULL) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } @@ -858,7 +876,7 @@ set_touchpad_enabled (int id) if (gdk_error_trap_pop () != 0) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } @@ -969,7 +987,7 @@ set_natural_scroll (GsdMouseManager *manager, if (xdevice == NULL) return; - if (!device_is_touchpad (xdevice)) { + if (!xdevice_is_synaptics (xdevice)) { xdevice_close (xdevice); return; } |