From 420c17e9df0fe75f74b13f9d0caa91e764780c4b Mon Sep 17 00:00:00 2001 From: infirit Date: Sat, 13 Dec 2014 15:30:40 +0100 Subject: mouse: Move "has touchpad" function to common So it can be reused. This also fixes a memory leak in the function. We were leaking the device list Taken from GSD commit: f6dcba4e954f3e910854f3c92fb69b157683267d From: Bastien Nocera --- plugins/common/Makefile.am | 8 ++- plugins/common/msd-input-helper.c | 108 ++++++++++++++++++++++++++++++++++++++ plugins/common/msd-input-helper.h | 35 ++++++++++++ plugins/mouse/Makefile.am | 8 +-- plugins/mouse/msd-mouse-manager.c | 60 +-------------------- 5 files changed, 155 insertions(+), 64 deletions(-) create mode 100644 plugins/common/msd-input-helper.c create mode 100644 plugins/common/msd-input-helper.h diff --git a/plugins/common/Makefile.am b/plugins/common/Makefile.am index 3733a90..4cd30d8 100644 --- a/plugins/common/Makefile.am +++ b/plugins/common/Makefile.am @@ -6,6 +6,8 @@ libcommon_la_SOURCES = \ eggaccelerators.h \ msd-keygrab.c \ msd-keygrab.h \ + msd-input-helper.c \ + msd-input-helper.h \ msd-osd-window.c \ msd-osd-window.h @@ -14,10 +16,12 @@ libcommon_la_CPPFLAGS = \ libcommon_la_CFLAGS = \ $(SETTINGS_PLUGIN_CFLAGS) \ + $(XINPUT_CFLAGS) \ $(AM_CFLAGS) libcommon_la_LDFLAGS = \ - $(MSD_PLUGIN_LDFLAGS) $(X11_LIBS) + $(MSD_PLUGIN_LDFLAGS) $(XINPUT_LIBS) $(X11_LIBS) libcommon_la_LIBADD = \ - $(SETTINGS_PLUGIN_LIBS) + $(SETTINGS_PLUGIN_LIBS) \ + $(XINPUT_LIBS) diff --git a/plugins/common/msd-input-helper.c b/plugins/common/msd-input-helper.c new file mode 100644 index 0000000..5043e35 --- /dev/null +++ b/plugins/common/msd-input-helper.c @@ -0,0 +1,108 @@ +/* -*- 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" + +static gboolean +supports_xinput_devices (void) +{ + gint op_code, event, error; + + return XQueryExtension (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + "XInputExtension", + &op_code, + &event, + &error); +} + +XDevice* +device_is_touchpad (XDeviceInfo deviceinfo) +{ + XDevice *device; + Atom realtype, prop; + int realformat; + unsigned long nitems, bytes_after; + unsigned char *data; + + if (deviceinfo.type != XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TOUCHPAD, False)) + return NULL; + + prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "Synaptics Off", False); + if (!prop) + 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; + + 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 (); + XFree (data); + return device; + } + gdk_error_trap_pop (); + + 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; +} diff --git a/plugins/common/msd-input-helper.h b/plugins/common/msd-input-helper.h new file mode 100644 index 0000000..2a971ae --- /dev/null +++ b/plugins/common/msd-input-helper.h @@ -0,0 +1,35 @@ +/* -*- 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. + */ + +#ifndef __MSD_INPUT_HELPER_H +#define __MSD_INPUT_HELPER_H + +G_BEGIN_DECLS + +#include + +#include +#include + +XDevice * device_is_touchpad (XDeviceInfo deviceinfo); +gboolean touchpad_is_present (void); + +G_END_DECLS + +#endif /* __MSD_INPUT_HELPER_H */ diff --git a/plugins/mouse/Makefile.am b/plugins/mouse/Makefile.am index 8e1ab77..01a1f43 100644 --- a/plugins/mouse/Makefile.am +++ b/plugins/mouse/Makefile.am @@ -8,6 +8,7 @@ libmouse_la_SOURCES = \ libmouse_la_CPPFLAGS = \ -I$(top_srcdir)/mate-settings-daemon \ + -I$(top_srcdir)/plugins/common/ \ -DMATE_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" \ $(AM_CPPFLAGS) @@ -19,9 +20,10 @@ libmouse_la_CFLAGS = \ libmouse_la_LDFLAGS = \ $(MSD_PLUGIN_LDFLAGS) -libmouse_la_LIBADD = \ - $(SETTINGS_PLUGIN_LIBS) \ - $(X11_LIBS) \ +libmouse_la_LIBADD = \ + $(top_builddir)/plugins/common/libcommon.la \ + $(SETTINGS_PLUGIN_LIBS) \ + $(X11_LIBS) \ $(XINPUT_LIBS) plugin_in_files = mouse.mate-settings-plugin.in diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c index 5bce75b..f25bcb2 100644 --- a/plugins/mouse/msd-mouse-manager.c +++ b/plugins/mouse/msd-mouse-manager.c @@ -48,6 +48,7 @@ #include "mate-settings-profile.h" #include "msd-mouse-manager.h" +#include "msd-input-helper.h" #define MSD_MOUSE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_MOUSE_MANAGER, MsdMouseManagerPrivate)) @@ -92,7 +93,6 @@ static void msd_mouse_manager_finalize (GObject *object); static void set_mouse_settings (MsdMouseManager *manager); #ifdef HAVE_X11_EXTENSIONS_XINPUT_H static int set_tap_to_click (gboolean state, gboolean left_handed); -static XDevice* device_is_touchpad (XDeviceInfo deviceinfo); #endif G_DEFINE_TYPE (MsdMouseManager, msd_mouse_manager, G_TYPE_OBJECT) @@ -570,64 +570,6 @@ set_middle_button (MsdMouseManager *manager, XFreeDeviceList (device_info); } -#ifdef HAVE_X11_EXTENSIONS_XINPUT_H -static XDevice* -device_is_touchpad (XDeviceInfo deviceinfo) -{ - XDevice *device; - Atom realtype, prop; - int realformat; - unsigned long nitems, bytes_after; - unsigned char *data; - - if (deviceinfo.type != XInternAtom (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), XI_TOUCHPAD, False)) - return NULL; - - prop = XInternAtom (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), "Synaptics Off", False); - if (!prop) - 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; - - 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 (); - XFree (data); - return device; - } - gdk_error_trap_pop (); - - XCloseDevice (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), device); - return NULL; -} -#endif - -static gboolean -touchpad_is_present (void) -{ - gboolean touchpad_present = FALSE; - int numdevices, i; - XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices); - XDevice *device; - - if (devicelist == NULL) - return 0; - - for (i = 0; i < numdevices; i++) { - if ((device = device_is_touchpad (devicelist[i]))) { - touchpad_present = TRUE; - break; - } - } - - return touchpad_present; -} - static int set_disable_w_typing (MsdMouseManager *manager, gboolean state) { -- cgit v1.2.1