diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 33 | ||||
| -rw-r--r-- | src/reader.cpp | 46 |
2 files changed, 67 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp index 7565371..4959eef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ /* main.cpp - reader: RSVP-style terminal word reader */ +#include <thread> #define _POSIX_C_SOURCE 200809L #include <stdio.h> @@ -15,18 +16,18 @@ int main(int argc, char *argv[]) { - EditorCfg *cfg; - FILE *fp; - long size; - int speed; - std::string content; - std::vector<std::string> data; - size_t i; - std::string *k; + EditorCfg *cfg; + FILE *fp; + long size; + std::string content; + std::vector<std::string> data; + size_t i; + std::string *k; + SCPCQueue<char> queue(1024); cfg = (EditorCfg *)malloc(sizeof(EditorCfg)); - speed = 250000; - + cfg->speed = 250000; + int& speed = cfg->speed; if (!cfg) die("[err]: malloc failed\n"); @@ -58,6 +59,8 @@ main(int argc, char *argv[]) split(content, data, " \t\r\n,;:!?"); + std::thread input_thread(producer, std::ref(queue)); + for (;;) { for (i = 0; i < data.size(); i++) { k = &data[i]; @@ -65,16 +68,26 @@ main(int argc, char *argv[]) continue; window_size_callback(cfg); editor_refresh_scrn(cfg); + consumer(queue, cfg); { int mid = (int)k->size() / 2; int remaining = (int)k->size() - mid - 1; const char *cstr = k->c_str(); + const char message[] = "Current delay: "; + char buf[32]; + int len{}; + write(STDOUT_FILENO, cstr, mid); write(STDOUT_FILENO, "\x1b[31m", 5); write(STDOUT_FILENO, cstr + mid, 1); write(STDOUT_FILENO, "\x1b[m", 3); write(STDOUT_FILENO, cstr + mid + 1, remaining); + + write(STDOUT_FILENO, "\x1b[H", 3); + write(STDOUT_FILENO, message, sizeof(message)-1); + len = snprintf(buf, sizeof(buf), "%d", cfg->speed); + write(STDOUT_FILENO, buf, len); } usleep(speed); } diff --git a/src/reader.cpp b/src/reader.cpp index 4bc88a6..eec7478 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -144,7 +144,7 @@ window_size_callback(EditorCfg *cfg) if (get_window_size(&rows, &cols) < 0) { fprintf(stderr, - "[err]: window_size_callback: get_window_size\n"); + "[err]: window_size_callback: get_window_size\n"); return; } if (cfg->screenrows != rows || cfg->screencols != cols) { @@ -188,7 +188,7 @@ editor_refresh_scrn(EditorCfg *cfg) ab_append(&ab, "\x1b[2J", 4); memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff), "\x1b[%d;%dH", - cfg->screenrows / 2, cfg->screencols / 2); + cfg->screenrows / 2, cfg->screencols / 2); ab_append(&ab, buff, strlen(buff)); ab_write(&ab); ab_free(&ab); @@ -227,3 +227,45 @@ split(const std::string &txt, } return strings.size(); } + +static void +editor_process_key_process(char c, EditorCfg *cfg) +{ + + switch (c) + { + case CTRL_KEY('q'): + write(STDOUT_FILENO, "\x1b[2J", 4); + write(STDOUT_FILENO, "\x1b[H", 3); + exit(0); + break; + case CTRL_KEY('j'): + cfg->speed += 10000; + break; + case CTRL_KEY('k'): + cfg->speed -= 10000; + break; + } +} + +void +producer(SCPCQueue<char> &queue) +{ + for (;;) { + char value = editor_readkey(); + queue.push(value); + } +} + +void +consumer(SCPCQueue<char> &queue, EditorCfg *cfg) +{ + for (;;) { + char value{}; + if (queue.pop(value)) { + editor_process_key_process(value, cfg); + } else { + break; + } + } +} |
