diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/completion.c | 7 | ||||
| -rw-r--r-- | src/main/main.c | 9 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/main/completion.c b/src/main/completion.c index d777408..7c5de47 100644 --- a/src/main/completion.c +++ b/src/main/completion.c @@ -215,7 +215,11 @@ static void open_completion(struct completion_state *state) { if (!completion_active() || state->target != buffer) { // clear any previous keymaps - abort_completion(); + if (g_state.keymap_id != (uint64_t)-1) { + buffer_remove_keymap(g_state.keymap_id); + } + + g_state.keymap_id = (uint64_t)-1; struct keymap km = keymap_create("completion", 8); struct binding comp_bindings[] = { @@ -227,6 +231,7 @@ static void open_completion(struct completion_state *state) { sizeof(comp_bindings) / sizeof(comp_bindings[0])); state->keymap_id = buffer_add_keymap(buffer, km); + state->target = buffer; } // need to run next frame to have the correct position diff --git a/src/main/main.c b/src/main/main.c index 48d474a..57c2454 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -380,6 +380,8 @@ int main(int argc, char *argv[]) { float frame_time = 0.f; bool needs_render = true; + uint64_t last_render_ns = 0; + const uint64_t target_render_ns = 7 * 1e6 /* 7 ms */; while (running) { timers_start_frame(); @@ -404,7 +406,9 @@ int main(int argc, char *argv[]) { * from updating the buffers. */ struct timer *update_display = timer_start("display"); - if (needs_render) { + int64_t time_to_render_ns = + (last_render_ns + target_render_ns) - instant_ns(); + if (needs_render && time_to_render_ns < 0) { display_begin_render(display); windows_render(display); struct buffer_view *view = window_buffer_view(active_window); @@ -414,6 +418,7 @@ int main(int argc, char *argv[]) { winpos.x + cursor.col); display_end_render(display); needs_render = false; + last_render_ns = instant_ns(); } timer_stop(update_display); @@ -426,7 +431,7 @@ int main(int argc, char *argv[]) { * reason. This is also the reason that there is no timed scope around * this, it simply makes no sense. */ - reactor_update(reactor); + reactor_update(reactor, needs_render ? (time_to_render_ns / 1e6) : -1); } struct timer *update_keyboard = timer_start("update-keyboard"); |
