Consume events for all input modes
authorMichael Mackus <michaelmackus@gmail.com>
Sat, 5 Nov 2016 18:02:29 +0000 (11:02 -0700)
committerMichael Mackus <michaelmackus@gmail.com>
Sat, 5 Nov 2016 18:02:29 +0000 (11:02 -0700)
src/events.c
src/events.h
src/map.c

index d366856..49c9721 100644 (file)
@@ -14,11 +14,6 @@ extern VbCore vb;
  */
 void queue_event(GdkEventKey *e)
 {
-    if (vb.mode->id != 'i') {
-        /* events are only needed for input mode */
-        return free_events();
-    }
-
     GdkEventKey **newqueue = realloc(events.queue, (events.qlen + 1) * sizeof **newqueue);
 
     if (newqueue == NULL) {
@@ -41,44 +36,30 @@ void queue_event(GdkEventKey *e)
     events.qlen ++;
 }
 
-/**
- * Free latest event & decrement qlen.
- */
-void pop_event()
+void process_event(GdkEventKey* event)
 {
-    if (events.qlen == 0) {
+    if (event == NULL) {
         return;
     }
 
-    free(events.queue[events.qlen - 1]);
-    events.qlen --;
+    events.processing = true; /* signal not to queue other events */
+    gtk_main_do_event ((GdkEvent *) event);
+    events.processing = false;
+    free(event);
 }
 
 /**
  * Process events in the queue, sending the key events to GDK.
  */
-void process_events(bool is_timeout)
+void process_events()
 {
-    if (vb.mode->id != 'i') {
-        /* events are only needed for input mode */
-        return free_events();
-    }
-
-    if (!is_timeout || events.qlen > 1) {
-        /* pop last event to prevent duplicate input */
-        pop_event();
-    }
-
-    events.processing = true; /* signal not to map our events */
-
     for (int i = 0; i < events.qlen; ++i)
     {
-        GdkEventKey *event = events.queue[i];
-        gtk_main_do_event ((GdkEvent *) event);
+        process_event(events.queue[i]); /* process & free the event */
+        /* TODO take into account qk mapped key? */
     }
 
-    free_events();
-    events.processing = false;
+    events.qlen = 0;
 }
 
 /**
index 0b682b1..8ec6480 100644 (file)
@@ -7,8 +7,8 @@
 #include "map.h"
 
 void queue_event(GdkEventKey *e);
-void free_events();
-void process_events(bool is_timeout);
+void process_events();
 bool is_processing_events();
+void free_events();
 
 #endif /* end of include guard: _MAP_H */
index 185180c..d09516d 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -179,19 +179,23 @@ gboolean map_keypress(GtkWidget *widget, GdkEventKey* event, gpointer data)
 
     MapState res = map_handle_keys(string, len, true);
 
-    /* reset the typed flag */
-    vb.state.typed = false;
-
-    if (res == MAP_NOMATCH) {
+    if (res == MAP_AMBIGUOUS) {
+        /* prevent typing key */
+        vb.state.processed_key = true;
+    } else {
         if (!vb.state.processed_key) {
-            /* consume any unprocessed events */
-            process_events(false);
+            /* events ready to be consumed */
+            process_events();
+            vb.state.processed_key = true;
         } else {
-            /* we're done - clear events */
+            /* no ambiguous - key processed elsewhere */
             free_events();
         }
     }
 
+    /* reset the typed flag */
+    vb.state.typed = false;
+
     return vb.state.processed_key;
 }
 
@@ -671,7 +675,7 @@ static gboolean do_timeout(gpointer data)
     MapState res = map_handle_keys((guchar*)"", 0, true);
 
     /* consume any unprocessed events */
-    process_events(true);
+    process_events();
 
     /* we return true to not automatically remove the resource - this is
      * required to prevent critical error when we remove the source in