From: Michael Mackus Date: Sat, 5 Nov 2016 18:02:29 +0000 (-0700) Subject: Consume events for all input modes X-Git-Url: https://git.owens.tech///git?a=commitdiff_plain;h=61eb7bf3a51e176d1d0242243e2a85a367c5d1bb;p=vimb.git Consume events for all input modes --- diff --git a/src/events.c b/src/events.c index d366856..49c9721 100644 --- a/src/events.c +++ b/src/events.c @@ -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; } /** diff --git a/src/events.h b/src/events.h index 0b682b1..8ec6480 100644 --- a/src/events.h +++ b/src/events.h @@ -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 */ diff --git a/src/map.c b/src/map.c index 185180c..d09516d 100644 --- 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