summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-12-21 17:29:14 +0100
committerHenrik Rydberg <rydberg@euromail.se>2010-12-21 17:29:14 +0100
commit1bc6faa48907919376b14429f3b802d0d16fc00a (patch)
tree73e57b6f956d8f50c456330c878e9b210ad41483 /src
parenta8df0405686350c3145b3e5119d796c6642339fd (diff)
Make evemu ABI resilient
Hide the evemu struct, make it versioned, and instead use new/delete and accessor functions. This should give us enough ABI stability to run mixed library implementations. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src')
-rw-r--r--src/evemu-impl.h19
-rw-r--r--src/evemu.c31
2 files changed, 49 insertions, 1 deletions
diff --git a/src/evemu-impl.h b/src/evemu-impl.h
new file mode 100644
index 0000000..2346590
--- /dev/null
+++ b/src/evemu-impl.h
@@ -0,0 +1,19 @@
1#ifndef _EVEMU_IMPL_H
2#define _EVEMU_IMPL_H
3
4#include <evemu.h>
5#include <linux/uinput.h>
6
7#define EVPLAY_NBITS KEY_CNT
8#define EVPLAY_NBYTES ((EVPLAY_NBITS + 7) / 8)
9
10struct evemu_device {
11 int version_major, version_minor;
12 char name[UINPUT_MAX_NAME_SIZE];
13 struct input_id id;
14 unsigned char mask[EV_CNT][EVPLAY_NBYTES];
15 int bytes[EV_CNT];
16 struct input_absinfo abs[ABS_CNT];
17};
18
19#endif
diff --git a/src/evemu.c b/src/evemu.c
index 54156aa..53bda86 100644
--- a/src/evemu.c
+++ b/src/evemu.c
@@ -26,7 +26,8 @@
26 * 26 *
27 ****************************************************************************/ 27 ****************************************************************************/
28 28
29#include "evemu.h" 29#include "evemu-impl.h"
30#include <stdlib.h>
30#include <string.h> 31#include <string.h>
31#include <stdio.h> 32#include <stdio.h>
32#include <fcntl.h> 33#include <fcntl.h>
@@ -44,6 +45,34 @@ static void copy_bits(unsigned char *mask, const unsigned long *bits, int bytes)
44 } 45 }
45} 46}
46 47
48struct evemu_device *evemu_new(const char *name)
49{
50 struct evemu_device *dev = calloc(1, sizeof(struct evemu_device));
51
52 dev->version_major = EVEMU_VERSION_MAJOR;
53 dev->version_minor = EVEMU_VERSION_MINOR;
54
55 if (name && strlen(name) < sizeof(dev->name))
56 strcpy(dev->name, name);
57
58 return dev;
59}
60
61void evemu_delete(struct evemu_device *dev)
62{
63 free(dev);
64}
65
66const char *evemu_get_name(const struct evemu_device *dev)
67{
68 return dev->name;
69}
70
71int evemu_has(const struct evemu_device *dev, int type, int code)
72{
73 return (dev->mask[type][code >> 3] >> (code & 7)) & 1;
74}
75
47int evemu_extract(struct evemu_device *dev, int fd) 76int evemu_extract(struct evemu_device *dev, int fd)
48{ 77{
49 unsigned long bits[64]; 78 unsigned long bits[64];