Serialize and playback events
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
80
src/text_editor/serializer.cpp
Normal file
80
src/text_editor/serializer.cpp
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user