diff --git a/src/event.c b/src/event.c index 3ae6b44..0c6ffca 100644 --- a/src/event.c +++ b/src/event.c @@ -23,6 +23,16 @@ void init_event(event *event, char is_pressed) if (is_pressed) event->infos = 0x80; } +void dummy_event(event *event) +{ + event->infos |= DUMMY; +} + +int is_dummy(event *event) +{ + return (event->infos & DUMMY) == DUMMY; +} + void mouse_event(event *event, mouse_button button) { init_event(event, 0); diff --git a/src/event.h b/src/event.h index d566160..34452c7 100644 --- a/src/event.h +++ b/src/event.h @@ -1,15 +1,18 @@ #ifndef EVENT_USER #define EVENT_USER +#define DUMMY 0x80 + /* * Structure containing informations about events. */ typedef struct { /* - * X00T 00ZZ + * XD0T 00ZZ * * Where: * * X = press (1) or release (0) + * * D = dummy, ignore this event (1) * * T = keyboard (1) or mouse (0) * * ZZ (only for mouse events) = button * * left (01) @@ -48,6 +51,16 @@ void reset(event *event); */ void init_event(event *event, char is_pressed); +/* + * Make a dummy event. + */ +void dummy_event(event *event); + +/* + * Check if an event is dummy or not. + */ +int is_dummy(event *event); + /* * Init a mouse event and set if the button is pressed or not. * The caller must indicate coordonates. diff --git a/src/read_events.c b/src/read_events.c index fa619f6..74cacfd 100644 --- a/src/read_events.c +++ b/src/read_events.c @@ -8,12 +8,13 @@ #include "event.h" #include "read_events.h" -args_cancel_thread_read* init_args_read(int fd, event *user_event, Display *display) +args_cancel_thread_read* init_args_read(int fd, event *user_event, Display *display, FILE *file) { args_cancel_thread_read *ret = (args_cancel_thread_read *) malloc(sizeof(args_cancel_thread_read)); ret->fd = fd; ret->user_event = user_event; ret->display = display; + ret->file = file; return ret; } @@ -21,11 +22,20 @@ args_cancel_thread_read* init_args_read(int fd, event *user_event, Display *disp void cancel_read_events(args_cancel_thread_read *arg) { int fd = arg->fd; + FILE *file = arg->file; + /* flush the middle button */ unsigned char data[3]; read(fd, data, sizeof(data)); read(fd, data, sizeof(data)); + if (file != NULL) + { + dummy_event(arg->user_event); + fseek(file, -1 * sizeof(event), SEEK_END); + write_event(arg->user_event, file); + } + free(arg->user_event); close(fd); XCloseDisplay(arg->display); @@ -62,7 +72,7 @@ int listen(FILE *file) return -1; } - pthread_cleanup_push(cancel_read_events, init_args_read(fd, user_event, display)); + pthread_cleanup_push(cancel_read_events, init_args_read(fd, user_event, display, file)); while (1) { diff --git a/src/read_events.h b/src/read_events.h index 3b84eb9..4bc94e5 100644 --- a/src/read_events.h +++ b/src/read_events.h @@ -11,9 +11,10 @@ typedef struct { int fd; event *user_event; Display *display; + FILE *file; } args_cancel_thread_read; -args_cancel_thread_read * init_args_read(int fd, event *user_event, Display *display); +args_cancel_thread_read * init_args_read(int fd, event *user_event, Display *display, FILE *file); void write_event(event *new_event, FILE *file); diff --git a/src/read_file.c b/src/read_file.c index b64247a..28d1188 100644 --- a/src/read_file.c +++ b/src/read_file.c @@ -32,9 +32,11 @@ void readfile(args_readfile *args) break; } + if (is_dummy(current_event)) continue; + left = (current_event->infos & M_LEFT) == M_LEFT; - right =(current_event->infos & M_RIGHT) == M_RIGHT; - middle=(current_event->infos & M_MIDDLE) == M_MIDDLE ; + right = (current_event->infos & M_RIGHT) == M_RIGHT; + middle = (current_event->infos & M_MIDDLE) == M_MIDDLE ; x = current_event->x; y = current_event->y;