From e2013f94df8fcc3ffb63e83193e410b51fa62381 Mon Sep 17 00:00:00 2001
From: rick <rick@gnous.eu>
Date: Mon, 19 Dec 2022 15:21:03 +0100
Subject: [PATCH] add dummy event

---
 src/event.c       | 10 ++++++++++
 src/event.h       | 15 ++++++++++++++-
 src/read_events.c | 14 ++++++++++++--
 src/read_events.h |  3 ++-
 src/read_file.c   |  6 ++++--
 5 files changed, 42 insertions(+), 6 deletions(-)

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;