aboutsummaryrefslogtreecommitdiff
path: root/src/console.c
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2019-06-15 14:28:29 +0100
committerHarry Jeffery <harry@exec64.co.uk>2019-07-03 20:50:19 +0100
commit7c7dc660e587eac1aa3c8b3405eba95ba558e682 (patch)
tree81d12d560b60d397be23c7d132e32a5de30e409a /src/console.c
parent20e9d23b82f55a751c3cf1166cb59ef26775ee00 (diff)
downloadimv-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.c112
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;
+}