debian/changelog | 1 debian/local/input_id.c | 95 +++++++++++++++++++++++++++++++----------------- debian/rules | 1 3 files changed, 64 insertions(+), 33 deletions(-)
New commits: commit 6898548c51e429c539cc1aaa48ac236c5eb2d3f4 Author: Julien Cristau <jcris...@debian.org> Date: Sun Dec 6 19:08:53 2009 +0100 Update input_id to the version in udev 149. diff --git a/debian/changelog b/debian/changelog index 7fff96f..2c1b856 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,7 @@ xorg-server (2:1.7.3-1) UNRELEASED; urgency=low * Enable GLX 1.4 on DRI2 and swrast (from upstream, via F12). * xserver-xorg-dev: add Depends on x11proto-kb-dev and libxkbfile-dev for xkbsrv.h (closes: #559676). Thanks, Ron! + * Update input_id to the version in udev 149. [ Timo Aaltonen ] * New upstream release. diff --git a/debian/local/input_id.c b/debian/local/input_id.c index 393a05d..21ee6b3 100644 --- a/debian/local/input_id.c +++ b/debian/local/input_id.c @@ -25,6 +25,8 @@ #include <limits.h> #include <linux/input.h> +#include "libudev.h" + /* we must use this kernel-compatible implementation */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) @@ -34,29 +36,21 @@ #define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) /* - * Read a capabilities/name file and return bitmask. - * @param path File to open + * Read a capability attribute and return bitmask. + * @param dev udev_device + * @param attr sysfs attribute name (e. g. "capabilities/key") * @param bitmask: Output array; must have max_size elements */ -static void get_cap_mask (const char *path, unsigned long *bitmask, size_t max_size) +static void get_cap_mask (struct udev_device *dev, const char* attr, + unsigned long *bitmask, size_t max_size) { - FILE* f; - int i; char text[4096]; + int i; char* word; unsigned long val; - f = fopen(path, "r"); - if (f == NULL) { - perror("opening caps file"); - exit(1); - } - if (fgets(text, sizeof(text), f) == NULL) { - perror("fgets"); - exit(1); - } - fclose(f); - + snprintf(text, sizeof(text), "%s", udev_device_get_sysattr_value(dev, attr)); + memset (bitmask, 0, max_size); i = 0; while ((word = strrchr(text, ' ')) != NULL) { @@ -70,18 +64,22 @@ static void get_cap_mask (const char *path, unsigned long *bitmask, size_t max_s } /* pointer devices */ -static void test_pointers (const unsigned long* bitmask_abs, const unsigned long* bitmask_key, const unsigned long* bitmask_rel) +static void test_pointers (const unsigned long* bitmask_ev, + const unsigned long* bitmask_abs, + const unsigned long* bitmask_key, + const unsigned long* bitmask_rel) { int is_mouse = 0; int is_touchpad = 0; - if (test_bit (ABS_PRESSURE, bitmask_abs)) - is_touchpad = 1; + if (!test_bit (EV_KEY, bitmask_ev)) + return; - if (test_bit (ABS_X, bitmask_abs) && test_bit (ABS_Y, bitmask_abs)) { - if (test_bit (BTN_STYLUS, bitmask_key)) + if (test_bit (EV_ABS, bitmask_ev) && + test_bit (ABS_X, bitmask_abs) && test_bit (ABS_Y, bitmask_abs)) { + if (test_bit (BTN_STYLUS, bitmask_key) || test_bit (BTN_TOOL_PEN, bitmask_key)) puts("ID_INPUT_TABLET=1"); - else if (test_bit (BTN_TOUCH, bitmask_key)) + else if (test_bit (BTN_TOOL_FINGER, bitmask_key) && !test_bit (BTN_TOOL_PEN, bitmask_key)) is_touchpad = 1; else if (test_bit (BTN_TRIGGER, bitmask_key) || test_bit (BTN_A, bitmask_key) || @@ -91,9 +89,13 @@ static void test_pointers (const unsigned long* bitmask_abs, const unsigned long /* This path is taken by VMware's USB mouse, which has * absolute axes, but no touch/pressure button. */ is_mouse = 1; + else if (test_bit (BTN_TOUCH, bitmask_key)) + puts("ID_INPUT_TOUCHSCREEN=1"); } - if (test_bit (REL_X, bitmask_rel) && test_bit (REL_Y, bitmask_rel)) + if (test_bit (EV_REL, bitmask_ev) && + test_bit (REL_X, bitmask_rel) && test_bit (REL_Y, bitmask_rel) && + test_bit (BTN_MOUSE, bitmask_key)) is_mouse = 1; if (is_mouse) @@ -103,13 +105,17 @@ static void test_pointers (const unsigned long* bitmask_abs, const unsigned long } /* key like devices */ -static void test_key (const unsigned long* bitmask_key) +static void test_key (const unsigned long* bitmask_ev, + const unsigned long* bitmask_key) { unsigned i; unsigned long acc; unsigned long mask; /* do we have any KEY_* capability? */ + if (!test_bit (EV_KEY, bitmask_ev)) + return; + acc = 0; for (i = 0; i < BTN_MISC/BITS_PER_LONG; ++i) acc |= bitmask_key[i]; @@ -125,7 +131,11 @@ static void test_key (const unsigned long* bitmask_key) int main (int argc, char** argv) { - char capfile[PATH_MAX]; + struct udev *udev; + struct udev_device *dev; + + char devpath[PATH_MAX]; + unsigned long bitmask_ev[NBITS(EV_MAX)]; unsigned long bitmask_abs[NBITS(ABS_MAX)]; unsigned long bitmask_key[NBITS(KEY_MAX)]; unsigned long bitmask_rel[NBITS(REL_MAX)]; @@ -135,20 +145,39 @@ int main (int argc, char** argv) exit(1); } + /* get the device */ + udev = udev_new(); + if (udev == NULL) + return 1; + + snprintf(devpath, sizeof(devpath), "%s/%s", udev_get_sys_path(udev), argv[1]); + dev = udev_device_new_from_syspath(udev, devpath); + if (dev == NULL) { + fprintf(stderr, "unable to access '%s'\n", devpath); + return 1; + } + + /* walk up the parental chain until we find the real input device; the + * argument is very likely a subdevice of this, like eventN */ + while (dev != NULL && udev_device_get_sysattr_value(dev, "capabilities/ev") == NULL) + dev = udev_device_get_parent_with_subsystem_devtype(dev, "input", NULL); + + /* not an "input" class device */ + if (dev == NULL) + return 0; + /* Use this as a flag that input devices were detected, so that this * program doesn't need to be called more than once per device */ puts("ID_INPUT=1"); - snprintf(capfile, sizeof(capfile), "/sys/%s/device/capabilities/abs", argv[1]); - get_cap_mask (capfile, bitmask_abs, sizeof (bitmask_abs)); - snprintf(capfile, sizeof(capfile), "/sys/%s/device/capabilities/rel", argv[1]); - get_cap_mask (capfile, bitmask_rel, sizeof (bitmask_rel)); - snprintf(capfile, sizeof(capfile), "/sys/%s/device/capabilities/key", argv[1]); - get_cap_mask (capfile, bitmask_key, sizeof (bitmask_key)); + get_cap_mask (dev, "capabilities/ev", bitmask_ev, sizeof (bitmask_ev)); + get_cap_mask (dev, "capabilities/abs", bitmask_abs, sizeof (bitmask_abs)); + get_cap_mask (dev, "capabilities/rel", bitmask_rel, sizeof (bitmask_rel)); + get_cap_mask (dev, "capabilities/key", bitmask_key, sizeof (bitmask_key)); - test_pointers(bitmask_abs, bitmask_key, bitmask_rel); + test_pointers(bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel); - test_key(bitmask_key); + test_key(bitmask_ev, bitmask_key); return 0; } diff --git a/debian/rules b/debian/rules index 6c8a0c5..ca91b2b 100755 --- a/debian/rules +++ b/debian/rules @@ -142,6 +142,7 @@ obj-$(DEB_BUILD_GNU_TYPE)/config.status: configure CPPFLAGS="$(CPPFLAGS)" ifeq ($(DEB_HOST_ARCH_OS), linux) +debian/local/input_id: LDFLAGS=-Wl,-z,defs -ludev build-stamp: debian/local/input_id endif -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org