summaryrefslogtreecommitdiff
path: root/src/dged/minibuffer.c
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2024-01-24 13:00:09 +0100
committerAlbert Cervin <albert@acervin.com>2024-01-24 13:00:09 +0100
commitc27f5c5ed4bce91eaa50d7d1daa5335f186dcc36 (patch)
tree93f7ecb1e7d1ebb792d767255b27c1742745204a /src/dged/minibuffer.c
parent64d6816a36567274551dd4f067fe4d05b1445cc0 (diff)
downloaddged-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.c66
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;
}