diff options
| -rw-r--r-- | plugins/common/Makefile.am | 8 | ||||
| -rw-r--r-- | plugins/common/msd-input-helper.c | 108 | ||||
| -rw-r--r-- | plugins/common/msd-input-helper.h | 35 | ||||
| -rw-r--r-- | plugins/mouse/Makefile.am | 8 | ||||
| -rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 60 | 
5 files changed, 155 insertions, 64 deletions
| 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 <[email protected]> + * + * 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 <gdk/gdk.h> +#include <gdk/gdkx.h> + +#include <sys/types.h> +#include <X11/Xatom.h> + +#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 <[email protected]> + * + * 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 <glib.h> + +#include <X11/extensions/XInput.h> +#include <X11/extensions/XIproto.h> + +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)  { | 
