summaryrefslogtreecommitdiffstats
path: root/minui
diff options
context:
space:
mode:
Diffstat (limited to 'minui')
-rw-r--r--minui/events.c38
-rw-r--r--minui/minui.h2
2 files changed, 38 insertions, 2 deletions
diff --git a/minui/events.c b/minui/events.c
index c533a482a..2918afaa8 100644
--- a/minui/events.c
+++ b/minui/events.c
@@ -27,7 +27,11 @@
#define MAX_DEVICES 16
#define MAX_MISC_FDS 16
-#define test_bit(bit, array) ((array)[(bit)/8] & (1<<((bit)%8)))
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
+
+#define test_bit(bit, array) \
+ ((array)[(bit)/BITS_PER_LONG] & (1 << ((bit) % BITS_PER_LONG)))
struct fd_info {
ev_callback cb;
@@ -50,7 +54,7 @@ int ev_init(ev_callback input_cb, void *data)
dir = opendir("/dev/input");
if(dir != 0) {
while((de = readdir(dir))) {
- uint8_t ev_bits[(EV_MAX + 1) / 8];
+ unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
// fprintf(stderr,"/dev/input/%s\n", de->d_name);
if(strncmp(de->d_name,"event",5)) continue;
@@ -139,3 +143,33 @@ int ev_get_input(int fd, short revents, struct input_event *ev)
}
return -1;
}
+
+int ev_sync_key_state(ev_set_key_callback set_key_cb, void *data)
+{
+ unsigned long key_bits[BITS_TO_LONGS(KEY_MAX)];
+ unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)];
+ unsigned i;
+ int ret;
+
+ for (i = 0; i < ev_dev_count; i++) {
+ int code;
+
+ memset(key_bits, 0, sizeof(key_bits));
+ memset(ev_bits, 0, sizeof(ev_bits));
+
+ ret = ioctl(ev_fds[i].fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits);
+ if (ret < 0 || !test_bit(EV_KEY, ev_bits))
+ continue;
+
+ ret = ioctl(ev_fds[i].fd, EVIOCGKEY(sizeof(key_bits)), key_bits);
+ if (ret < 0)
+ continue;
+
+ for (code = 0; code <= KEY_MAX; code++) {
+ if (test_bit(code, key_bits))
+ set_key_cb(code, 1, data);
+ }
+ }
+
+ return 0;
+}
diff --git a/minui/minui.h b/minui/minui.h
index cb1ed6588..2e2f1f477 100644
--- a/minui/minui.h
+++ b/minui/minui.h
@@ -46,10 +46,12 @@ unsigned int gr_get_height(gr_surface surface);
struct input_event;
typedef int (*ev_callback)(int fd, short revents, void *data);
+typedef int (*ev_set_key_callback)(int code, int value, void *data);
int ev_init(ev_callback input_cb, void *data);
void ev_exit(void);
int ev_add_fd(int fd, ev_callback cb, void *data);
+int ev_sync_key_state(ev_set_key_callback set_key_cb, void *data);
/* timeout has the same semantics as for poll
* 0 : don't block