debian/changelog | 2 debian/copyright | 20 +++++ debian/local/64-xorg-xkb.rules | 7 + debian/local/input_id.c | 154 +++++++++++++++++++++++++++++++++++++++++ debian/rules | 7 + 5 files changed, 187 insertions(+), 3 deletions(-)
New commits: commit bb918c2832c71b44ec5c4a7b07fd2b6c0b4ca687 Author: Julien Cristau <jcris...@debian.org> Date: Mon Nov 30 21:49:51 2009 +0100 Steal input_id helper from udev, install it in /lib/xorg. Thanks, Martin Pitt! diff --git a/debian/changelog b/debian/changelog index 34981e9..441eb83 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ xorg-server (2:1.7.2-2) UNRELEASED; urgency=low * debian/rules: upstream build system got fixed, no need to remove configure-generated files. + * Steal input_id helper from udev, install it in /lib/xorg. Thanks, Martin + Pitt! -- Julien Cristau <jcris...@debian.org> Sat, 28 Nov 2009 17:07:07 +0100 diff --git a/debian/copyright b/debian/copyright index 8fe50d2..355494e 100644 --- a/debian/copyright +++ b/debian/copyright @@ -560,3 +560,23 @@ I. Lee Hetherington <i...@lcs.mit.edu> Permission is hereby granted to use, modify, and distribute this program for any purpose provided this copyright notice and the one below remain intact. + + +debian/local/input_id.c is stolen from udev and is: + Copyright (C) 2009 Martin Pitt <martin.p...@ubuntu.com> + Portions Copyright (C) 2004 David Zeuthen, <da...@fubar.dk> + + 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 keymap; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + diff --git a/debian/local/64-xorg-xkb.rules b/debian/local/64-xorg-xkb.rules index d5607c6..311d49b 100644 --- a/debian/local/64-xorg-xkb.rules +++ b/debian/local/64-xorg-xkb.rules @@ -1,8 +1,11 @@ -ACTION!="add", GOTO="xorg_xkb_end" +ACTION!="add|change", GOTO="xorg_xkb_end" SUBSYSTEM!="input", GOTO="xorg_xkb_end" KERNEL!="event*", GOTO="xorg_xkb_end" +# input_id is only in udev > 147 +ENV{ID_INPUT}=="", IMPORT{program}="/lib/xorg/input_id %p" + # import keyboard layout from /etc/default/keyboard -IMPORT{file}="/etc/default/keyboard" +ENV{ID_INPUT_KEY}=="?*", IMPORT{file}="/etc/default/keyboard" LABEL="xorg_xkb_end" diff --git a/debian/local/input_id.c b/debian/local/input_id.c new file mode 100644 index 0000000..393a05d --- /dev/null +++ b/debian/local/input_id.c @@ -0,0 +1,154 @@ +/* + * input_id - input device classification + * + * Copyright (C) 2009 Martin Pitt <martin.p...@ubuntu.com> + * Portions Copyright (C) 2004 David Zeuthen, <da...@fubar.dk> + * + * 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 keymap; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <limits.h> +#include <linux/input.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) +#define OFF(x) ((x)%BITS_PER_LONG) +#define BIT(x) (1UL<<OFF(x)) +#define LONG(x) ((x)/BITS_PER_LONG) +#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) + +/* + * Read a capabilities/name file and return bitmask. + * @param path File to open + * @param bitmask: Output array; must have max_size elements + */ +static void get_cap_mask (const char *path, unsigned long *bitmask, size_t max_size) +{ + FILE* f; + int i; + char text[4096]; + 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); + + memset (bitmask, 0, max_size); + i = 0; + while ((word = strrchr(text, ' ')) != NULL) { + val = strtoul (word+1, NULL, 16); + bitmask[i] = val; + *word = '\0'; + ++i; + } + val = strtoul (text, NULL, 16); + bitmask[i] = val; +} + +/* pointer devices */ +static void test_pointers (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 (ABS_X, bitmask_abs) && test_bit (ABS_Y, bitmask_abs)) { + if (test_bit (BTN_STYLUS, bitmask_key)) + puts("ID_INPUT_TABLET=1"); + else if (test_bit (BTN_TOUCH, bitmask_key)) + is_touchpad = 1; + else if (test_bit (BTN_TRIGGER, bitmask_key) || + test_bit (BTN_A, bitmask_key) || + test_bit (BTN_1, bitmask_key)) + puts("ID_INPUT_JOYSTICK=1"); + else if (test_bit (BTN_MOUSE, bitmask_key)) + /* This path is taken by VMware's USB mouse, which has + * absolute axes, but no touch/pressure button. */ + is_mouse = 1; + } + + if (test_bit (REL_X, bitmask_rel) && test_bit (REL_Y, bitmask_rel)) + is_mouse = 1; + + if (is_mouse) + puts("ID_INPUT_MOUSE=1"); + if (is_touchpad) + puts("ID_INPUT_TOUCHPAD=1"); +} + +/* key like devices */ +static void test_key (const unsigned long* bitmask_key) +{ + unsigned i; + unsigned long acc; + unsigned long mask; + + /* do we have any KEY_* capability? */ + acc = 0; + for (i = 0; i < BTN_MISC/BITS_PER_LONG; ++i) + acc |= bitmask_key[i]; + if (acc > 0) + puts("ID_INPUT_KEY=1"); + + /* the first 32 bits are ESC, numbers, and Q to D; if we have all of + * those, consider it a full keyboard; do not test KEY_RESERVED, though */ + mask = 0xFFFFFFFE; + if ((bitmask_key[0] & mask) == mask) + puts("ID_INPUT_KEYBOARD=1"); +} + +int main (int argc, char** argv) +{ + char capfile[PATH_MAX]; + unsigned long bitmask_abs[NBITS(ABS_MAX)]; + unsigned long bitmask_key[NBITS(KEY_MAX)]; + unsigned long bitmask_rel[NBITS(REL_MAX)]; + + if (argc != 2) { + fprintf(stderr, "Usage: %s <device path (without /sys)>\n", argv[0]); + exit(1); + } + + /* 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)); + + test_pointers(bitmask_abs, bitmask_key, bitmask_rel); + + test_key(bitmask_key); + + return 0; +} diff --git a/debian/rules b/debian/rules index 88747da..6c8a0c5 100755 --- a/debian/rules +++ b/debian/rules @@ -141,6 +141,9 @@ obj-$(DEB_BUILD_GNU_TYPE)/config.status: configure CFLAGS="$(CFLAGS)" \ CPPFLAGS="$(CPPFLAGS)" +ifeq ($(DEB_HOST_ARCH_OS), linux) +build-stamp: debian/local/input_id +endif build: build-stamp tests-stamp build-stamp: obj-$(DEB_BUILD_GNU_TYPE)/config.status @@ -168,7 +171,7 @@ clean: xsfclean rm -f m4/lt*.m4 m4/libtool.m4 find -name Makefile.in -delete - dh_clean + dh_clean debian/local/input_id install: build dh_testdir @@ -220,6 +223,8 @@ binary-arch: build install ifeq ($(DEB_HOST_ARCH_OS), linux) install -d debian/xserver-xorg-core/lib/udev/rules.d install -m 644 debian/local/64-xorg-xkb.rules debian/xserver-xorg-core/lib/udev/rules.d + install -d debian/xserver-xorg-core/lib/xorg + install -m 755 debian/local/input_id debian/xserver-xorg-core/lib/xorg endif dh_installdebconf -s dh_installman -s -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org