diff --git a/src/basic/string16.cpp b/src/basic/string16.cpp index 664d464..93fdc6a 100644 --- a/src/basic/string16.cpp +++ b/src/basic/string16.cpp @@ -268,4 +268,14 @@ String16 SkipUntil(String16 *string, String16 str) { *string = Skip(*string, 1); } return begin; +} + +String16 SkipWhitespace(String16 *string) { + String16 begin = {string->data, 0}; + for (Int i = 0; i < string->len; i += 1) { + if (!IsWhitespace(string->data[i])) break; + *string = Skip(*string, 1); + begin.len += 1; + } + return begin; } \ No newline at end of file diff --git a/src/text_editor/event.cpp b/src/text_editor/event.cpp index 9a79e90..dda89ee 100644 --- a/src/text_editor/event.cpp +++ b/src/text_editor/event.cpp @@ -1,62 +1,3 @@ -struct Serializer { - Buffer *buffer; - String16 string; - bool is_writing; -}; - -void Serialize(Serializer *s, String name, Int *datum) { - if (s->is_writing) { - IKnowWhatImDoing_Appendf(s->buffer, "%.*s = %lld, ", FmtString(name), (long long)*datum); - } else { - s->string = Skip(s->string, name.len + 3); - *datum = SkipNumber(&s->string); - s->string = Skip(s->string, 2); - } -} - -void Serialize(Serializer *s, String name, uint32_t *datum) { - Int d = *datum; - Serialize(s, name, &d); -} - -void Serialize(Serializer *s, String name, uint8_t *datum) { - Int d = *datum; - Serialize(s, name, &d); -} - -void Serialize(Serializer *s, String name, int16_t *datum) { - Int d = *datum; - Serialize(s, name, &d); -} - -void Serialize(Serializer *s, String name, Vec2 *datum) { - if (s->is_writing) { - IKnowWhatImDoing_Appendf(s->buffer, "%.*s = {%lld, %lld}, ", FmtString(name), (long long)datum->x, (long long)datum->y); - } else { - s->string = Skip(s->string, name.len + 3 + 1); - datum->x = (float)SkipNumber(&s->string); - s->string = Skip(s->string, 2); - datum->y = (float)SkipNumber(&s->string); - s->string = Skip(s->string, 1 + 2); - } -} - -void Serialize(Serializer *s, String name, char **text) { - if (s->is_writing) { - String str = *text; - IKnowWhatImDoing_Appendf(s->buffer, "%.*s = \"'%.*s'\", ", FmtString(name), FmtString(str)); - } else { - s->string = Skip(s->string, name.len + 3 + 2); - String16 str = SkipUntil(&s->string, L"'\""); - if (str.len) { - Scratch scratch; - String s8 = ToString(scratch, str); - *text = Intern(&GlobalInternTable, s8).data; - } - s->string = Skip(s->string, 2 + 2); - } -} - using EventKind = uint32_t; enum { EVENT_NONE, @@ -100,28 +41,19 @@ struct Event { }; void Serialize(Serializer *s, Event *e) { - if (s->is_writing) { - IKnowWhatImDoing_Appendf(s->buffer, "{"); - } else { - s->string = Skip(s->string, 1); - } + SerializeBegin(s); Serialize(s, "kind", &e->kind); Serialize(s, "key", &e->key); Serialize(s, "xmouse", &e->xmouse); Serialize(s, "ymouse", &e->ymouse); + Serialize(s, "xwindow", &e->xwindow); + Serialize(s, "ywindow", &e->ywindow); Serialize(s, "flags", &e->flags); Serialize(s, "wheel", &e->wheel); Serialize(s, "text", &e->text); - if (s->is_writing) { - IKnowWhatImDoing_Appendf(s->buffer, "},\n"); - } else { - s->string = Skip(s->string, 3); - Assert(s->string.len == 0); - } + SerializeEnd(s); } -inline bool IsMouseEvent(EventKind kind) { return kind >= EVENT_MOUSE_LEFT && kind <= EVENT_MOUSE_MOVE; } - const int DIR_RIGHT = 0; const int DIR_LEFT = 1; const int DIR_DOWN = 2; @@ -148,8 +80,13 @@ bool WaitForEvents = true; #define MousePress() (Mouse(LEFT) || Mouse(RIGHT) || Mouse(MIDDLE)) #define MouseUp() (Mouse(LEFT_UP) || Mouse(RIGHT_UP) || Mouse(MIDDLE_UP)) -// Serializer GetSerializer(Arena *arena, bool is_writing) { -// Serializer s = {arena, is_writing}; -// arena->align = 0; -// return s; -// } +Array ParseEvents(Allocator allocator, Buffer *buffer) { + Array events = {allocator}; + Serializer s = {NULL, GetString(buffer), false}; + for (; s.string.len;) { + Event event = {}; + Serialize(&s, &event); + Add(&events, event); + } + return events; +} \ No newline at end of file diff --git a/src/text_editor/serializer.cpp b/src/text_editor/serializer.cpp new file mode 100644 index 0000000..52844fb --- /dev/null +++ b/src/text_editor/serializer.cpp @@ -0,0 +1,80 @@ +struct Serializer { + Buffer *buffer; // for writing + String16 string; // for reading + bool is_writing; +}; + +void Serialize(Serializer *s, String name, Int *datum) { + if (s->is_writing) { + IKnowWhatImDoing_Appendf(s->buffer, "%.*s = %lld, ", FmtString(name), (long long)*datum); + } else { + s->string = Skip(s->string, name.len + 3); + *datum = SkipNumber(&s->string); + s->string = Skip(s->string, 2); + } +} + +void Serialize(Serializer *s, String name, uint32_t *datum) { + Int d = *datum; + Serialize(s, name, &d); + *datum = (uint32_t)d; +} + +void Serialize(Serializer *s, String name, uint8_t *datum) { + Int d = *datum; + Serialize(s, name, &d); + *datum = (uint8_t)d; +} + +void Serialize(Serializer *s, String name, int16_t *datum) { + Int d = *datum; + Serialize(s, name, &d); + *datum = (int16_t)d; +} + +void Serialize(Serializer *s, String name, Vec2 *datum) { + if (s->is_writing) { + IKnowWhatImDoing_Appendf(s->buffer, "%.*s = {%lld, %lld}, ", FmtString(name), (long long)datum->x, (long long)datum->y); + } else { + s->string = Skip(s->string, name.len + 3 + 1); + datum->x = (float)SkipNumber(&s->string); + s->string = Skip(s->string, 2); + datum->y = (float)SkipNumber(&s->string); + s->string = Skip(s->string, 1 + 2); + } +} + +void Serialize(Serializer *s, String name, char **text) { + if (s->is_writing) { + String str = *text; + IKnowWhatImDoing_Appendf(s->buffer, "%.*s = \"(%.*s)\", ", FmtString(name), FmtString(str)); + } else { + s->string = Skip(s->string, name.len + 3 + 2); + String16 str = SkipUntil(&s->string, L")\""); + if (str.len) { + Scratch scratch; + String s8 = ToString(scratch, str); + *text = Intern(&GlobalInternTable, s8).data; + } + s->string = Skip(s->string, 2 + 2); + } +} + +void SerializeBegin(Serializer *s) { + if (s->is_writing) { + IKnowWhatImDoing_Appendf(s->buffer, "{"); + } else { + SkipWhitespace(&s->string); + Assert(s->string[0] == '{'); + s->string = Skip(s->string, 1); + } +} + +void SerializeEnd(Serializer *s) { + if (s->is_writing) { + IKnowWhatImDoing_Appendf(s->buffer, "},\n"); + } else { + Assert(s->string[0] == '}'); + s->string = Skip(s->string, 3); + } +} diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index b37adc6..d260d8a 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -35,6 +35,7 @@ int FullScreenPositionX, FullScreenPositionY; #include "management.cpp" #include "window.cpp" #include "process.cpp" +#include "serializer.cpp" #include "event.cpp" #include "commands.cpp" #include "commands_clipboard.cpp" @@ -132,7 +133,6 @@ Event TranslateSDLEvent(SDL_Event *input_event) { case SDL_EVENT_MOUSE_MOTION: { event.kind = EVENT_MOUSE_MOVE; - // SDL_MouseMotionEvent &b = input_event->motion; } break; case SDL_EVENT_DROP_FILE: { @@ -141,15 +141,6 @@ Event TranslateSDLEvent(SDL_Event *input_event) { String string = b.data; event.text = Intern(&GlobalInternTable, string).data; } break; - - // SDL_SetEventEnabled(SDL_EVENT_DROP_TEXT, true); - // case SDL_EVENT_DROP_TEXT: { - // SDL_DropEvent &b = input_event->drop; - // event.kind = EVENT_DROP_TEXT; - // String string = b.data; - // event.text = Intern(&GlobalInternTable, string).data; - // } break; - default: { }; } @@ -299,22 +290,31 @@ int main(int argc, char **argv) InitWindows(); InitOS(ReportWarningf); + Buffer *playback_buffer = NULL; for (int i = 1; i < argc; i += 1) { - String it = argv[i]; - Window *window = GetWindow({0}); - WindowOpenBufferView(window, it); + String it = argv[i]; + if (!FileExists(it)) continue; + if (EndsWith(it, ".te_events")) { + playback_buffer = BufferOpenFile(it); + } else { + Window *window = GetWindow({0}); + WindowOpenBufferView(window, it); + } } Serializer ser = {EventBuffer, {}, true}; - while (AppIsRunning) { FrameID += 1; Scratch scratch; Array frame_events = GetEventsForFrame(scratch); + if (playback_buffer) { + frame_events = ParseEvents(Perm, playback_buffer); + playback_buffer = NULL; + } For(frame_events) { if (it.kind == EVENT_QUIT) goto end_of_editor_loop; - Serialize(&ser, &it); + if (it.kind != EVENT_UPDATE && it.kind != EVENT_MOUSE_MOVE) Serialize(&ser, &it); Update(it); } diff --git a/src/text_editor/title_bar.cpp b/src/text_editor/title_bar.cpp index 28be423..e212532 100644 --- a/src/text_editor/title_bar.cpp +++ b/src/text_editor/title_bar.cpp @@ -26,6 +26,8 @@ void ReplaceTitleBarData(Window *window) { BSet title = GetBSet(window); title.view->scroll.y = 0; + if (window->id == ActiveWindow) return; + BSet main = GetMainSet(window); Scratch scratch; Caret caret = main.view->carets[0];