From 678aa95188f518c05169084d04aa31e49035ee6b Mon Sep 17 00:00:00 2001 From: monsta Date: Tue, 3 Jan 2017 21:20:15 +0300 Subject: mouse: add input helper from m-s-d same as done upstream: https://git.gnome.org/browse/gnome-control-center/commit/?id=741723eaf86d9e68ae979b960eb2da3cf4b331d1 --- capplets/mouse/msd-input-helper.c | 121 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 capplets/mouse/msd-input-helper.c (limited to 'capplets/mouse/msd-input-helper.c') diff --git a/capplets/mouse/msd-input-helper.c b/capplets/mouse/msd-input-helper.c new file mode 100644 index 00000000..ae64b0d2 --- /dev/null +++ b/capplets/mouse/msd-input-helper.c @@ -0,0 +1,121 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2010 Bastien Nocera + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include +#include + +#include +#include + +#include "msd-input-helper.h" + +gboolean +supports_xinput_devices (void) +{ + gint op_code, event, error; + + return XQueryExtension (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + "XInputExtension", + &op_code, + &event, + &error); +} + +static gboolean +device_has_property (XDevice *device, + const char *property_name) +{ + Atom realtype, prop; + int realformat; + unsigned long nitems, bytes_after; + unsigned char *data; + + prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), property_name, True); + if (!prop) + return FALSE; + + gdk_error_trap_push (); + if ((XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop, 0, 1, False, + XA_INTEGER, &realtype, &realformat, &nitems, + &bytes_after, &data) == Success) && (realtype != None)) { + gdk_error_trap_pop_ignored (); + XFree (data); + return TRUE; + } + + gdk_error_trap_pop_ignored (); + return FALSE; +} + +XDevice* +device_is_touchpad (XDeviceInfo *deviceinfo) +{ + XDevice *device; + + if (deviceinfo->type != XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TOUCHPAD, True)) + return NULL; + + gdk_error_trap_push (); + device = XOpenDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), deviceinfo->id); + if (gdk_error_trap_pop () || (device == NULL)) + return NULL; + + if (device_has_property (device, "libinput Tapping Enabled") || + device_has_property (device, "Synaptics Off")) { + return device; + } + + XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device); + return NULL; +} + +gboolean +touchpad_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); + if (device_info == NULL) + return FALSE; + + for (i = 0; i < n_devices; i++) { + XDevice *device; + + device = device_is_touchpad (&device_info[i]); + if (device != NULL) { + retval = TRUE; + break; + } + } + if (device_info != NULL) + XFreeDeviceList (device_info); + + return retval; +} -- cgit v1.2.1