Compare commits

..

3 Commits

Author SHA1 Message Date
Krzosa Karol
cab882de60 Tests as part of build process and unifying with vscode keybinding scheme 2026-03-21 13:01:58 +01:00
Krzosa Karol
fadf4cd698 Move to globals SDL vars 2026-03-21 10:22:31 +01:00
Krzosa Karol
94ee03800d Basic tests and trying to fix address sanitizer errors 2026-03-21 10:10:24 +01:00
10 changed files with 317 additions and 46 deletions

View File

@@ -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
@@ -13,7 +14,8 @@ if [ ! -e "src/external/SDL" ]; then
git clone https://github.com/libsdl-org/SDL.git
cd SDL
git checkout release-3.2.30
# cmake -S . -B build_linux -DCMAKE_BUILD_TYPE=Release -DSDL_PIPEWIRE=OFF
# We need older version of SDL3 because there is a bug on wayland that
# doubles click events and it's kind of unusable
cmake -S . -B build_linux -DSDL_PIPEWIRE=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cd build_linux
sudo make -j16 install
@@ -27,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

View File

@@ -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");
} RegisterCommand(CMD_SelectComment, "ctrl-semicolon", "Find /* and */ and select the content in between");

View File

@@ -1,4 +1,7 @@
SDL_Window *SDLWindow;
SDL_GLContext SDL_WindowGLContext;
SDL_Cursor *SDL_MouseCursor;
SDL_SystemCursor SDL_MouseCursorLastID;
bool IsInFullscreen;
int FullScreenSizeX, FullScreenSizeY;
int FullScreenPositionX, FullScreenPositionY;

View File

@@ -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);

View File

@@ -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 <error here>, 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();

View File

@@ -1,4 +1,5 @@
bool Testing = true;
#if PLUGIN_TESTS
bool Testing = false;
void Wait(mco_coro *co) {
Add(&EventPlayback, {EVENT_KIND_INVALID});
@@ -6,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);}
@@ -36,5 +54,232 @@ 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(
} RegisterCoroutineCommand(CO_FirstTest, "", "Basic tests");
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");
#endif

View File

@@ -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");

View File

@@ -119,7 +119,7 @@ Font CreateFont(Atlas *atlas, int32_t size, String path) {
}
stbtt_fontinfo stb_font;
int success = stbtt_InitFont(&stb_font, (const unsigned char *)file.data, 0);
int success = stbtt_InitFont(&stb_font, (const unsigned char *)file.data, 0);
if (!success) {
return result;
}

View File

@@ -18,22 +18,20 @@ struct VertexList2D {
struct Shader {
GLuint program; // linked program (vertex+fragment)
GLint uni_invHalf; // uniform location for inv half-screen size
GLint uni_texture; // sampler location
GLint uni_invHalf; // uniform location for inv half-screen size
GLint uni_texture; // sampler location
};
VertexList2D Vertices;
int64_t TotalVertexCount;
int64_t TotalVertexCount;
unsigned VBO, VAO;
Shader Shader2D;
Shader Shader2D;
BlockArena RenderArena;
Rect2 CurrentScissor;
Rect2 CurrentScissor;
Font PrimaryFont;
Font SecondaryFont;
// ---------- shaders (ES3 / WebGL2) ----------
static const char *glsl_vshader_es3 = R"==(#version 300 es
precision highp float;
@@ -82,7 +80,6 @@ void GLDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLs
}
}
// ---------- helper: compile/link ----------
static GLuint CompileShaderSrc(GLenum kind, const char *src) {
GLuint s = glCreateShader(kind);
glShaderSource(s, 1, &src, NULL);
@@ -137,7 +134,6 @@ Shader CreateShaderES3(const char *vsrc, const char *fsrc) {
return out;
}
// ---------- InitRender for ES3 ----------
void InitRender() {
#if !OS_WASM
glDebugMessageCallback(&GLDebugCallback, NULL);
@@ -185,7 +181,6 @@ void BeginFrameRender(float wx, float wy) {
CurrentScissor = Rect0Size(wx, wy);
}
// ---------- EndFrameRender for ES3 ----------
void EndFrameRender(float wx, float wy, Color color) {
ProfileFunction();
glEnable(GL_BLEND);
@@ -391,6 +386,9 @@ void ReloadFont(String path, U32 size) {
Scratch scratch;
Atlas atlas = CreateAtlas(scratch, {2048, 2048});
PrimaryFont = CreateFont(&atlas, (uint32_t)ClampBottom(2u, (U32)size), path);
SecondaryFont = CreateFont(&atlas, 12, path);
SecondaryFont.texture_id = PrimaryFont.texture_id = UploadAtlas(&atlas);
PrimaryFont.texture_id = UploadAtlas(&atlas);
}
void CleanupRender() {
Dealloc(&PrimaryFont.glyphs);
}

View File

@@ -1,18 +1,34 @@
/*
- [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
- [ ] 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
- [ ] When inserting parenthesis and selection is there, put the parens on both sides?
- [ ] KillProcess in console !!! - should also kill all the children ...........
- [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
- [x] BRO, the caret teleports on linux when I press the arrow for too long
- [ ] Report SDL newest vs SDL previous version on wayland
- [ ] Ctrl+Shift+ArrowDown at the end of buffer, doesn't capture characters on last line without new line
- [ ] Remove -lbacktrace and add my backtrace library thing
- [ ] Refactor build.sh to accept commands and remove build_web.sh
- [ ] Cleanups
- [ ] How to enable framerate to be unlimited and not break scrolling?
- [x] When dragging a file into the editor, would be nice if the file opened in the window user dropped the file into. Not the active window.
@@ -91,6 +107,7 @@
#define PLUGIN_REMEDYBG OS_WINDOWS
#define PLUGIN_FILE_COMMANDS 1
#define PLUGIN_WORD_COMPLETE 1
#define PLUGIN_TESTS 1
#include "plugin_directory_navigation.h"
#include "plugin_search_window.h"
@@ -154,16 +171,13 @@ void SetMouseCursor(SDL_SystemCursor id) {
}
#else
void SetMouseCursor(SDL_SystemCursor id) {
static SDL_Cursor *SDL_MouseCursor;
static SDL_SystemCursor last_id;
if (SDL_MouseCursor == NULL || last_id != id) {
if (SDL_MouseCursor == NULL || SDL_MouseCursorLastID != id) {
if (SDL_MouseCursor != NULL) {
SDL_DestroyCursor(SDL_MouseCursor);
}
SDL_MouseCursor = SDL_CreateSystemCursor(id);
SDL_SetCursor(SDL_MouseCursor);
last_id = id;
SDL_MouseCursorLastID = id;
}
}
#endif
@@ -216,9 +230,6 @@ void SetMouseCursor(Event event) {
}
void CMD_QuitWithoutSaving() {
#if PLUGIN_REMEDYBG
QuitDebugger();
#endif
AppIsRunning = false;
} RegisterCommand(CMD_QuitWithoutSaving, "", "Self explanatory");
@@ -1012,8 +1023,8 @@ int main(int argc, char **argv, char **envp)
}
SDL_SetWindowPosition(SDLWindow, xhalf, yhalf);
SDL_GLContext gl_context = SDL_GL_CreateContext(SDLWindow);
SDL_GL_MakeCurrent(SDLWindow, gl_context);
SDL_WindowGLContext = SDL_GL_CreateContext(SDLWindow);
SDL_GL_MakeCurrent(SDLWindow, SDL_WindowGLContext);
SDL_ShowWindow(SDLWindow);
// Set icon
@@ -1136,6 +1147,10 @@ int main(int argc, char **argv, char **envp)
}
#endif
#if PLUGIN_REMEDYBG
QuitDebugger();
#endif
CleanupRender();
SDL_DestroyWindow(SDLWindow);
SDL_Quit();