From d931b14863838a8dceed8cd95c71a75a271cca6b Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Thu, 15 Dec 2022 18:06:59 +0100 Subject: Make minibuffer use an actual buffer Also fix some issues with inserting multibyte chars. --- src/minibuffer.c | 77 ++++++++++++++------------------------------------------ 1 file changed, 19 insertions(+), 58 deletions(-) (limited to 'src/minibuffer.c') diff --git a/src/minibuffer.c b/src/minibuffer.c index 4e6e3b7..649413b 100644 --- a/src/minibuffer.c +++ b/src/minibuffer.c @@ -1,77 +1,38 @@ #include "minibuffer.h" +#include "buffer.h" #include "display.h" #include #include #include -static struct minibuffer g_minibuffer = {0}; - -void minibuffer_init(uint32_t row) { - g_minibuffer.buffer = malloc(4096); - g_minibuffer.capacity = 4096; - g_minibuffer.nbytes = 0; - g_minibuffer.row = row; - g_minibuffer.dirty = false; -} - -void minibuffer_destroy() { - free(g_minibuffer.buffer); - g_minibuffer.capacity = 0; - g_minibuffer.dirty = false; -} - -struct minibuffer_update minibuffer_update(alloc_fn frame_alloc) { - // TODO: multiline - if (g_minibuffer.nbytes == 0 && !g_minibuffer.dirty) { - return (struct minibuffer_update){.cmds = NULL, .ncmds = 0}; - } +static struct minibuffer { + struct buffer *buffer; + struct timespec expires; +} g_minibuffer = {0}; +void update(struct buffer *buffer) { struct timespec current; clock_gettime(CLOCK_MONOTONIC, ¤t); - if (current.tv_sec < g_minibuffer.expires.tv_sec) { - struct render_cmd *cmds = - (struct render_cmd *)frame_alloc(sizeof(struct render_cmd)); - - cmds[0].col = 0; - cmds[0].row = g_minibuffer.row; - cmds[0].data = g_minibuffer.buffer; - cmds[0].len = g_minibuffer.nbytes; - - g_minibuffer.dirty = false; - - return (struct minibuffer_update){ - .cmds = cmds, - .ncmds = 1, - }; - } else { - g_minibuffer.nbytes = 0; - g_minibuffer.dirty = false; - // send a clear draw command - struct render_cmd *cmds = - (struct render_cmd *)frame_alloc(sizeof(struct render_cmd)); - - cmds[0].col = 0; - cmds[0].row = g_minibuffer.row; - cmds[0].data = NULL; - cmds[0].len = 0; - - return (struct minibuffer_update){ - .cmds = cmds, - .ncmds = 1, - }; + if (current.tv_sec >= g_minibuffer.expires.tv_sec) { + buffer_clear(buffer); } } +void minibuffer_init(struct buffer *buffer) { + g_minibuffer.buffer = buffer; + buffer_add_pre_update_hook(g_minibuffer.buffer, update); +} + void echo(uint32_t timeout, const char *fmt, va_list args) { - size_t nbytes = - vsnprintf((char *)g_minibuffer.buffer, g_minibuffer.capacity, fmt, args); + char buff[2048]; + size_t nbytes = vsnprintf(buff, 2048, fmt, args); // vsnprintf returns how many characters it would have wanted to write in case // of overflow - g_minibuffer.nbytes = - nbytes > g_minibuffer.capacity ? g_minibuffer.capacity : nbytes; - g_minibuffer.dirty = true; + buffer_clear(g_minibuffer.buffer); + buffer_add_text(g_minibuffer.buffer, (uint8_t *)buff, + nbytes > 2048 ? 2048 : nbytes); clock_gettime(CLOCK_MONOTONIC, &g_minibuffer.expires); g_minibuffer.expires.tv_sec += timeout; @@ -91,5 +52,5 @@ void minibuffer_echo_timeout(uint32_t timeout, const char *fmt, ...) { va_end(args); } -bool minibuffer_displaying() { return g_minibuffer.nbytes > 0; } +bool minibuffer_displaying() { return !buffer_is_empty(g_minibuffer.buffer); } void minibuffer_clear() { g_minibuffer.expires.tv_nsec = 0; } -- cgit v1.2.3