diff options
author | Stephen M. Webb <stephen.webb@canonical.com> | 2011-11-23 15:05:14 -0500 |
---|---|---|
committer | Stephen M. Webb <stephen.webb@canonical.com> | 2011-11-23 15:05:14 -0500 |
commit | 5972df0d150a38906787ded58ed2476820435655 (patch) | |
tree | 80ebcbb160b7f04c21bad62e2ff8cf041fb53f26 | |
parent | 0bc71f960cd203eda9affbf6663b17c1e4dce3ee (diff) | |
parent | f1605cf4a4c0b6cc742a00cbbd6999ff9c8bbd16 (diff) |
Synched to trunk
-rw-r--r-- | .bzrignore | 25 | ||||
-rw-r--r-- | Makefile.am | 10 | ||||
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | data/lp-884848.prop | 27 | ||||
-rw-r--r-- | include/evemu.h | 86 | ||||
-rw-r--r-- | src/Makefile.am | 15 | ||||
-rw-r--r-- | src/evemu-impl.h | 4 | ||||
-rw-r--r-- | src/evemu.c | 76 | ||||
-rw-r--r-- | src/libutouch-evemu.ver | 42 | ||||
-rw-r--r-- | tools/evemu-device.c | 3 | ||||
-rw-r--r-- | tools/evemu-record.c | 39 | ||||
-rw-r--r-- | utouch-evemu.pc.in | 1 |
12 files changed, 311 insertions, 23 deletions
diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 0000000..f3556d2 --- /dev/null +++ b/.bzrignore @@ -0,0 +1,25 @@ +**.la +**.lo +**.pdf +**/Makefile +*.deps +*.libs +*Makefile.in +aclocal.m4 +autom4te.cache +ChangeLog +config-aux +config.* +configure +libtool +stamp-* +tools/evemu-describe +tools/evemu-describe.1 +tools/evemu-device +tools/evemu-device.1 +tools/evemu-echo +tools/evemu-play +tools/evemu-play.1 +tools/evemu-record +tools/evemu-record.1 +utouch-evemu.pc diff --git a/Makefile.am b/Makefile.am index 183516c..a97bdb1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,15 @@ INCLUDES = $(top_srcdir)/include/ .PHONY: ChangeLog INSTALL INSTALL: $(INSTALL_CMD) + ChangeLog: - bzr log > ChangeLog + @if test -d ".bzr"; then \ + cmd=bzr; \ + elif test -d ".git"; then \ + cmd=git; \ + else \ + cmd="echo could not generate change"; \ + fi; \ + $${cmd} log > ChangeLog; dist-hook: ChangeLog INSTALL diff --git a/configure.ac b/configure.ac index e6b88cb..0ccef4d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([Kernel device emulation], - [1.0.5], + [1.0.7], [], [utouch-evemu]) AC_CONFIG_SRCDIR([Makefile.am]) @@ -10,6 +10,7 @@ AC_CONFIG_AUX_DIR([config-aux]) # Initialize Automake AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_SILENT_RULES([yes]) AM_MAINTAINER_MODE LIB_VERSION=1:0:0 @@ -32,6 +33,9 @@ if test "x$XMLTO" = "x" || test "x$ASCIIDOC" = "x"; then AC_MSG_WARN([xmlto or asciidoc not found - cannot create man pages without it]) fi +AC_SUBST(AM_CFLAGS, + "-Wall -Wextra -pedantic -Werror -std=gnu99 -D_GNU_SOURCE=1") + AC_CONFIG_FILES([Makefile src/Makefile diff --git a/data/lp-884848.prop b/data/lp-884848.prop new file mode 100644 index 0000000..a86e07f --- /dev/null +++ b/data/lp-884848.prop @@ -0,0 +1,27 @@ +N: Elo-TouchSystems,-Inc.-Elo-TouchSystems-2700-IntelliTouch(r)-USB-Touchmonitor-In +I: 0003 04e7 0020 0100 +P: 00 00 00 00 00 00 00 00 +B: 00 1b 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 01 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 02 00 00 00 00 00 00 00 00 +B: 03 03 00 00 00 00 01 00 00 +B: 04 10 00 00 00 00 00 00 00 +B: 05 00 00 00 00 00 00 00 00 +B: 11 00 00 00 00 00 00 00 00 +B: 12 00 00 00 00 00 00 00 00 +B: 15 00 00 00 00 00 00 00 00 +B: 15 00 00 00 00 00 00 00 00 +A: 00 0 4095 0 0 +A: 01 0 4095 0 0 +A: 28 0 256 0 0 diff --git a/include/evemu.h b/include/evemu.h index 1f55d5c..bfcd81e 100644 --- a/include/evemu.h +++ b/include/evemu.h @@ -40,8 +40,8 @@ * ****************************************************************************/ -#ifndef _EVEMU_H -#define _EVEMU_H +#ifndef EVEMU_H +#define EVEMU_H #include <stdio.h> #include <errno.h> @@ -106,6 +106,14 @@ void evemu_set_name(struct evemu_device *dev, const char *name); unsigned int evemu_get_id_bustype(const struct evemu_device *dev); /** + * evemu_set_id_bustype() - set kernel bustype + * + * @dev: the device in use + * @bustype: the bustype value to set. + */ +void evemu_set_id_bustype(struct evemu_device *dev, unsigned int bustype); + +/** * evemu_get_id_vendor() - get kernel device vendor id * @dev: the device in use * @@ -114,6 +122,14 @@ unsigned int evemu_get_id_bustype(const struct evemu_device *dev); unsigned int evemu_get_id_vendor(const struct evemu_device *dev); /** + * evemu_set_id_vendor() - set kernel device vendor id + * + * @dev: the device in use + * @vendor: the vendor id value to set. + */ +void evemu_set_id_vendor(struct evemu_device *dev, unsigned int vendor); + +/** * evemu_get_id_product() - get kernel device product id * @dev: the device in use * @@ -122,6 +138,14 @@ unsigned int evemu_get_id_vendor(const struct evemu_device *dev); unsigned int evemu_get_id_product(const struct evemu_device *dev); /** + * evemu_set_id_product() - set kernel device product id + * + * @dev: the device in use + * @product: the product id value to set. + */ +void evemu_set_id_product(struct evemu_device *dev, unsigned int product); + +/** * evemu_get_id_version() - get kernel device id version * @dev: the device in use * @@ -130,6 +154,14 @@ unsigned int evemu_get_id_product(const struct evemu_device *dev); unsigned int evemu_get_id_version(const struct evemu_device *dev); /** + * evemu_set_id_version() - set kernel device id version + * + * @dev: the device in use + * @version: the version value to set. + */ +void evemu_set_id_version(struct evemu_device *dev, unsigned int version); + +/** * evemu_get_abs_minimum() - get kernel minimum value of event type * @dev: the device in use * @code: the event type code to query @@ -139,6 +171,15 @@ unsigned int evemu_get_id_version(const struct evemu_device *dev); int evemu_get_abs_minimum(const struct evemu_device *dev, int code); /** + * evemu_set_abs_minimum() - set kernel minimum value of event type + * + * @dev: the device in use + * @code: the event type code to set + * @min: the minimum value to set + */ +void evemu_set_abs_minimum(struct evemu_device *dev, int code, int min); + +/** * evemu_get_abs_maximum() - get kernel maximum value of event type * @dev: the device in use * @code: the event type code to query @@ -148,6 +189,15 @@ int evemu_get_abs_minimum(const struct evemu_device *dev, int code); int evemu_get_abs_maximum(const struct evemu_device *dev, int code); /** + * evemu_set_abs_maximum() - set kernel maximum value of event type + * + * @dev: the device in use + * @code: the event type code to set + * @max: the maximum value to set + */ +void evemu_set_abs_maximum(struct evemu_device *dev, int code, int max); + +/** * evemu_get_abs_maximum() - get kernel filter fuzz of event type * @dev: the device in use * @code: the event type code to query @@ -157,6 +207,15 @@ int evemu_get_abs_maximum(const struct evemu_device *dev, int code); int evemu_get_abs_fuzz(const struct evemu_device *dev, int code); /** + * evemu_set_abs_fuzz() - set kernel filter fuzz of event type + * + * @dev: the device in use + * @code: the event type code to set + * @fuzz: the fuzz value to set + */ +void evemu_set_abs_fuzz(struct evemu_device *dev, int code, int fuzz); + +/** * evemu_get_abs_maximum() - get kernel flat value of event type * @dev: the device in use * @code: the event type code to query @@ -167,6 +226,15 @@ int evemu_get_abs_fuzz(const struct evemu_device *dev, int code); int evemu_get_abs_flat(const struct evemu_device *dev, int code); /** + * evemu_set_abs_flat() - set kernel filter flat of event type + * + * @dev: the device in use + * @code: the event type code to set + * @flat: the flat value to set + */ +void evemu_set_abs_flat(struct evemu_device *dev, int code, int flat); + +/** * evemu_get_abs_resolution() - get kernel resolution of event type * @dev: the device in use * @code: the event type code to query @@ -178,6 +246,17 @@ int evemu_get_abs_flat(const struct evemu_device *dev, int code); int evemu_get_abs_resolution(const struct evemu_device *dev, int code); /** + * evemu_set_abs_resolution() - set kernel resolution of event type + * @dev: the device in use + * @code: the event type code to set + * @res: the resolution value to set. + * + * Resolution is specified in units per millimeter (units/mm), or units per + * radian where appropriate. + */ +void evemu_set_abs_resolution(struct evemu_device *dev, int code, int res); + +/** * evemu_has_prop() - check if device has a certain property * @dev: the device in use * @code: the property type code to query @@ -273,9 +352,6 @@ int evemu_read_event_realtime(FILE *fp, struct input_event *ev, * Contiuously reads events from the kernel device and writes them to * the file. The function terminates after ms milliseconds of * inactivity. - * to this function. This function reads a kernel event from the file, - * and performs the microsleep necessary to deliver the event with the - * same timings as originally received. * * Returns zero if successful, negative error otherwise. */ diff --git a/src/Makefile.am b/src/Makefile.am index 182965d..911d530 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,15 +1,24 @@ +version_script = $(srcdir)/libutouch-evemu.ver + lib_LTLIBRARIES = libutouch-evemu.la -libutouch_evemu_la_LDFLAGS = -version-info @LIB_VERSION@ +libutouch_evemu_la_LDFLAGS = \ + -version-info @LIB_VERSION@ \ + -Wl,-z,defs -Wl,--as-needed \ + -Wl,--version-script=$(version_script) + +libutouch_evemu_la_CFLAGS = \ + -Wno-format libutouch_evemu_la_SOURCES = \ evemu-impl.h \ evemu.c -AM_CFLAGS = $(CWARNFLAGS) - INCLUDES = -I$(top_srcdir)/include/ libutouch_evemuincludedir = $(includedir) libutouch_evemuinclude_HEADERS = \ $(top_srcdir)/include/evemu.h + +EXTRA_DIST = $(version_script) + diff --git a/src/evemu-impl.h b/src/evemu-impl.h index acf2976..58a7a8c 100644 --- a/src/evemu-impl.h +++ b/src/evemu-impl.h @@ -15,8 +15,8 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _EVEMU_IMPL_H -#define _EVEMU_IMPL_H +#ifndef EVEMU_IMPL_H +#define EVEMU_IMPL_H #include <evemu.h> #include <linux/uinput.h> diff --git a/src/evemu.c b/src/evemu.c index df6b250..6c84f9d 100644 --- a/src/evemu.c +++ b/src/evemu.c @@ -110,46 +110,95 @@ unsigned int evemu_get_id_bustype(const struct evemu_device *dev) return dev->id.bustype; } +void evemu_set_id_bustype(struct evemu_device *dev, + unsigned int bustype) +{ + dev->id.bustype = bustype; +} + unsigned int evemu_get_id_vendor(const struct evemu_device *dev) { return dev->id.vendor; } +void evemu_set_id_vendor(struct evemu_device *dev, + unsigned int vendor) +{ + dev->id.vendor = vendor; +} + unsigned int evemu_get_id_product(const struct evemu_device *dev) { return dev->id.product; } +void evemu_set_id_product(struct evemu_device *dev, + unsigned int product) +{ + dev->id.product = product; +} + unsigned int evemu_get_id_version(const struct evemu_device *dev) { return dev->id.version; } +void evemu_set_id_version(struct evemu_device *dev, + unsigned int version) +{ + dev->id.version = version; +} + int evemu_get_abs_minimum(const struct evemu_device *dev, int code) { return dev->abs[code].minimum; } +void evemu_set_abs_minimum(struct evemu_device *dev, int code, int min) +{ + dev->abs[code].minimum = min; +} + int evemu_get_abs_maximum(const struct evemu_device *dev, int code) { return dev->abs[code].maximum; } +void evemu_set_abs_maximum(struct evemu_device *dev, int code, int max) +{ + dev->abs[code].maximum = max; +} + int evemu_get_abs_fuzz(const struct evemu_device *dev, int code) { return dev->abs[code].fuzz; } +void evemu_set_abs_fuzz(struct evemu_device *dev, int code, int fuzz) +{ + dev->abs[code].fuzz = fuzz; +} + int evemu_get_abs_flat(const struct evemu_device *dev, int code) { return dev->abs[code].flat; } +void evemu_set_abs_flat(struct evemu_device *dev, int code, int flat) +{ + dev->abs[code].flat = flat; +} + int evemu_get_abs_resolution(const struct evemu_device *dev, int code) { return dev->abs[code].resolution; } +void evemu_set_abs_resolution(struct evemu_device *dev, int code, int res) +{ + dev->abs[code].resolution = res; +} + int evemu_has_prop(const struct evemu_device *dev, int code) { return (dev->prop[code >> 3] >> (code & 7)) & 1; @@ -167,12 +216,9 @@ int evemu_extract(struct evemu_device *dev, int fd) memset(dev, 0, sizeof(*dev)); - SYSCALL(rc = ioctl(fd, EVIOCGNAME(sizeof(dev->name)), dev->name)); + SYSCALL(rc = ioctl(fd, EVIOCGNAME(sizeof(dev->name)-1), dev->name)); if (rc < 0) return rc; - for (i = 0; i < sizeof(dev->name); i++) - if (isspace(dev->name[i])) - dev->name[i] = '-'; SYSCALL(rc = ioctl(fd, EVIOCGID, &dev->id)); if (rc < 0) @@ -265,7 +311,7 @@ static void read_prop(struct evemu_device *dev, FILE *fp) static void read_mask(struct evemu_device *dev, FILE *fp) { unsigned int mask[8]; - int index, i; + unsigned int index, i; while (fscanf(fp, "B: %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", &index, mask + 0, mask + 1, mask + 2, mask + 3, mask + 4, mask + 5, mask + 6, mask + 7) > 0) { @@ -277,7 +323,7 @@ static void read_mask(struct evemu_device *dev, FILE *fp) static void read_abs(struct evemu_device *dev, FILE *fp) { struct input_absinfo abs; - int index; + unsigned int index; while (fscanf(fp, "A: %02x %d %d %d %d\n", &index, &abs.minimum, &abs.maximum, &abs.fuzz, &abs.flat) > 0) dev->abs[index] = abs; @@ -287,12 +333,19 @@ int evemu_read(struct evemu_device *dev, FILE *fp) { unsigned bustype, vendor, product, version; int ret; + char *devname = NULL; memset(dev, 0, sizeof(*dev)); - ret = fscanf(fp, "N: %s\n", dev->name); - if (ret <= 0) + ret = fscanf(fp, "N: %ms\n", &devname); + if (ret <= 0) { + if (devname != NULL) + free(devname); return ret; + } + strncpy(dev->name, devname, sizeof(dev->name)); + dev->name[sizeof(dev->name)-1] = '\0'; + free(devname); ret = fscanf(fp, "I: %04x %04x %04x %04x\n", &bustype, &vendor, &product, &version); @@ -332,6 +385,7 @@ int evemu_record(FILE *fp, int fd, int ms) return ret; if (ret == sizeof(ev)) evemu_write_event(fp, &ev); + fflush(fp); } return 0; @@ -454,6 +508,12 @@ static int set_mask(const struct evemu_device *dev, int type, int fd) for (i = 0; i < bits; i++) { if (!evemu_has_event(dev, type, i)) continue; + + /* kernel doesn't like those */ + if (type == EV_ABS && + dev->abs[i].maximum == 0 && dev->abs[i].minimum == 0) + continue; + ret = set_event_bit(fd, type, i); if (ret < 0) return ret; diff --git a/src/libutouch-evemu.ver b/src/libutouch-evemu.ver new file mode 100644 index 0000000..16f1a32 --- /dev/null +++ b/src/libutouch-evemu.ver @@ -0,0 +1,42 @@ +UTOUCH_EVEMU_1.0 { + global: + evemu_create; + evemu_delete; + evemu_destroy; + evemu_extract; + evemu_get_abs_flat; + evemu_get_abs_fuzz; + evemu_get_abs_maximum; + evemu_get_abs_minimum; + evemu_get_abs_resolution; + evemu_get_id_bustype; + evemu_get_id_product; + evemu_get_id_vendor; + evemu_get_id_version; + evemu_get_name; + evemu_get_version; + evemu_has_event; + evemu_has_prop; + evemu_new; + evemu_play; + evemu_read; + evemu_read_event; + evemu_read_event_realtime; + evemu_record; + evemu_set_abs_flat; + evemu_set_abs_fuzz; + evemu_set_abs_maximum; + evemu_set_abs_minimum; + evemu_set_abs_resolution; + evemu_set_id_bustype; + evemu_set_id_product; + evemu_set_id_vendor; + evemu_set_id_version; + evemu_set_name; + evemu_write; + evemu_write_event; + + local: + *; +}; + diff --git a/tools/evemu-device.c b/tools/evemu-device.c index 6dbfb8b..26da7d9 100644 --- a/tools/evemu-device.c +++ b/tools/evemu-device.c @@ -126,7 +126,8 @@ int main(int argc, char *argv[]) fprintf(stderr, "error: could not open file\n"); return -1; } - if ((ret = evemu_device(fp))) { + ret = evemu_device(fp); + if (ret <= 0) { fprintf(stderr, "error: could not create device: %d\n", ret); return -1; } diff --git a/tools/evemu-record.c b/tools/evemu-record.c index afdd400..a046150 100644 --- a/tools/evemu-record.c +++ b/tools/evemu-record.c @@ -45,14 +45,24 @@ #include <fcntl.h> #include <string.h> #include <unistd.h> +#include <signal.h> #define WAIT_MS 10000 +FILE *output; + +static void handler (int sig __attribute__((unused))) +{ + fflush(output); + if (output != stdout) + fclose(output); +} + int main(int argc, char *argv[]) { int fd; if (argc < 2) { - fprintf(stderr, "Usage: %s <device>\n", argv[0]); + fprintf(stderr, "Usage: %s <device> [output file]\n", argv[0]); return -1; } fd = open(argv[1], O_RDONLY | O_NONBLOCK); @@ -60,9 +70,34 @@ int main(int argc, char *argv[]) fprintf(stderr, "error: could not open device\n"); return -1; } - if (evemu_record(stdout, fd, WAIT_MS)) { + + struct sigaction act; + memset (&act, '\0', sizeof(act)); + act.sa_handler = &handler; + + if (sigaction(SIGTERM, &act, NULL) < 0) { + fprintf (stderr, "Could not attach TERM signal handler.\n"); + return 1; + } + if (sigaction(SIGINT, &act, NULL) < 0) { + fprintf (stderr, "Could not attach INT signal handler.\n"); + return 1; + } + + if (argc < 3) + output = stdout; + else { + output = fopen(argv[2], "w"); + if (!output) { + fprintf(stderr, "error: could not open output file"); + } + } + + if (evemu_record(output, fd, WAIT_MS)) { fprintf(stderr, "error: could not describe device\n"); } close(fd); + if (output != stdout) + fclose(output); return 0; } diff --git a/utouch-evemu.pc.in b/utouch-evemu.pc.in index 60b65e6..f2fe234 100644 --- a/utouch-evemu.pc.in +++ b/utouch-evemu.pc.in @@ -7,3 +7,4 @@ Name: utouch-evemu Description: Kernel device emulation Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lutouch-evemu +Cflags: -I${includedir} |