summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c56
1 files changed, 20 insertions, 36 deletions
diff --git a/main.c b/main.c
index b042a35..8862c6f 100644
--- a/main.c
+++ b/main.c
@@ -139,59 +139,43 @@ void create_uinput_device(int fd) {
}
}
-void press_event(struct input_event *event, unsigned short code) {
+void clear_event(struct input_event *event) {
memset(event, 0, sizeof(event));
gettimeofday(&(event->time), NULL);
-
- event->type = EV_KEY;
- event->code = code;
- event->value = 1;
-}
-
-void release_event(struct input_event *event, unsigned short code) {
- memset(event, 0, sizeof(event));
- gettimeofday(&(event->time), NULL);
-
- event->type = EV_KEY;
- event->code = code;
- event->value = 0;
-}
-
-void syn_event(struct input_event *event) {
- memset(event, 0, sizeof(event));
- gettimeofday(&(event->time), NULL);
-
- event->type = EV_SYN;
- event->code = SYN_REPORT;
- event->value = 0;
}
void write_state(int fd) {
struct input_event event;
+ bool dirty = false;
for (int i = 0; i < 24; i++) {
unsigned short code = mapping[i];
if (code == 0) continue;
bool pressed = ((state >> i) & 1) && !((old_state >> i) & 1);
bool released = ((old_state >> i) & 1) && !((state >> i) & 1);
+ if (!pressed && !released) continue;
- if (pressed) {
- press_event(&event, code);
- if (write(fd, &event, sizeof(event)) < 0) {
- fatal("failed to write uinput press event");
- }
- } else if (released) {
- release_event(&event, code);
- if (write(fd, &event, sizeof(event)) < 0) {
- fatal("failed to write uinput release event");
- }
+ clear_event(&event);
+ event.type = EV_KEY;
+ event.code = code;
+ event.value = pressed ? 1 : 0;
+
+ if (write(fd, &event, sizeof(event)) < 0) {
+ fatal("failed to write uinput press/release event");
}
+
+ dirty = true;
}
- syn_event(&event);
- if (write(fd, &event, sizeof(event)) < 0) {
- fatal("failed to write uinput syn event");
+ if (dirty) {
+ clear_event(&event);
+ event.type = EV_SYN;
+ event.code = SYN_REPORT;
+
+ if (write(fd, &event, sizeof(event)) < 0) {
+ fatal("failed to write uinput syn event");
+ }
}
}