summaryrefslogtreecommitdiff
path: root/src/minibuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/minibuffer.c')
-rw-r--r--src/minibuffer.c77
1 files changed, 19 insertions, 58 deletions
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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
-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, &current);
- 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; }