[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-input-synaptics: Changes to 'ubuntu'



 debian/patches/108_syndaemon_xinput_props.patch |  338 ++++++++++++++++++++++++
 1 file changed, 338 insertions(+)

New commits:
commit f10caba59c5860febedda86f81f7401fbaf7e5ce
Author: Timo Aaltonen <tjaalton@cc.hut.fi>
Date:   Mon Jan 26 10:44:08 2009 +0200

    Include the patch this time.

diff --git a/debian/patches/108_syndaemon_xinput_props.patch b/debian/patches/108_syndaemon_xinput_props.patch
new file mode 100644
index 0000000..4a7986b
--- /dev/null
+++ b/debian/patches/108_syndaemon_xinput_props.patch
@@ -0,0 +1,338 @@
+Index: xserver-xorg-input-synaptics/tools/syndaemon.c
+===================================================================
+--- xserver-xorg-input-synaptics.orig/tools/syndaemon.c	2009-01-23 14:24:31.000000000 +0200
++++ xserver-xorg-input-synaptics/tools/syndaemon.c	2009-01-26 09:43:16.000000000 +0200
+@@ -1,5 +1,6 @@
+ /*
+  * Copyright © 2003-2004 Peter Osterlund
++ * Copyright © 2008 William Grant
+  *
+  * Permission to use, copy, modify, distribute, and sell this software
+  * and its documentation for any purpose is hereby granted without
+@@ -22,6 +23,7 @@
+  *
+  * Authors:
+  *      Peter Osterlund (petero2@telia.com)
++ *      William Grant (wgrant@ubuntu.com)
+  */
+ 
+ #ifdef HAVE_CONFIG_H
+@@ -39,9 +41,13 @@
+ #include <sys/time.h>
+ #include <sys/stat.h>
+ 
++#include <X11/Xatom.h>
++#include <X11/extensions/XInput.h>
++
+ #include "synaptics.h"
+ 
+ static SynapticsSHM *synshm;
++static int using_synshm;
+ static int pad_disabled;
+ static int disable_taps_only;
+ static int ignore_modifier_combos;
+@@ -64,15 +70,114 @@
+     fprintf(stderr, "  -t Only disable tapping and scrolling, not mouse movements.\n");
+     fprintf(stderr, "  -k Ignore modifier keys when monitoring keyboard activity.\n");
+     fprintf(stderr, "  -K Like -k but also ignore Modifier+Key combos.\n");
++    fprintf(stderr, "  -S Use SHMConfig even if input device properties are available.\n");
+     exit(1);
+ }
+ 
++static XDevice
++*device_is_touchpad(Display *display, XDeviceInfo deviceinfo)
++{
++    XDevice *device;
++    Atom *props;
++    int nprops;
++    char *name;
++
++    device = XOpenDevice(display, deviceinfo.id);
++    if (!device)
++        return NULL;
++
++    props = XListDeviceProperties(display, device, &nprops);
++    while (nprops--) {
++	name = XGetAtomName(display, props[nprops]);
++	if (!strcmp(name, "Synaptics Off")) {
++	    free(name);
++	    XFree(props);
++	    return device;
++	}
++	free(name);
++    }
++
++    XFree(props);
++    XCloseDevice(display, device);
++    return NULL;
++}
++
+ static int
+-enable_touchpad(void)
++get_touchpad_off(Display *display)
++{
++    int numdevices, i;
++    XDeviceInfo *devicelist;
++    XDevice *device;
++    Atom realtype, prop;
++    int realformat;
++    unsigned long nitems, bytes_after;
++    unsigned char *data;
++    int result;
++
++    if (using_synshm)
++	return synshm->touchpad_off;
++
++    devicelist = XListInputDevices (display, &numdevices);
++
++    prop = XInternAtom(display, "Synaptics Off", False);
++
++    for (i = 0; i < numdevices; i++) {
++	if ((devicelist[i].use >= IsXExtensionDevice) &&
++	    (device = device_is_touchpad(display, devicelist[i]))) {
++	    XGetDeviceProperty(display, device, prop, 0, 1, False,
++			       XA_INTEGER, &realtype, &realformat, &nitems,
++			       &bytes_after, &data);
++
++	    if (nitems < 1) {
++		fprintf(stderr, "Touchpad didn't return status information.\n");
++		exit(2);
++	    }
++
++	    result = data[0];
++	    XFree(devicelist);
++	    XFree(data);
++	    XCloseDevice(display, device);
++	    return result;
++        }
++    }
++    XFree(devicelist);
++    return 1;
++}
++
++static void
++set_touchpad_off(Display *display, int value)
++{
++    int numdevices, i;
++    XDeviceInfo *devicelist;
++    XDevice *device;
++    Atom realtype, prop;
++
++    if (using_synshm) {
++	synshm->touchpad_off = value;
++	return;
++    }
++
++    devicelist = XListInputDevices (display, &numdevices);
++
++    prop = XInternAtom(display, "Synaptics Off", False);
++
++    for (i = 0; i < numdevices; i++) {
++	if ((devicelist[i].use >= IsXExtensionDevice) &&
++            (device = device_is_touchpad(display, devicelist[i]))) {
++	    XChangeDeviceProperty(display, device, prop, XA_INTEGER, 8, PropModeReplace,
++				  (unsigned char *)&value, 1);
++	    XCloseDevice(display, device);
++        }
++    }
++    XFree(devicelist);
++}
++
++static int
++enable_touchpad(Display *display)
+ {
+     int ret = 0;
+     if (pad_disabled) {
+-	synshm->touchpad_off = 0;
++	set_touchpad_off(display, 0);
+ 	pad_disabled = 0;
+ 	ret = 1;
+     }
+@@ -82,7 +187,10 @@
+ static void
+ signal_handler(int signum)
+ {
+-    enable_touchpad();
++    Display *display = XOpenDisplay(NULL);
++    enable_touchpad(display);
++    XCloseDisplay(display);
++
+     if (pid_file)
+ 	unlink(pid_file);
+     kill(getpid(), signum);
+@@ -156,18 +264,53 @@
+  * Return non-zero if any physical touchpad button is currently pressed.
+  */
+ static int
+-touchpad_buttons_active(void)
++touchpad_buttons_active(Display *display)
+ {
+     int i;
+-
+-    if (synshm->left || synshm->right || synshm->up || synshm->down)
++    if (using_synshm) {
++	if (synshm->left || synshm->right || synshm->up || synshm->down)
++	    return 1;
++	for (i = 0; i < 8; i++)
++	    if (synshm->multi[i])
+ 	return 1;
+-    for (i = 0; i < 8; i++)
+-	if (synshm->multi[i])
++	if (synshm->guest_left || synshm->guest_mid || synshm->guest_right)
+ 	    return 1;
+-    if (synshm->guest_left || synshm->guest_mid || synshm->guest_right)
+-        return 1;
+-    return 0;
++	return 0;
++    }
++    else {
++	XDevice *device;
++	XDeviceInfo *devicelist;
++	XDeviceState *state;
++	XButtonState *buttonstate;
++	XInputClass *class;
++	int numdevices, classno, buttonno;
++	int pressed = 0;
++
++	devicelist = XListInputDevices (display, &numdevices);
++	for (i = 0; i < numdevices; i++)
++	    if ((devicelist[i].use >= IsXExtensionDevice) &&
++		(device = device_is_touchpad(display, devicelist[i]))) {
++		state = XQueryDeviceState(display, device);
++		class = state->data;
++
++		for (classno = 0; classno < state->num_classes; classno++)
++		{
++		    if (class->class == ButtonClass)
++		    {
++			buttonstate = (XButtonState *)class;
++			for (buttonno = 1; buttonno <= buttonstate->num_buttons; buttonno++)
++			    if (buttonstate->buttons[buttonno / 8] & (1 << (buttonno % 8)))
++				pressed = 1;
++		    }
++		    class = (XInputClass *)((char *) class + class->length);
++		}
++		XFree(state);
++		XCloseDevice(display, device);
++		break;
++	    }
++	XFree(devicelist);
++	return pressed;
++    }
+ }
+ 
+ static double
+@@ -191,23 +334,20 @@
+ 	current_time = get_time();
+ 	if (keyboard_activity(display))
+ 	    last_activity = current_time;
+-	if (touchpad_buttons_active())
++	if (touchpad_buttons_active(display))
+ 	    last_activity = 0.0;
+ 
+ 	if (current_time > last_activity + idle_time) {	/* Enable touchpad */
+-	    if (enable_touchpad()) {
++	    if (enable_touchpad(display)) {
+ 		if (!background)
+ 		    printf("Enable\n");
+ 	    }
+ 	} else {			    /* Disable touchpad */
+-	    if (!pad_disabled && !synshm->touchpad_off) {
++	    if (!pad_disabled && !get_touchpad_off(display)) {
+ 		if (!background)
+ 		    printf("Disable\n");
+ 		pad_disabled = 1;
+-		if (disable_taps_only)
+-		    synshm->touchpad_off = 2;
+-		else
+-		    synshm->touchpad_off = 1;
++		set_touchpad_off(display, disable_taps_only ? 2 : 1);
+ 	    }
+ 	}
+ 
+@@ -254,7 +394,7 @@
+     int ignore_modifier_keys = 0;
+ 
+     /* Parse command line parameters */
+-    while ((c = getopt(argc, argv, "i:m:dtp:kK?")) != EOF) {
++    while ((c = getopt(argc, argv, "i:m:dtp:kKS?")) != EOF) {
+ 	switch(c) {
+ 	case 'i':
+ 	    idle_time = atof(optarg);
+@@ -278,6 +418,9 @@
+ 	    ignore_modifier_combos = 1;
+ 	    ignore_modifier_keys = 1;
+ 	    break;
++	case 'S':
++	    using_synshm = 1;
++	    break;
+ 	default:
+ 	    usage();
+ 	    break;
+@@ -293,20 +436,42 @@
+ 	exit(2);
+     }
+ 
+-    /* Connect to the shared memory area */
+-    if ((shmid = shmget(SHM_SYNAPTICS, sizeof(SynapticsSHM), 0)) == -1) {
+-	if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) == -1) {
+-	    fprintf(stderr, "Can't access shared memory area. SHMConfig disabled?\n");
+-	    exit(2);
+-	} else {
+-	    fprintf(stderr, "Incorrect size of shared memory area. Incompatible driver version?\n");
++    if (!using_synshm) {
++	XDeviceInfo *devicelist;
++	XDevice *device;
++	int numdevices, i;
++
++	using_synshm = 1;
++
++	devicelist = XListInputDevices (display, &numdevices);
++	for (i =0; i < numdevices; i++)
++	    if ((devicelist[i].use >= IsXExtensionDevice) &&
++		(device = device_is_touchpad(display, devicelist[i]))) {
++		XCloseDevice(display, device);
++		using_synshm = 0;
++		break;
++	    }
++	XFree(devicelist);
++    }	
++
++
++    if (using_synshm) {
++        /* Connect to the shared memory area */
++        if ((shmid = shmget(SHM_SYNAPTICS, sizeof(SynapticsSHM), 0)) == -1) {
++	    if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) == -1) {
++	        fprintf(stderr, "Can't access shared memory area. SHMConfig disabled?\n");
++	        exit(2);
++	    } else {
++	        fprintf(stderr, "Incorrect size of shared memory area. Incompatible driver version?\n");
++	        exit(2);
++	    }
++	}
++
++	if ((synshm = (SynapticsSHM*) shmat(shmid, NULL, 0)) == NULL) {
++	    perror("shmat");
+ 	    exit(2);
+ 	}
+     }
+-    if ((synshm = (SynapticsSHM*) shmat(shmid, NULL, 0)) == NULL) {
+-	perror("shmat");
+-	exit(2);
+-    }
+ 
+     /* Install a signal handler to restore synaptics parameters on exit */
+     install_signal_handler();
+Index: xserver-xorg-input-synaptics/configure.ac
+===================================================================
+--- xserver-xorg-input-synaptics.orig/configure.ac	2009-01-23 14:24:31.000000000 +0200
++++ xserver-xorg-input-synaptics/configure.ac	2009-01-26 09:43:16.000000000 +0200
+@@ -110,7 +110,7 @@
+ AC_SUBST([CFLAGS])
+ 
+ # Checks for libraries.
+-PKG_CHECK_MODULES(XLIB, x11) # needed for syndaemon
++PKG_CHECK_MODULES(XLIB, x11 xi) # needed for syndaemon
+ 
+ # Checks for header files.
+ AC_HEADER_STDC


Reply to: