diff options
| author | Albert Cervin <albert@acervin.com> | 2024-01-24 13:00:09 +0100 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2024-01-24 13:00:09 +0100 |
| commit | c27f5c5ed4bce91eaa50d7d1daa5335f186dcc36 (patch) | |
| tree | 93f7ecb1e7d1ebb792d767255b27c1742745204a /src/dged/minibuffer.c | |
| parent | 64d6816a36567274551dd4f067fe4d05b1445cc0 (diff) | |
| download | dged-c27f5c5ed4bce91eaa50d7d1daa5335f186dcc36.tar.gz dged-c27f5c5ed4bce91eaa50d7d1daa5335f186dcc36.tar.xz dged-c27f5c5ed4bce91eaa50d7d1daa5335f186dcc36.zip | |
Relative find file and small fixes
- Save text was not always displaying
- Files were sometimes not reloaded properly
Diffstat (limited to 'src/dged/minibuffer.c')
| -rw-r--r-- | src/dged/minibuffer.c | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/src/dged/minibuffer.c b/src/dged/minibuffer.c index 2105c52..eacf8da 100644 --- a/src/dged/minibuffer.c +++ b/src/dged/minibuffer.c @@ -91,7 +91,10 @@ void minibuffer_init(struct buffer *buffer) { } g_minibuffer.buffer = buffer; + g_minibuffer.expires.tv_sec = 0; + g_minibuffer.expires.tv_nsec = 0; g_minibuffer.clear = false; + g_minibuffer.prompt_active = false; buffer_add_update_hook(g_minibuffer.buffer, update, &g_minibuffer); } @@ -100,6 +103,10 @@ void echo(uint32_t timeout, const char *fmt, va_list args) { return; } + clock_gettime(CLOCK_MONOTONIC, &g_minibuffer.expires); + g_minibuffer.expires.tv_sec += timeout; + g_minibuffer.clear = false; + char buff[2048]; size_t nbytes = vsnprintf(buff, 2048, fmt, args); @@ -107,10 +114,6 @@ void echo(uint32_t timeout, const char *fmt, va_list args) { // of overflow buffer_set_text(g_minibuffer.buffer, (uint8_t *)buff, nbytes > 2048 ? 2048 : nbytes); - g_minibuffer.clear = false; - - clock_gettime(CLOCK_MONOTONIC, &g_minibuffer.expires); - g_minibuffer.expires.tv_sec += timeout; } void minibuffer_destroy() { @@ -143,27 +146,59 @@ void minibuffer_set_prompt_internal(const char *fmt, va_list args) { vsnprintf(g_minibuffer.prompt, sizeof(g_minibuffer.prompt), fmt, args); } -int32_t minibuffer_prompt(struct command_ctx command_ctx, const char *fmt, - ...) { +static void minibuffer_setup(struct command_ctx command_ctx, + const char *initial) { + g_minibuffer.prompt_active = true; + + command_ctx_free(&g_minibuffer.prompt_command_ctx); + g_minibuffer.prompt_command_ctx = command_ctx; + + if (windows_get_active() != minibuffer_window()) { + g_minibuffer.prev_window = windows_get_active(); + windows_set_active(minibuffer_window()); + } + + if (initial != NULL) { + buffer_set_text(g_minibuffer.buffer, (uint8_t *)initial, strlen(initial)); + + // there might be an earlier clear request but + // we have sort of taken care of that here + g_minibuffer.clear = false; + + // TODO: what to do with these + buffer_view_goto_end_of_line(window_buffer_view(minibuffer_window())); + } else { + minibuffer_clear(); + } +} + +int32_t minibuffer_prompt_initial(struct command_ctx command_ctx, + const char *initial, const char *fmt, ...) { if (g_minibuffer.buffer == NULL) { return 1; } + minibuffer_setup(command_ctx, initial); + va_list args; va_start(args, fmt); + minibuffer_set_prompt_internal(fmt, args); + va_end(args); - minibuffer_clear(); - g_minibuffer.prompt_active = true; + return 0; +} - command_ctx_free(&g_minibuffer.prompt_command_ctx); - g_minibuffer.prompt_command_ctx = command_ctx; +int32_t minibuffer_prompt(struct command_ctx command_ctx, const char *fmt, + ...) { + if (g_minibuffer.buffer == NULL) { + return 1; + } - minibuffer_set_prompt_internal(fmt, args); + minibuffer_setup(command_ctx, NULL); - if (windows_get_active() != minibuffer_window()) { - g_minibuffer.prev_window = windows_get_active(); - windows_set_active(minibuffer_window()); - } + va_list args; + va_start(args, fmt); + minibuffer_set_prompt_internal(fmt, args); va_end(args); return 0; @@ -193,6 +228,7 @@ bool minibuffer_displaying() { void minibuffer_clear() { g_minibuffer.expires.tv_sec = 0; + g_minibuffer.expires.tv_nsec = 0; g_minibuffer.clear = true; } |
