Serialize and playback events

This commit is contained in:
Krzosa Karol
2024-08-14 09:55:54 +02:00
parent cac092a344
commit a0315f161c
5 changed files with 121 additions and 92 deletions

View File

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

View File

@@ -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<Event> ParseEvents(Allocator allocator, Buffer *buffer) {
Array<Event> events = {allocator};
Serializer s = {NULL, GetString(buffer), false};
for (; s.string.len;) {
Event event = {};
Serialize(&s, &event);
Add(&events, event);
}
return events;
}

View File

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

View File

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

View File

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