diff options
author | Harry Jeffery <harry@exec64.co.uk> | 2019-06-15 14:28:29 +0100 |
---|---|---|
committer | Harry Jeffery <harry@exec64.co.uk> | 2019-07-03 20:50:19 +0100 |
commit | 7c7dc660e587eac1aa3c8b3405eba95ba558e682 (patch) | |
tree | 81d12d560b60d397be23c7d132e32a5de30e409a /src/console.c | |
parent | 20e9d23b82f55a751c3cf1166cb59ef26775ee00 (diff) | |
download | imv-7c7dc660e587eac1aa3c8b3405eba95ba558e682.tar.gz |
Big glfw refactor
I did a lot of this in a very ad-hoc fashion with no proper commit
history. As such, the kindest thing to do seemed to be to just squash it
into this one commit.
Diffstat (limited to 'src/console.c')
-rw-r--r-- | src/console.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/console.c b/src/console.c new file mode 100644 index 0000000..92e578d --- /dev/null +++ b/src/console.c @@ -0,0 +1,112 @@ +#include "console.h" + +#include <stdlib.h> +#include <string.h> + +struct imv_console { + char *buffer; + size_t buffer_len; + imv_console_callback callback; + void *callback_data; +}; + +struct imv_console *imv_console_create(void) +{ + struct imv_console *console = calloc(1, sizeof *console); + console->buffer_len = 1024; + return console; +} + +void imv_console_free(struct imv_console *console) +{ + if (console->buffer) { + free(console->buffer); + console->buffer = NULL; + } + free(console); +} + +void imv_console_set_command_callback(struct imv_console *console, + imv_console_callback callback, void *data) +{ + console->callback = callback; + console->callback_data = data; +} + +bool imv_console_is_active(struct imv_console *console) +{ + return console->buffer != NULL; +} + +void imv_console_activate(struct imv_console *console) +{ + if (console->buffer) { + return; + } + + console->buffer = calloc(1, console->buffer_len); +} + +void imv_console_input(struct imv_console *console, const char *text) +{ + if (!console || !console->buffer) { + return; + } + + strncat(console->buffer, text, console->buffer_len - 1); +} + +bool imv_console_key(struct imv_console *console, const char *key) +{ + if (!console || !console->buffer) { + return false; + } + + if (!strcmp("Escape", key)) { + free(console->buffer); + console->buffer = NULL; + return true; + } + + if (!strcmp("Return", key)) { + if (console->callback) { + console->callback(console->buffer, console->callback_data); + } + free(console->buffer); + console->buffer = NULL; + return true; + } + + if (!strcmp("BackSpace", key)) { + const size_t len = strlen(console->buffer); + if (len > 0) { + console->buffer[len - 1] = '\0'; + } + return true; + } + + return false; +} + +const char *imv_console_prompt(struct imv_console *console) +{ + return console->buffer; +} + +const char *imv_console_backlog(struct imv_console *console) +{ + (void)console; + return NULL; +} + +void imv_console_write(struct imv_console *console, const char *text) +{ + (void)console; + (void)text; +} + +void imv_console_add_completion(struct imv_console *console, const char *template) +{ + (void)console; + (void)template; +} |