Use GSList to queue events.
authorDaniel Carl <danielcarl@gmx.de>
Sat, 19 Nov 2016 22:57:52 +0000 (23:57 +0100)
committerDaniel Carl <danielcarl@gmx.de>
Sat, 19 Nov 2016 22:57:52 +0000 (23:57 +0100)
src/events.c

index 978561a..156c35f 100644 (file)
@@ -2,9 +2,8 @@
 
 /* this is only to queue GDK key events, in order to later send them if the map didn't match */
 static struct {
-    GdkEventKey **queue;        /* queue holding submitted events */
-    int           qlen;         /* pointer to last char in queue */
-    bool          processing;   /* whether or not events are processing */
+    GSList *list;       /* queue holding submitted events */
+    bool    processing; /* whether or not events are processing */
 } events;
 
 extern VbCore vb;
@@ -16,11 +15,9 @@ static void process_event(GdkEventKey *event);
  */
 void queue_event(GdkEventKey *e)
 {
-    events.queue = g_realloc(events.queue, (events.qlen + 1) * sizeof(GdkEventKey*));
-
+    GdkEventKey *copy = g_memdup(e, sizeof(GdkEventKey));
     /* copy memory (otherwise event gets cleared by gdk) */
-    events.queue[events.qlen] = g_memdup(e, sizeof(GdkEventKey));
-    events.qlen ++;
+    events.list = g_slist_append(events.list, copy);
 }
 
 /**
@@ -28,13 +25,12 @@ void queue_event(GdkEventKey *e)
  */
 void process_events()
 {
-    for (int i = 0; i < events.qlen; ++i) {
-        process_event(events.queue[i]);
-        g_free(events.queue[i]);
+    for (GSList *l = events.list; l != NULL; l = l->next) {
+        process_event((GdkEventKey*)l->data);
+        g_free(l->data);
+        events.list = g_slist_delete_link(events.list, l);
         /* TODO take into account qk mapped key? */
     }
-
-    events.qlen = 0;
 }
 
 static void process_event(GdkEventKey *event)
@@ -43,7 +39,8 @@ static void process_event(GdkEventKey *event)
         return;
     }
 
-    events.processing = true; /* signal not to queue other events */
+    /* signal not to queue other events */
+    events.processing = true;
     gtk_main_do_event((GdkEvent*)event);
     events.processing = false;
 }
@@ -63,9 +60,8 @@ bool is_processing_events()
  */
 void free_events()
 {
-    for (int i = 0; i < events.qlen; ++i) {
-        g_free(events.queue[i]);
+    if (events.list) {
+        g_slist_free_full(events.list, (GDestroyNotify)g_free);
+        events.list = NULL;
     }
-
-    events.qlen = 0;
 }