From cab882de60f6a0456633c2229e23e2d6d2265a3d Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 21 Mar 2026 13:01:58 +0100 Subject: [PATCH] Tests as part of build process and unifying with vscode keybinding scheme --- build.sh | 17 ++- src/commands.cpp | 2 +- src/plugin_basic_commands.cpp | 10 +- src/plugin_config.cpp | 8 +- src/plugin_tests.cpp | 237 ++++++++++++++++++++++++++++++- src/plugin_window_management.cpp | 8 +- src/text_editor.cpp | 15 +- 7 files changed, 272 insertions(+), 25 deletions(-) diff --git a/build.sh b/build.sh index 9a973c8..198fb71 100755 --- a/build.sh +++ b/build.sh @@ -1,10 +1,11 @@ #!/usr/bin/bash for arg in "$@"; do declare $arg='1'; done -if [ ! -v release ]; then debug=1; fi -if [ -v debug ]; then echo "[debug build]"; fi -if [ -v release ]; then echo "[release build]"; fi -if [ -v slow ]; then echo "[slow build]"; fi +if [ ! -v release ]; then debug=1; fi +if [ -v debug ]; then echo "[debug build]"; fi +if [ -v release ]; then echo "[release build]"; fi +if [ -v slow ]; then echo "[slow build]"; fi +if [ -v addr ]; then echo "[address sanitizer build]"; fi mkdir -p build @@ -28,8 +29,10 @@ flags="-Wall -Wextra -Werror -Wformat=2 -Wundef -Wshadow -Wno-missing-field-init -g -fdiagnostics-absolute-paths \ -nostdlib++ -fno-exceptions" -if [ -v debug ]; then flags="$flags -fsanitize=address,undefined -fno-omit-frame-pointer -DDEBUG_BUILD=1"; fi -if [ -v release ]; then flags="$flags -DDEBUG_BUILD=0 -O2"; fi -if [ -v slow ]; then flags="$flags -DSLOW_BUILD=1"; fi +if [ -v debug ]; then flags="$flags -fsanitize=undefined -fno-omit-frame-pointer -DDEBUG_BUILD=1"; fi +if [ -v release ]; then flags="$flags -DDEBUG_BUILD=0 -O2"; fi +if [ -v slow ]; then flags="$flags -DSLOW_BUILD=1"; fi +if [ -v addr ]; then flags="$flags -fsanitize=address"; fi time clang -o te $flags ../src/text_editor.cpp $I -lSDL3 -lm -lbacktrace +./te :RunTests \ No newline at end of file diff --git a/src/commands.cpp b/src/commands.cpp index 83dbf21..cb48a05 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -256,4 +256,4 @@ void CMD_SelectComment() { } MergeCarets(active.buffer, &active.view->carets); -} RegisterCommand(CMD_SelectComment, "ctrl-shift-l", "Find /* and */ and select the content in between"); \ No newline at end of file +} RegisterCommand(CMD_SelectComment, "ctrl-semicolon", "Find /* and */ and select the content in between"); \ No newline at end of file diff --git a/src/plugin_basic_commands.cpp b/src/plugin_basic_commands.cpp index cbd0e7c..2d6d6b5 100644 --- a/src/plugin_basic_commands.cpp +++ b/src/plugin_basic_commands.cpp @@ -37,7 +37,7 @@ void CMD_DedentSelectedLines() { void CMD_DuplicateLineDown() { BSet active = GetBSet(ActiveWindowID); DuplicateLine(active.view, DIR_DOWN); -} RegisterCommand(CMD_DuplicateLineDown, "ctrl-alt-down", ""); +} RegisterCommand(CMD_DuplicateLineDown, "ctrl-shift-alt-down", ""); void CMD_CreateCursorDown() { BSet active = GetBSet(ActiveWindowID); @@ -72,7 +72,7 @@ void CMD_MoveDown() { void CMD_DuplicateLineUp() { BSet active = GetBSet(ActiveWindowID); DuplicateLine(active.view, DIR_UP); -} RegisterCommand(CMD_DuplicateLineUp, "ctrl-alt-up", ""); +} RegisterCommand(CMD_DuplicateLineUp, "ctrl-shift-alt-up", ""); void CMD_CreateCursorUp() { BSet active = GetBSet(ActiveWindowID); @@ -234,6 +234,12 @@ void CMD_NewLine() { IndentedNewLine(active.view); } RegisterCommand(CMD_NewLine, "enter | shift-enter", ""); +void CMD_SearchAllOccurences() { + BSet active = GetBSet(ActiveWindowID); + String16 needle = GetString(active.buffer, active.view->carets[0].range); + SelectAllOccurences(active.view, needle); +} RegisterCommand(CMD_SearchAllOccurences, "ctrl-shift-l", "Use the selected word as needle and selects all the possible occurences in current buffer"); + void CMD_CreateCaretOnNextFind() { BSet active = GetBSet(ActiveWindowID); String16 string = GetString(active.buffer, active.view->carets[0].range); diff --git a/src/plugin_config.cpp b/src/plugin_config.cpp index 6da19f1..7af6560 100644 --- a/src/plugin_config.cpp +++ b/src/plugin_config.cpp @@ -88,17 +88,17 @@ void Set(String string) { string = Skip(string, 1); String quote = SkipUntil(&string, {&c, 1}); ExpectP(At(string, 0) == c, ":Set %S , unclosed quote", name); - ReportConsolef(":Set %S %c%S%c", name, c, quote, c); + // ReportConsolef(":Set %S %c%S%c", name, c, quote, c); *var->string = Intern(&GlobalInternTable, quote); } else if (var->type == VariableType_Int) { ExpectP(IsDigit(At(string, 0)), "Expected an integer to follow the command name, instead got: %S", string); Int number = SkipInt(&string); - ReportConsolef(":Set %S %lld", name, number); + // ReportConsolef(":Set %S %lld", name, number); *var->i = number; } else if (var->type == VariableType_Float) { ExpectP(IsDigit(At(string, 0)), "Expected float to follow the command name, instead got: %S", string); Float number = SkipFloat(&string); - ReportConsolef(":Set %S %f", name, number); + // ReportConsolef(":Set %S %f", name, number); *var->f = number; } else if (var->type == VariableType_Color) { ExpectP(IsHexDigit(At(string, 0)), "Expected hex integer to follow the command name, instead got: %S", string); @@ -107,7 +107,7 @@ void Set(String string) { string = Skip(string, 1); begin.len += 1; } - ReportConsolef(":Set %S %S", name, begin); + // ReportConsolef(":Set %S %S", name, begin); var->color->value = (uint32_t)strtoll(begin.data, NULL, 16); } ElseInvalidCodepath(); diff --git a/src/plugin_tests.cpp b/src/plugin_tests.cpp index 75bdda0..831cd06 100644 --- a/src/plugin_tests.cpp +++ b/src/plugin_tests.cpp @@ -1,5 +1,5 @@ #if PLUGIN_TESTS -bool Testing = true; +bool Testing = false; void Wait(mco_coro *co) { Add(&EventPlayback, {EVENT_KIND_INVALID}); @@ -7,7 +7,24 @@ void Wait(mco_coro *co) { } } -void CO_FirstTest(mco_coro *co) { +void Wait(mco_coro *co, int updates) { + for (int i = 0; i < updates; i += 1) { + {Event ev = {};ev.kind = EVENT_UPDATE; Add(&EventPlayback, ev);} + } + {Event ev = {};ev.kind = EVENT_KIND_INVALID; Add(&EventPlayback, ev);} + Wait(co); +} + +void OpenCloseCodeTest(mco_coro *co) { + Int initial_buffers_count = Buffers.len; + CO_OpenCode(co); + Assert(Buffers.len > initial_buffers_count); + CO_CloseAll(co); + Wait(co); + Assert(initial_buffers_count - 1 == Buffers.len); +} + +void CO_RunTests(mco_coro *co) { Testing = true; WaitForEvents = false; {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1412; ev.ywindow = 1032; ev.xmouse = 1234; ev.ymouse = 594; Add(&EventPlayback, ev);} @@ -37,7 +54,6 @@ void CO_FirstTest(mco_coro *co) { {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1412; ev.ywindow = 1032; ev.xmouse = 1234; ev.ymouse = 594; ev.text = "f"; Add(&EventPlayback, ev);} {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1412; ev.ywindow = 1032; ev.xmouse = 1234; ev.ymouse = 594; ev.text = "f"; Add(&EventPlayback, ev);} Wait(co); - String16 result = uR"FOO( @@ -49,8 +65,221 @@ Memes and stuff)FOO"; BSet set = GetBSet(PrimaryWindowID); Assert(AreEqual(result, GetString(set.buffer))); + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.text = "M"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "e"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "m"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "e"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_L; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_C; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PAGEUP; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LALT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RIGHT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_C; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RIGHT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.text = "T"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "g"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_B; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.text = "A"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_COMMA; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.text = "<"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSLASH; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.shift = 1; ev.text = "|"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_V; ev.xwindow = 1920; ev.ywindow = 1061; ev.xmouse = 835; ev.ctrl = 1; Add(&EventPlayback, ev);} + Wait(co); + result = uR"FOO( +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +Memes Things Memes <| +Memes +)FOO"; + + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "L"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "e"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_APOSTROPHE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "'"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "d"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "o"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_UP; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_DOWN; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_END; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PAGEDOWN; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "M"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "e"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "m"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "e"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "a"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "d"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "s"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "u"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "u"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "f"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "f"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LALT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_UP; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSLASH; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "|"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_COMMA; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "<"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "T"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "g"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_SPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = " "; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "g"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_RETURN; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "t"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "g"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_UP; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_UP; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LEFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_L; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_BACKSPACE; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "N"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "o"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.text = "T"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "h"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "i"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "n"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.text = "g"; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LSHIFT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LALT; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; ev.alt = 1; Add(&EventPlayback, ev);} + {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_J; ev.xwindow = 1920; ev.ywindow = 2121; ev.ymouse = 1289; ev.shift = 1; ev.ctrl = 1; ev.alt = 1; Add(&EventPlayback, ev);} + Wait(co); + result = uR"FOO(Let's do this |< NoThing NoThing +NoThing +Memes and stuff |< NoThing NoThing +NoThing)FOO"; + + + if (ErrorCount != 0) { + Scratch scratch; + String string = AllocCharString(scratch, LogBuffer); + printf("TEXT EDITOR ERRORS!\n==========================\n%.*s", (int)string.len, string.data); + } + printf("RunTests OK\n"); + fflush(stdout); void CMD_QuitWithoutSaving(); CMD_QuitWithoutSaving(); +} RegisterCoroutineCommand(CO_RunTests, "", "Basic tests"); + -} RegisterCoroutineCommand(CO_FirstTest, "", "Basic tests"); #endif diff --git a/src/plugin_window_management.cpp b/src/plugin_window_management.cpp index bb2640f..d57c8e2 100644 --- a/src/plugin_window_management.cpp +++ b/src/plugin_window_management.cpp @@ -9,14 +9,14 @@ void CMD_Prev() { main.window->skip_checkpoint = true; JumpBack(main.window); NextActiveWindowID = main.window->id; -} RegisterCommand(CMD_Prev, "alt-q | mousex1", "Go to previous position (either previous view that was open or caret position) in the primary window"); +} RegisterCommand(CMD_Prev, "alt-q | mousex1 | ctrl-alt-minus", "Go to previous position (either previous view that was open or caret position) in the primary window"); void CMD_Next() { BSet main = GetBSet(PrimaryWindowID); main.window->skip_checkpoint = true; JumpForward(main.window); NextActiveWindowID = main.window->id; -} RegisterCommand(CMD_Next, "alt-shift-q | mousex2", "Go to next position, after backtracking, in the primary window"); +} RegisterCommand(CMD_Next, "alt-shift-q | mousex2 | ctrl-shift-minus", "Go to next position, after backtracking, in the primary window"); void CMD_FocusLeftWindow() { NextActiveWindowID = SwitchWindow(DIR_LEFT)->id; @@ -74,9 +74,9 @@ void CMD_CloseWindow() { void CMD_GotoNextInList() { BSet main = GetBSet(PrimaryWindowID); GotoNextInList(main.window, 1); -} RegisterCommand(CMD_GotoNextInList, "ctrl-e", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the next compiler error"); +} RegisterCommand(CMD_GotoNextInList, "ctrl-e | f8", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the next compiler error"); void CMD_GotoPrevInList() { BSet main = GetBSet(PrimaryWindowID); GotoNextInList(main.window, -1); -} RegisterCommand(CMD_GotoPrevInList, "alt-e", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the previous compiler error"); +} RegisterCommand(CMD_GotoPrevInList, "alt-e | shift-f8", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the previous compiler error"); diff --git a/src/text_editor.cpp b/src/text_editor.cpp index 80d6a9e..b14ac51 100644 --- a/src/text_editor.cpp +++ b/src/text_editor.cpp @@ -1,5 +1,4 @@ /* -- [ ] Switch fully to VSCode keybindings and learn to live with it - [x] list_functions.sh and rg in general in the color mode is prinitng differently from terminal as well as output is truncated! - [ ] Syntax for executing commands from root of project, or maybe commands should be executed from root of the CurrentDirectory and there should be a cd command instead of OpenProject - [ ] Fuzzy search over executed command ouput @@ -8,6 +7,18 @@ - [x] ctrl-e with these short main.c:290: breaks a little, need to first click ctrl-e and then alt-e to jump - [ ] Use command window without special fuzzy search features to type commands and stuff for executing shell etc.. +## Monaco like design for familiarity +- [x] Ctrl+Alt+- and Ctrl+Shift+- Jump back, jump forward +- [x] ctrl-shift-l select all occurences of a string +- [ ] ctrl-tab - switch file lister with instant hold release semantics? +- [ ] SearchAndReplace how to do better? +- [ ] ctrl-alt-MouseClick should add a cursor instead of alt-MouseClick +- [ ] ctrl-t find workspace symbols? how can we do it? +- [ ] ctrl-b what to do with this? +- [ ] ctrl-alt-r open containing folder (file explorer system) +- [ ] ctrl-alt-MouseMove should do a box select with multiple cursors thing +- [ ] Snippet design? + - [ ] Make a platform layer and separate SDL stuff out - [x] ReplaceAll - heap-use-after-free address, how to debug? I think would be nice to iterate all buffer ids and their addresses along with the state @@ -1140,8 +1151,6 @@ int main(int argc, char **argv, char **envp) QuitDebugger(); #endif CleanupRender(); - - SDL_DestroyCursor(SDL_MouseCursor); SDL_DestroyWindow(SDLWindow); SDL_Quit();