summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen M. Webb <stephen.webb@canonical.com>2011-11-23 15:05:14 -0500
committerStephen M. Webb <stephen.webb@canonical.com>2011-11-23 15:05:14 -0500
commit5972df0d150a38906787ded58ed2476820435655 (patch)
tree80ebcbb160b7f04c21bad62e2ff8cf041fb53f26
parent0bc71f960cd203eda9affbf6663b17c1e4dce3ee (diff)
parentf1605cf4a4c0b6cc742a00cbbd6999ff9c8bbd16 (diff)
Synched to trunk
-rw-r--r--.bzrignore25
-rw-r--r--Makefile.am10
-rw-r--r--configure.ac6
-rw-r--r--data/lp-884848.prop27
-rw-r--r--include/evemu.h86
-rw-r--r--src/Makefile.am15
-rw-r--r--src/evemu-impl.h4
-rw-r--r--src/evemu.c76
-rw-r--r--src/libutouch-evemu.ver42
-rw-r--r--tools/evemu-device.c3
-rw-r--r--tools/evemu-record.c39
-rw-r--r--utouch-evemu.pc.in1
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}