Fixing tests, Fixed buffer dealloc bug, fixed clipboard bug
This commit is contained in:
@@ -21,10 +21,12 @@ Things I like:
|
||||
- Lua config files work pretty well
|
||||
|
||||
Splits:
|
||||
- Buffer16.cpp / h vs Buffer ?
|
||||
- Buffer16 Buffer8?
|
||||
- Why constraint that name of buffer needs to be unique? For Open() and default behavior but is this required?
|
||||
- Try to add Tracking Allocator and rewrite the app, free all memory at the end of the app and check all is well
|
||||
|
||||
|
||||
- SpawnProcess wrong memory allocation there
|
||||
- Trying to fix the testing, Command_Open doesn't work on first frame because window is not metricly OK?
|
||||
- window->document_rect is null
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@ API void *BlockArenaAllocatorProc(void *object, int kind, void *p, size_t size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void TestArena() {
|
||||
void RunArenaTest() {
|
||||
Allocator memory_tracking_allocator = GetTrackingAllocator();
|
||||
{
|
||||
BlockArena arena = {};
|
||||
|
||||
@@ -185,7 +185,7 @@ API String16 TrimEnd(String16 string) {
|
||||
|
||||
API String16 Copy16(Allocator allocator, String16 string) {
|
||||
char16_t *copy = (char16_t *)AllocSize(allocator, sizeof(char16_t) * (string.len + 1));
|
||||
memcpy(copy, string.data, string.len);
|
||||
memcpy(copy, string.data, string.len * sizeof(char16_t));
|
||||
copy[string.len] = 0;
|
||||
String16 result = {copy, string.len};
|
||||
return result;
|
||||
@@ -332,10 +332,10 @@ API String16 Merge(Allocator allocator, Array<String16> list, String16 separator
|
||||
String16 string = {buff, 0};
|
||||
For(list) {
|
||||
Assert(string.len + it.len <= size);
|
||||
memcpy(string.data + string.len, it.data, it.len);
|
||||
memcpy(string.data + string.len, it.data, it.len * sizeof(char16_t));
|
||||
string.len += it.len;
|
||||
if (!IsLast(list, it)) {
|
||||
memcpy(string.data + string.len, separator.data, separator.len);
|
||||
memcpy(string.data + string.len, separator.data, separator.len * sizeof(char16_t));
|
||||
string.len += separator.len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
String TestDir;
|
||||
BlockArena TestArena;
|
||||
|
||||
void AddCtrlPress(SDL_Keycode key) {
|
||||
Event event = {};
|
||||
@@ -19,88 +20,130 @@ void AddText(String string) {
|
||||
}
|
||||
|
||||
void Wait(mco_coro *co) {
|
||||
Add(&EventPlayback, {111});
|
||||
for (Event *event = CoYield(co); event->kind != 111; event = CoYield(co)) {
|
||||
Add(&EventPlayback, {EVENT_KIND_INVALID});
|
||||
for (Event *event = CoYield(co); event->kind != EVENT_KIND_INVALID; event = CoYield(co)) {
|
||||
}
|
||||
}
|
||||
|
||||
void PlayTestOpen(mco_coro *co) {
|
||||
// Open file, move a little, then open again and verify the caret didn't move
|
||||
String basic_env_cpp = Format(SysAllocator, "%S/basic_env/basic_env.cpp", TestDir);
|
||||
// String basic_env_cpp = Format(SysAllocator, "%S/test_env", TestDir);
|
||||
|
||||
AddCtrlPress(SDLK_P);
|
||||
Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
|
||||
AddCtrlPress(SDLK_Q);
|
||||
Wait(co);
|
||||
// AddCtrlPress(SDLK_P);
|
||||
// Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
|
||||
// AddCtrlPress(SDLK_Q);
|
||||
|
||||
{
|
||||
BSet main = GetActiveMainSet();
|
||||
Assert(main.buffer->name == basic_env_cpp);
|
||||
Assert(main.view->carets[0].range.min == 0);
|
||||
Assert(main.view->carets[0].range.max == 0);
|
||||
Int line = PosToLine(main.buffer, main.view->carets[0].range.min);
|
||||
Assert(line == 0);
|
||||
}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PERIOD; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PERIOD; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_R; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "r"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_C; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "c"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_E; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "e"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_E; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "e"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
|
||||
|
||||
AddCtrlPress(SDLK_DOWN);
|
||||
AddCtrlPress(SDLK_DOWN);
|
||||
AddCtrlPress(SDLK_DOWN);
|
||||
Wait(co);
|
||||
// Wait(co);
|
||||
|
||||
Range range = {};
|
||||
{
|
||||
BSet main = GetActiveMainSet();
|
||||
Assert(main.view->carets[0].range.min > 0);
|
||||
Assert(main.view->carets[0].range.max > 0);
|
||||
range = main.view->carets[0].range;
|
||||
}
|
||||
// {
|
||||
// BSet main = GetActiveMainSet();
|
||||
// Assert(main.buffer->name == basic_env_cpp);
|
||||
// Assert(main.view->carets[0].range.min == 0);
|
||||
// Assert(main.view->carets[0].range.max == 0);
|
||||
// Int line = PosToLine(main.buffer, main.view->carets[0].range.min);
|
||||
// Assert(line == 0);
|
||||
// }
|
||||
|
||||
AddCtrlPress(SDLK_P);
|
||||
Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
|
||||
AddCtrlPress(SDLK_Q);
|
||||
Wait(co);
|
||||
// AddCtrlPress(SDLK_DOWN);
|
||||
// AddCtrlPress(SDLK_DOWN);
|
||||
// AddCtrlPress(SDLK_DOWN);
|
||||
// Wait(co);
|
||||
|
||||
Int buffer_len = 0;
|
||||
{
|
||||
BSet main = GetActiveMainSet();
|
||||
Assert(main.buffer->name == basic_env_cpp);
|
||||
Assert(main.view->carets[0].range.min == range.min);
|
||||
Assert(main.view->carets[0].range.max == range.max);
|
||||
buffer_len = main.buffer->len;
|
||||
}
|
||||
// Range range = {};
|
||||
// {
|
||||
// BSet main = GetActiveMainSet();
|
||||
// Assert(main.view->carets[0].range.min > 0);
|
||||
// Assert(main.view->carets[0].range.max > 0);
|
||||
// range = main.view->carets[0].range;
|
||||
// }
|
||||
|
||||
AddText(Format(SysAllocator, "%S:20", basic_env_cpp));
|
||||
AddCtrlPress(SDLK_Q);
|
||||
Wait(co);
|
||||
// AddCtrlPress(SDLK_P);
|
||||
// Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
|
||||
// AddCtrlPress(SDLK_Q);
|
||||
// Wait(co);
|
||||
|
||||
{
|
||||
BSet main = GetActiveMainSet();
|
||||
Int pos = main.view->carets[0].range.min;
|
||||
Int line = PosToLine(main.buffer, pos);
|
||||
Assert(line == 19);
|
||||
Assert(main.buffer->name == basic_env_cpp);
|
||||
Assert(main.buffer->len != buffer_len);
|
||||
Assert(main.buffer->dirty);
|
||||
}
|
||||
// Int buffer_len = 0;
|
||||
// {
|
||||
// BSet main = GetActiveMainSet();
|
||||
// Assert(main.buffer->name == basic_env_cpp);
|
||||
// Assert(main.view->carets[0].range.min == range.min);
|
||||
// Assert(main.view->carets[0].range.max == range.max);
|
||||
// buffer_len = main.buffer->len;
|
||||
// }
|
||||
|
||||
AddCtrlPress(SDLK_Z);
|
||||
AddCtrlPress(SDLK_PAGEUP);
|
||||
Wait(co);
|
||||
// AddText(Format(SysAllocator, "%S:20", basic_env_cpp));
|
||||
// AddCtrlPress(SDLK_Q);
|
||||
// Wait(co);
|
||||
|
||||
{
|
||||
BSet main = GetActiveMainSet();
|
||||
Assert(main.buffer->len == buffer_len);
|
||||
Assert(main.view->carets[0].range.min == 0);
|
||||
Assert(main.view->carets[0].range.max == 0);
|
||||
}
|
||||
// {
|
||||
// BSet main = GetActiveMainSet();
|
||||
// Int pos = main.view->carets[0].range.min;
|
||||
// Int line = PosToLine(main.buffer, pos);
|
||||
// Assert(line == 19);
|
||||
// Assert(main.buffer->name == basic_env_cpp);
|
||||
// Assert(main.buffer->len != buffer_len);
|
||||
// Assert(main.buffer->dirty);
|
||||
// }
|
||||
|
||||
// AddCtrlPress(SDLK_Z);
|
||||
// AddCtrlPress(SDLK_PAGEUP);
|
||||
// Wait(co);
|
||||
|
||||
// {
|
||||
// BSet main = GetActiveMainSet();
|
||||
// Assert(main.buffer->len == buffer_len);
|
||||
// Assert(main.view->carets[0].range.min == 0);
|
||||
// Assert(main.view->carets[0].range.max == 0);
|
||||
// }
|
||||
ReportConsolef("%s DONE", __FUNCTION__);
|
||||
|
||||
}
|
||||
|
||||
void Test(mco_coro *co) {
|
||||
WorkDir = Format(SysAllocator, "%S/basic_env", TestDir);
|
||||
Wait(co); // First phase starts immediately but stuff is not initialized so Command_Open acts weird
|
||||
Command_Open(TestDir);
|
||||
PlayTestOpen(co);
|
||||
|
||||
Release(&TestArena);
|
||||
|
||||
|
||||
// Add(&EventPlayback, {EVENT_QUIT});
|
||||
@@ -108,11 +151,6 @@ void Test(mco_coro *co) {
|
||||
|
||||
void InitTests() {
|
||||
StyleWaitForEvents = false;
|
||||
{
|
||||
String file = __FILE__;
|
||||
file = NormalizePath(SysAllocator, file);
|
||||
file = ChopLastSlash(file);
|
||||
TestDir = file;
|
||||
}
|
||||
TestDir = Format(TestArena, "%S/test_env", GetExeDir(TestArena));
|
||||
CoAdd(Test);
|
||||
}
|
||||
|
||||
@@ -1179,6 +1179,22 @@ API void DeinitBuffer(Buffer *buffer) {
|
||||
DeallocHistoryArray(&buffer->redo_stack);
|
||||
}
|
||||
|
||||
// Indexing starts from 0 not 1 because this routine creates also the zero buffer
|
||||
// which is the buffer that often is defaulted to in case of errors
|
||||
Int BufferIDs;
|
||||
API Buffer *AllocBuffer(Allocator allocator, String name = "", Int size = 4096) {
|
||||
Buffer *buffer = AllocType(allocator, Buffer);
|
||||
buffer->id = {BufferIDs++, buffer};
|
||||
buffer->name = Intern(&GlobalInternTable, name);
|
||||
InitBuffer(allocator, buffer, buffer->id, buffer->name, size);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
API void DeallocBuffer(Buffer *buffer) {
|
||||
DeinitBuffer(buffer);
|
||||
Dealloc(buffer->line_starts.allocator, buffer);
|
||||
}
|
||||
|
||||
API Buffer *CreateTempBuffer(Allocator allocator, Int size = 4096) {
|
||||
Buffer *result = AllocType(allocator, Buffer);
|
||||
result->no_history = true;
|
||||
@@ -1187,7 +1203,7 @@ API Buffer *CreateTempBuffer(Allocator allocator, Int size = 4096) {
|
||||
return result;
|
||||
}
|
||||
|
||||
void TestBuffer() {
|
||||
void RunBufferTest() {
|
||||
{
|
||||
Scratch scratch;
|
||||
Buffer buffer = {};
|
||||
|
||||
@@ -222,7 +222,6 @@ void ReportWarningf(const char *fmt, ...) {
|
||||
STRING_FORMAT(scratch, fmt, string);
|
||||
View *null_view = GetView(NullViewID);
|
||||
Command_Appendf(null_view, "%S\n", string);
|
||||
ActiveWindow = NullWindowID;
|
||||
}
|
||||
|
||||
void ReportDebugf(const char *fmt, ...) {
|
||||
|
||||
@@ -19,27 +19,23 @@ EM_ASYNC_JS(const char *, GetClipboardText, (), {
|
||||
#define _SetClipboardText SDL_SetClipboardText
|
||||
#endif
|
||||
|
||||
void SetClipboardText(String16 string16) {
|
||||
String string = ToString(SysAllocator, string16);
|
||||
defer { Dealloc(SysAllocator, string.data); };
|
||||
_SetClipboardText(string.data);
|
||||
}
|
||||
|
||||
void FreeClipboardGlobals() {
|
||||
For(SavedClipboardCarets) Dealloc(SysAllocator, it.data);
|
||||
SavedClipboardCarets.len = 0;
|
||||
Dealloc(SysAllocator, SavedClipboardString.data);
|
||||
Release(&ClipboardArena);
|
||||
SavedClipboardString = {};
|
||||
SavedClipboardCarets = {};
|
||||
SavedClipboardCarets.allocator = ClipboardArena;
|
||||
}
|
||||
|
||||
void SaveStringInClipboard(String16 string) {
|
||||
Scratch scratch;
|
||||
FreeClipboardGlobals();
|
||||
SavedClipboardString = Copy16(SysAllocator, string);
|
||||
SetClipboardText(string);
|
||||
SavedClipboardString = Copy16(ClipboardArena, string);
|
||||
_SetClipboardText(ToString(scratch, SavedClipboardString).data);
|
||||
}
|
||||
|
||||
void Command_Copy(View *view) {
|
||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||
Scratch scratch;
|
||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||
|
||||
// First, if there is no selection - select the entire line
|
||||
For(view->carets) {
|
||||
@@ -51,16 +47,16 @@ void Command_Copy(View *view) {
|
||||
}
|
||||
|
||||
FreeClipboardGlobals();
|
||||
|
||||
Reserve(&SavedClipboardCarets, view->carets.len);
|
||||
For(view->carets) {
|
||||
String16 string = GetString(buffer, it.range);
|
||||
String16 copy = Copy16(SysAllocator, string);
|
||||
String16 copy = Copy16(ClipboardArena, string);
|
||||
Add(&SavedClipboardCarets, copy);
|
||||
}
|
||||
|
||||
// @todo: maybe only add new line if there is no new line at the end, experiment with it
|
||||
SavedClipboardString = Merge(SysAllocator, SavedClipboardCarets, u"\n");
|
||||
SetClipboardText(SavedClipboardString);
|
||||
SavedClipboardString = Merge(ClipboardArena, SavedClipboardCarets, u"\n");
|
||||
_SetClipboardText(ToString(scratch, SavedClipboardString).data);
|
||||
}
|
||||
|
||||
void Command_Paste(View *view) {
|
||||
@@ -69,8 +65,7 @@ void Command_Paste(View *view) {
|
||||
const char *text = GetClipboardText();
|
||||
defer { FreeClipboardText((void *)text); };
|
||||
|
||||
String16 string = ToUnixString16(SysAllocator, text);
|
||||
defer { Dealloc(SysAllocator, string.data); };
|
||||
String16 string = ToUnixString16(scratch, text);
|
||||
|
||||
// Regular paste
|
||||
if (string != SavedClipboardString || SavedClipboardCarets.len != view->carets.len) {
|
||||
|
||||
@@ -1,29 +1,38 @@
|
||||
using EventKind = uint32_t;
|
||||
enum {
|
||||
EVENT_NONE,
|
||||
EVENT_UPDATE,
|
||||
EVENT_QUIT,
|
||||
#define EVENT_KINDS \
|
||||
X(EVENT_NONE) \
|
||||
X(EVENT_UPDATE) \
|
||||
X(EVENT_QUIT) \
|
||||
X(EVENT_MOUSE_LEFT) \
|
||||
X(EVENT_MOUSE_RIGHT) \
|
||||
X(EVENT_MOUSE_MIDDLE) \
|
||||
X(EVENT_MOUSE_X1) \
|
||||
X(EVENT_MOUSE_X2) \
|
||||
X(EVENT_MOUSE_LEFT_UP) \
|
||||
X(EVENT_MOUSE_RIGHT_UP) \
|
||||
X(EVENT_MOUSE_MIDDLE_UP) \
|
||||
X(EVENT_MOUSE_X1_UP) \
|
||||
X(EVENT_MOUSE_X2_UP) \
|
||||
X(EVENT_MOUSE_WHEEL) \
|
||||
X(EVENT_KEY_PRESS) \
|
||||
X(EVENT_TEXT_INPUT) \
|
||||
X(EVENT_DROP_FILE)
|
||||
|
||||
EVENT_MOUSE_LEFT,
|
||||
EVENT_MOUSE_RIGHT,
|
||||
EVENT_MOUSE_MIDDLE,
|
||||
EVENT_MOUSE_X1,
|
||||
EVENT_MOUSE_X2,
|
||||
EVENT_MOUSE_LEFT_UP,
|
||||
EVENT_MOUSE_RIGHT_UP,
|
||||
EVENT_MOUSE_MIDDLE_UP,
|
||||
EVENT_MOUSE_X1_UP,
|
||||
EVENT_MOUSE_X2_UP,
|
||||
EVENT_MOUSE_WHEEL,
|
||||
enum EventKind {
|
||||
#define X(TYPE) TYPE,
|
||||
EVENT_KINDS
|
||||
#undef X
|
||||
EVENT_KIND_COUNT,
|
||||
EVENT_KIND_INVALID = 111,
|
||||
};
|
||||
|
||||
EVENT_KEY_PRESS,
|
||||
EVENT_TEXT_INPUT,
|
||||
|
||||
EVENT_DROP_FILE,
|
||||
const char *EventKindStrings[] = {
|
||||
#define X(TYPE) #TYPE,
|
||||
EVENT_KINDS
|
||||
#undef X
|
||||
};
|
||||
|
||||
#define EVENT_FIELDS \
|
||||
X(EventKind, Int, kind) \
|
||||
X(EventKind, Int, kind) \
|
||||
X(SDL_Keycode, Int, key) \
|
||||
X(int16_t, Int, xwindow) \
|
||||
X(int16_t, Int, ywindow) \
|
||||
@@ -46,6 +55,328 @@ struct Event {
|
||||
};
|
||||
Array<Event> EventPlayback;
|
||||
|
||||
const char *SDLKeycodeToName(SDL_Keycode keycode) {
|
||||
switch(keycode) {
|
||||
case SDLK_UNKNOWN: return "SDLK_UNKNOWN"; break;
|
||||
case SDLK_RETURN: return "SDLK_RETURN"; break;
|
||||
case SDLK_ESCAPE: return "SDLK_ESCAPE"; break;
|
||||
case SDLK_BACKSPACE: return "SDLK_BACKSPACE"; break;
|
||||
case SDLK_TAB: return "SDLK_TAB"; break;
|
||||
case SDLK_SPACE: return "SDLK_SPACE"; break;
|
||||
case SDLK_EXCLAIM: return "SDLK_EXCLAIM"; break;
|
||||
case SDLK_DBLAPOSTROPHE: return "SDLK_DBLAPOSTROPHE"; break;
|
||||
case SDLK_HASH: return "SDLK_HASH"; break;
|
||||
case SDLK_DOLLAR: return "SDLK_DOLLAR"; break;
|
||||
case SDLK_PERCENT: return "SDLK_PERCENT"; break;
|
||||
case SDLK_AMPERSAND: return "SDLK_AMPERSAND"; break;
|
||||
case SDLK_APOSTROPHE: return "SDLK_APOSTROPHE"; break;
|
||||
case SDLK_LEFTPAREN: return "SDLK_LEFTPAREN"; break;
|
||||
case SDLK_RIGHTPAREN: return "SDLK_RIGHTPAREN"; break;
|
||||
case SDLK_ASTERISK: return "SDLK_ASTERISK"; break;
|
||||
case SDLK_PLUS: return "SDLK_PLUS"; break;
|
||||
case SDLK_COMMA: return "SDLK_COMMA"; break;
|
||||
case SDLK_MINUS: return "SDLK_MINUS"; break;
|
||||
case SDLK_PERIOD: return "SDLK_PERIOD"; break;
|
||||
case SDLK_SLASH: return "SDLK_SLASH"; break;
|
||||
case SDLK_0: return "SDLK_0"; break;
|
||||
case SDLK_1: return "SDLK_1"; break;
|
||||
case SDLK_2: return "SDLK_2"; break;
|
||||
case SDLK_3: return "SDLK_3"; break;
|
||||
case SDLK_4: return "SDLK_4"; break;
|
||||
case SDLK_5: return "SDLK_5"; break;
|
||||
case SDLK_6: return "SDLK_6"; break;
|
||||
case SDLK_7: return "SDLK_7"; break;
|
||||
case SDLK_8: return "SDLK_8"; break;
|
||||
case SDLK_9: return "SDLK_9"; break;
|
||||
case SDLK_COLON: return "SDLK_COLON"; break;
|
||||
case SDLK_SEMICOLON: return "SDLK_SEMICOLON"; break;
|
||||
case SDLK_LESS: return "SDLK_LESS"; break;
|
||||
case SDLK_EQUALS: return "SDLK_EQUALS"; break;
|
||||
case SDLK_GREATER: return "SDLK_GREATER"; break;
|
||||
case SDLK_QUESTION: return "SDLK_QUESTION"; break;
|
||||
case SDLK_AT: return "SDLK_AT"; break;
|
||||
case SDLK_LEFTBRACKET: return "SDLK_LEFTBRACKET"; break;
|
||||
case SDLK_BACKSLASH: return "SDLK_BACKSLASH"; break;
|
||||
case SDLK_RIGHTBRACKET: return "SDLK_RIGHTBRACKET"; break;
|
||||
case SDLK_CARET: return "SDLK_CARET"; break;
|
||||
case SDLK_UNDERSCORE: return "SDLK_UNDERSCORE"; break;
|
||||
case SDLK_GRAVE: return "SDLK_GRAVE"; break;
|
||||
case SDLK_A: return "SDLK_A"; break;
|
||||
case SDLK_B: return "SDLK_B"; break;
|
||||
case SDLK_C: return "SDLK_C"; break;
|
||||
case SDLK_D: return "SDLK_D"; break;
|
||||
case SDLK_E: return "SDLK_E"; break;
|
||||
case SDLK_F: return "SDLK_F"; break;
|
||||
case SDLK_G: return "SDLK_G"; break;
|
||||
case SDLK_H: return "SDLK_H"; break;
|
||||
case SDLK_I: return "SDLK_I"; break;
|
||||
case SDLK_J: return "SDLK_J"; break;
|
||||
case SDLK_K: return "SDLK_K"; break;
|
||||
case SDLK_L: return "SDLK_L"; break;
|
||||
case SDLK_M: return "SDLK_M"; break;
|
||||
case SDLK_N: return "SDLK_N"; break;
|
||||
case SDLK_O: return "SDLK_O"; break;
|
||||
case SDLK_P: return "SDLK_P"; break;
|
||||
case SDLK_Q: return "SDLK_Q"; break;
|
||||
case SDLK_R: return "SDLK_R"; break;
|
||||
case SDLK_S: return "SDLK_S"; break;
|
||||
case SDLK_T: return "SDLK_T"; break;
|
||||
case SDLK_U: return "SDLK_U"; break;
|
||||
case SDLK_V: return "SDLK_V"; break;
|
||||
case SDLK_W: return "SDLK_W"; break;
|
||||
case SDLK_X: return "SDLK_X"; break;
|
||||
case SDLK_Y: return "SDLK_Y"; break;
|
||||
case SDLK_Z: return "SDLK_Z"; break;
|
||||
case SDLK_LEFTBRACE: return "SDLK_LEFTBRACE"; break;
|
||||
case SDLK_PIPE: return "SDLK_PIPE"; break;
|
||||
case SDLK_RIGHTBRACE: return "SDLK_RIGHTBRACE"; break;
|
||||
case SDLK_TILDE: return "SDLK_TILDE"; break;
|
||||
case SDLK_DELETE: return "SDLK_DELETE"; break;
|
||||
case SDLK_PLUSMINUS: return "SDLK_PLUSMINUS"; break;
|
||||
case SDLK_CAPSLOCK: return "SDLK_CAPSLOCK"; break;
|
||||
case SDLK_F1: return "SDLK_F1"; break;
|
||||
case SDLK_F2: return "SDLK_F2"; break;
|
||||
case SDLK_F3: return "SDLK_F3"; break;
|
||||
case SDLK_F4: return "SDLK_F4"; break;
|
||||
case SDLK_F5: return "SDLK_F5"; break;
|
||||
case SDLK_F6: return "SDLK_F6"; break;
|
||||
case SDLK_F7: return "SDLK_F7"; break;
|
||||
case SDLK_F8: return "SDLK_F8"; break;
|
||||
case SDLK_F9: return "SDLK_F9"; break;
|
||||
case SDLK_F10: return "SDLK_F10"; break;
|
||||
case SDLK_F11: return "SDLK_F11"; break;
|
||||
case SDLK_F12: return "SDLK_F12"; break;
|
||||
case SDLK_PRINTSCREEN: return "SDLK_PRINTSCREEN"; break;
|
||||
case SDLK_SCROLLLOCK: return "SDLK_SCROLLLOCK"; break;
|
||||
case SDLK_PAUSE: return "SDLK_PAUSE"; break;
|
||||
case SDLK_INSERT: return "SDLK_INSERT"; break;
|
||||
case SDLK_HOME: return "SDLK_HOME"; break;
|
||||
case SDLK_PAGEUP: return "SDLK_PAGEUP"; break;
|
||||
case SDLK_END: return "SDLK_END"; break;
|
||||
case SDLK_PAGEDOWN: return "SDLK_PAGEDOWN"; break;
|
||||
case SDLK_RIGHT: return "SDLK_RIGHT"; break;
|
||||
case SDLK_LEFT: return "SDLK_LEFT"; break;
|
||||
case SDLK_DOWN: return "SDLK_DOWN"; break;
|
||||
case SDLK_UP: return "SDLK_UP"; break;
|
||||
case SDLK_NUMLOCKCLEAR: return "SDLK_NUMLOCKCLEAR"; break;
|
||||
case SDLK_KP_DIVIDE: return "SDLK_KP_DIVIDE"; break;
|
||||
case SDLK_KP_MULTIPLY: return "SDLK_KP_MULTIPLY"; break;
|
||||
case SDLK_KP_MINUS: return "SDLK_KP_MINUS"; break;
|
||||
case SDLK_KP_PLUS: return "SDLK_KP_PLUS"; break;
|
||||
case SDLK_KP_ENTER: return "SDLK_KP_ENTER"; break;
|
||||
case SDLK_KP_1: return "SDLK_KP_1"; break;
|
||||
case SDLK_KP_2: return "SDLK_KP_2"; break;
|
||||
case SDLK_KP_3: return "SDLK_KP_3"; break;
|
||||
case SDLK_KP_4: return "SDLK_KP_4"; break;
|
||||
case SDLK_KP_5: return "SDLK_KP_5"; break;
|
||||
case SDLK_KP_6: return "SDLK_KP_6"; break;
|
||||
case SDLK_KP_7: return "SDLK_KP_7"; break;
|
||||
case SDLK_KP_8: return "SDLK_KP_8"; break;
|
||||
case SDLK_KP_9: return "SDLK_KP_9"; break;
|
||||
case SDLK_KP_0: return "SDLK_KP_0"; break;
|
||||
case SDLK_KP_PERIOD: return "SDLK_KP_PERIOD"; break;
|
||||
case SDLK_APPLICATION: return "SDLK_APPLICATION"; break;
|
||||
case SDLK_POWER: return "SDLK_POWER"; break;
|
||||
case SDLK_KP_EQUALS: return "SDLK_KP_EQUALS"; break;
|
||||
case SDLK_F13: return "SDLK_F13"; break;
|
||||
case SDLK_F14: return "SDLK_F14"; break;
|
||||
case SDLK_F15: return "SDLK_F15"; break;
|
||||
case SDLK_F16: return "SDLK_F16"; break;
|
||||
case SDLK_F17: return "SDLK_F17"; break;
|
||||
case SDLK_F18: return "SDLK_F18"; break;
|
||||
case SDLK_F19: return "SDLK_F19"; break;
|
||||
case SDLK_F20: return "SDLK_F20"; break;
|
||||
case SDLK_F21: return "SDLK_F21"; break;
|
||||
case SDLK_F22: return "SDLK_F22"; break;
|
||||
case SDLK_F23: return "SDLK_F23"; break;
|
||||
case SDLK_F24: return "SDLK_F24"; break;
|
||||
case SDLK_EXECUTE: return "SDLK_EXECUTE"; break;
|
||||
case SDLK_HELP: return "SDLK_HELP"; break;
|
||||
case SDLK_MENU: return "SDLK_MENU"; break;
|
||||
case SDLK_SELECT: return "SDLK_SELECT"; break;
|
||||
case SDLK_STOP: return "SDLK_STOP"; break;
|
||||
case SDLK_AGAIN: return "SDLK_AGAIN"; break;
|
||||
case SDLK_UNDO: return "SDLK_UNDO"; break;
|
||||
case SDLK_CUT: return "SDLK_CUT"; break;
|
||||
case SDLK_COPY: return "SDLK_COPY"; break;
|
||||
case SDLK_PASTE: return "SDLK_PASTE"; break;
|
||||
case SDLK_FIND: return "SDLK_FIND"; break;
|
||||
case SDLK_MUTE: return "SDLK_MUTE"; break;
|
||||
case SDLK_VOLUMEUP: return "SDLK_VOLUMEUP"; break;
|
||||
case SDLK_VOLUMEDOWN: return "SDLK_VOLUMEDOWN"; break;
|
||||
case SDLK_KP_COMMA: return "SDLK_KP_COMMA"; break;
|
||||
case SDLK_KP_EQUALSAS400: return "SDLK_KP_EQUALSAS400"; break;
|
||||
case SDLK_ALTERASE: return "SDLK_ALTERASE"; break;
|
||||
case SDLK_SYSREQ: return "SDLK_SYSREQ"; break;
|
||||
case SDLK_CANCEL: return "SDLK_CANCEL"; break;
|
||||
case SDLK_CLEAR: return "SDLK_CLEAR"; break;
|
||||
case SDLK_PRIOR: return "SDLK_PRIOR"; break;
|
||||
case SDLK_RETURN2: return "SDLK_RETURN2"; break;
|
||||
case SDLK_SEPARATOR: return "SDLK_SEPARATOR"; break;
|
||||
case SDLK_OUT: return "SDLK_OUT"; break;
|
||||
case SDLK_OPER: return "SDLK_OPER"; break;
|
||||
case SDLK_CLEARAGAIN: return "SDLK_CLEARAGAIN"; break;
|
||||
case SDLK_CRSEL: return "SDLK_CRSEL"; break;
|
||||
case SDLK_EXSEL: return "SDLK_EXSEL"; break;
|
||||
case SDLK_KP_00: return "SDLK_KP_00"; break;
|
||||
case SDLK_KP_000: return "SDLK_KP_000"; break;
|
||||
case SDLK_THOUSANDSSEPARATOR: return "SDLK_THOUSANDSSEPARATOR"; break;
|
||||
case SDLK_DECIMALSEPARATOR: return "SDLK_DECIMALSEPARATOR"; break;
|
||||
case SDLK_CURRENCYUNIT: return "SDLK_CURRENCYUNIT"; break;
|
||||
case SDLK_CURRENCYSUBUNIT: return "SDLK_CURRENCYSUBUNIT"; break;
|
||||
case SDLK_KP_LEFTPAREN: return "SDLK_KP_LEFTPAREN"; break;
|
||||
case SDLK_KP_RIGHTPAREN: return "SDLK_KP_RIGHTPAREN"; break;
|
||||
case SDLK_KP_LEFTBRACE: return "SDLK_KP_LEFTBRACE"; break;
|
||||
case SDLK_KP_RIGHTBRACE: return "SDLK_KP_RIGHTBRACE"; break;
|
||||
case SDLK_KP_TAB: return "SDLK_KP_TAB"; break;
|
||||
case SDLK_KP_BACKSPACE: return "SDLK_KP_BACKSPACE"; break;
|
||||
case SDLK_KP_A: return "SDLK_KP_A"; break;
|
||||
case SDLK_KP_B: return "SDLK_KP_B"; break;
|
||||
case SDLK_KP_C: return "SDLK_KP_C"; break;
|
||||
case SDLK_KP_D: return "SDLK_KP_D"; break;
|
||||
case SDLK_KP_E: return "SDLK_KP_E"; break;
|
||||
case SDLK_KP_F: return "SDLK_KP_F"; break;
|
||||
case SDLK_KP_XOR: return "SDLK_KP_XOR"; break;
|
||||
case SDLK_KP_POWER: return "SDLK_KP_POWER"; break;
|
||||
case SDLK_KP_PERCENT: return "SDLK_KP_PERCENT"; break;
|
||||
case SDLK_KP_LESS: return "SDLK_KP_LESS"; break;
|
||||
case SDLK_KP_GREATER: return "SDLK_KP_GREATER"; break;
|
||||
case SDLK_KP_AMPERSAND: return "SDLK_KP_AMPERSAND"; break;
|
||||
case SDLK_KP_DBLAMPERSAND: return "SDLK_KP_DBLAMPERSAND"; break;
|
||||
case SDLK_KP_VERTICALBAR: return "SDLK_KP_VERTICALBAR"; break;
|
||||
case SDLK_KP_DBLVERTICALBAR: return "SDLK_KP_DBLVERTICALBAR"; break;
|
||||
case SDLK_KP_COLON: return "SDLK_KP_COLON"; break;
|
||||
case SDLK_KP_HASH: return "SDLK_KP_HASH"; break;
|
||||
case SDLK_KP_SPACE: return "SDLK_KP_SPACE"; break;
|
||||
case SDLK_KP_AT: return "SDLK_KP_AT"; break;
|
||||
case SDLK_KP_EXCLAM: return "SDLK_KP_EXCLAM"; break;
|
||||
case SDLK_KP_MEMSTORE: return "SDLK_KP_MEMSTORE"; break;
|
||||
case SDLK_KP_MEMRECALL: return "SDLK_KP_MEMRECALL"; break;
|
||||
case SDLK_KP_MEMCLEAR: return "SDLK_KP_MEMCLEAR"; break;
|
||||
case SDLK_KP_MEMADD: return "SDLK_KP_MEMADD"; break;
|
||||
case SDLK_KP_MEMSUBTRACT: return "SDLK_KP_MEMSUBTRACT"; break;
|
||||
case SDLK_KP_MEMMULTIPLY: return "SDLK_KP_MEMMULTIPLY"; break;
|
||||
case SDLK_KP_MEMDIVIDE: return "SDLK_KP_MEMDIVIDE"; break;
|
||||
case SDLK_KP_PLUSMINUS: return "SDLK_KP_PLUSMINUS"; break;
|
||||
case SDLK_KP_CLEAR: return "SDLK_KP_CLEAR"; break;
|
||||
case SDLK_KP_CLEARENTRY: return "SDLK_KP_CLEARENTRY"; break;
|
||||
case SDLK_KP_BINARY: return "SDLK_KP_BINARY"; break;
|
||||
case SDLK_KP_OCTAL: return "SDLK_KP_OCTAL"; break;
|
||||
case SDLK_KP_DECIMAL: return "SDLK_KP_DECIMAL"; break;
|
||||
case SDLK_KP_HEXADECIMAL: return "SDLK_KP_HEXADECIMAL"; break;
|
||||
case SDLK_LCTRL: return "SDLK_LCTRL"; break;
|
||||
case SDLK_LSHIFT: return "SDLK_LSHIFT"; break;
|
||||
case SDLK_LALT: return "SDLK_LALT"; break;
|
||||
case SDLK_LGUI: return "SDLK_LGUI"; break;
|
||||
case SDLK_RCTRL: return "SDLK_RCTRL"; break;
|
||||
case SDLK_RSHIFT: return "SDLK_RSHIFT"; break;
|
||||
case SDLK_RALT: return "SDLK_RALT"; break;
|
||||
case SDLK_RGUI: return "SDLK_RGUI"; break;
|
||||
case SDLK_MODE: return "SDLK_MODE"; break;
|
||||
case SDLK_SLEEP: return "SDLK_SLEEP"; break;
|
||||
case SDLK_WAKE: return "SDLK_WAKE"; break;
|
||||
case SDLK_CHANNEL_INCREMENT: return "SDLK_CHANNEL_INCREMENT"; break;
|
||||
case SDLK_CHANNEL_DECREMENT: return "SDLK_CHANNEL_DECREMENT"; break;
|
||||
case SDLK_MEDIA_PLAY: return "SDLK_MEDIA_PLAY"; break;
|
||||
case SDLK_MEDIA_PAUSE: return "SDLK_MEDIA_PAUSE"; break;
|
||||
case SDLK_MEDIA_RECORD: return "SDLK_MEDIA_RECORD"; break;
|
||||
case SDLK_MEDIA_FAST_FORWARD: return "SDLK_MEDIA_FAST_FORWARD"; break;
|
||||
case SDLK_MEDIA_REWIND: return "SDLK_MEDIA_REWIND"; break;
|
||||
case SDLK_MEDIA_NEXT_TRACK: return "SDLK_MEDIA_NEXT_TRACK"; break;
|
||||
case SDLK_MEDIA_PREVIOUS_TRACK: return "SDLK_MEDIA_PREVIOUS_TRACK"; break;
|
||||
case SDLK_MEDIA_STOP: return "SDLK_MEDIA_STOP"; break;
|
||||
case SDLK_MEDIA_EJECT: return "SDLK_MEDIA_EJECT"; break;
|
||||
case SDLK_MEDIA_PLAY_PAUSE: return "SDLK_MEDIA_PLAY_PAUSE"; break;
|
||||
case SDLK_MEDIA_SELECT: return "SDLK_MEDIA_SELECT"; break;
|
||||
case SDLK_AC_NEW: return "SDLK_AC_NEW"; break;
|
||||
case SDLK_AC_OPEN: return "SDLK_AC_OPEN"; break;
|
||||
case SDLK_AC_CLOSE: return "SDLK_AC_CLOSE"; break;
|
||||
case SDLK_AC_EXIT: return "SDLK_AC_EXIT"; break;
|
||||
case SDLK_AC_SAVE: return "SDLK_AC_SAVE"; break;
|
||||
case SDLK_AC_PRINT: return "SDLK_AC_PRINT"; break;
|
||||
case SDLK_AC_PROPERTIES: return "SDLK_AC_PROPERTIES"; break;
|
||||
case SDLK_AC_SEARCH: return "SDLK_AC_SEARCH"; break;
|
||||
case SDLK_AC_HOME: return "SDLK_AC_HOME"; break;
|
||||
case SDLK_AC_BACK: return "SDLK_AC_BACK"; break;
|
||||
case SDLK_AC_FORWARD: return "SDLK_AC_FORWARD"; break;
|
||||
case SDLK_AC_STOP: return "SDLK_AC_STOP"; break;
|
||||
case SDLK_AC_REFRESH: return "SDLK_AC_REFRESH"; break;
|
||||
case SDLK_AC_BOOKMARKS: return "SDLK_AC_BOOKMARKS"; break;
|
||||
case SDLK_SOFTLEFT: return "SDLK_SOFTLEFT"; break;
|
||||
case SDLK_SOFTRIGHT: return "SDLK_SOFTRIGHT"; break;
|
||||
case SDLK_CALL: return "SDLK_CALL"; break;
|
||||
case SDLK_ENDCALL: return "SDLK_ENDCALL"; break;
|
||||
case SDLK_LEFT_TAB: return "SDLK_LEFT_TAB"; break;
|
||||
case SDLK_LEVEL5_SHIFT: return "SDLK_LEVEL5_SHIFT"; break;
|
||||
case SDLK_MULTI_KEY_COMPOSE: return "SDLK_MULTI_KEY_COMPOSE"; break;
|
||||
case SDLK_LMETA: return "SDLK_LMETA"; break;
|
||||
case SDLK_RMETA: return "SDLK_RMETA"; break;
|
||||
case SDLK_LHYPER: return "SDLK_LHYPER"; break;
|
||||
case SDLK_RHYPER: return "SDLK_RHYPER"; break;
|
||||
default: return "SDLK_INVALID";
|
||||
}
|
||||
}
|
||||
|
||||
struct Serializer {
|
||||
Buffer *buffer; // for writing
|
||||
};
|
||||
|
||||
void Serialize(Serializer *s, String name, EventKind *kind) {
|
||||
RawAppendf(s->buffer, "ev.%S = %s; ", name, EventKindStrings[*kind]);
|
||||
}
|
||||
|
||||
void Serialize(Serializer *s, String name, Int *datum) {
|
||||
if (*datum == 0) {
|
||||
return;
|
||||
}
|
||||
if (name == "key") {
|
||||
RawAppendf(s->buffer, "ev.%S = %s; ", name, SDLKeycodeToName((SDL_Keycode)*datum));
|
||||
} else {
|
||||
RawAppendf(s->buffer, "ev.%S = %lld; ", name, (long long)*datum);
|
||||
}
|
||||
}
|
||||
|
||||
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, float *datum) {
|
||||
if (*datum == 0.f) {
|
||||
return;
|
||||
}
|
||||
RawAppendf(s->buffer, "ev.%S = %f; ", name, *datum);
|
||||
}
|
||||
|
||||
void Serialize(Serializer *s, String name, char **text) {
|
||||
String str = *text;
|
||||
if (str.len == 0) {
|
||||
return;
|
||||
}
|
||||
RawAppendf(s->buffer, "ev.%S = \"%S\"; ", name, str);
|
||||
}
|
||||
|
||||
void SerializeBegin(Serializer *s) {
|
||||
RawAppendf(s->buffer, "{Event ev = {};");
|
||||
}
|
||||
|
||||
void SerializeEnd(Serializer *s) {
|
||||
RawAppendf(s->buffer, "Add(&EventPlayback, ev);}\n");
|
||||
}
|
||||
|
||||
// :Event
|
||||
void Serialize(Serializer *s, Event *e) {
|
||||
SerializeBegin(s);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
WindowID WindowIDs;
|
||||
BufferID BufferIDs;
|
||||
ViewID ViewIDs;
|
||||
|
||||
Window *FirstWindow;
|
||||
@@ -50,6 +49,7 @@ String16 LuaCommandResult = {};
|
||||
extern luaL_Reg LuaFunctions[];
|
||||
|
||||
// clipboard
|
||||
BlockArena ClipboardArena;
|
||||
String16 SavedClipboardString;
|
||||
Array<String16> SavedClipboardCarets = {SysAllocator};
|
||||
|
||||
@@ -69,7 +69,7 @@ String GetUniqueBufferName(String working_dir, String prepend_name, String exten
|
||||
return buffer_name;
|
||||
}
|
||||
|
||||
void InitScratchBuffer() {
|
||||
void InitBuffers() {
|
||||
Allocator sys_allocator = GetSystemAllocator();
|
||||
Scratch scratch;
|
||||
Buffer *null_buffer = CreateBuffer(sys_allocator, GetUniqueBufferName(GetWorkingDir(scratch), "console"));
|
||||
@@ -98,7 +98,7 @@ inline bool IsScrollbarSelectionValid() {
|
||||
|
||||
inline ViewID AllocViewID(View *view) { return {ViewIDs.id++, view}; }
|
||||
inline WindowID AllocWindowID(Window *window) { return {WindowIDs.id++, window}; }
|
||||
inline BufferID AllocBufferID(Buffer *buffer) { return {BufferIDs.id++, buffer}; }
|
||||
inline BufferID AllocBufferID(Buffer *buffer) { return {BufferIDs++, buffer}; }
|
||||
|
||||
inline Window *GetWindow(WindowID id) {
|
||||
for (Window *it = FirstWindow; it; it = it->next) {
|
||||
@@ -145,28 +145,8 @@ inline View *GetView(ViewID id) {
|
||||
inline bool IsNull(Buffer *buffer) { return buffer->id.id == NullBufferID.id; }
|
||||
inline Window *GetActiveWind() { return GetWindow(ActiveWindow); }
|
||||
|
||||
void InitBuffer(Allocator allocator, Buffer *buffer, String name, Int size = 4096) {
|
||||
buffer->id = AllocBufferID(buffer);
|
||||
buffer->name = Intern(&GlobalInternTable, name);
|
||||
buffer->cap = size;
|
||||
buffer->data = AllocArray(allocator, U16, buffer->cap);
|
||||
buffer->line_starts.allocator = allocator;
|
||||
buffer->undo_stack.allocator = allocator;
|
||||
buffer->redo_stack.allocator = allocator;
|
||||
if (!buffer->no_line_starts) Add(&buffer->line_starts, (Int)0);
|
||||
}
|
||||
|
||||
void DeallocBuffer(Buffer *buffer) {
|
||||
Dealloc(&buffer->line_starts);
|
||||
DeallocHistoryArray(&buffer->undo_stack);
|
||||
DeallocHistoryArray(&buffer->redo_stack);
|
||||
Dealloc(buffer->line_starts.allocator, buffer->data);
|
||||
Dealloc(buffer->line_starts.allocator, buffer);
|
||||
}
|
||||
|
||||
Buffer *CreateBuffer(Allocator allocator, String name, Int size) {
|
||||
Buffer *result = AllocType(allocator, Buffer);
|
||||
InitBuffer(allocator, result, name, size);
|
||||
Buffer *result = AllocBuffer(allocator, name, size);
|
||||
DLL_QUEUE_ADD(FirstBuffer, LastBuffer, result);
|
||||
BufferCount += 1;
|
||||
return result;
|
||||
@@ -434,13 +414,6 @@ Buffer *BufferOpenFile(String path) {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void ResetBuffer(Buffer *buffer) {
|
||||
Assert(buffer->edit_phase == 0);
|
||||
buffer->line_starts.len = 1;
|
||||
DeallocHistoryEntries(&buffer->redo_stack);
|
||||
DeallocHistoryEntries(&buffer->undo_stack);
|
||||
}
|
||||
|
||||
View *OpenBufferView(String name) {
|
||||
Buffer *buffer = BufferOpenFile(name);
|
||||
View *view = CreateView(buffer->id);
|
||||
@@ -532,9 +505,9 @@ void GarbageCollect() {
|
||||
continue;
|
||||
}
|
||||
|
||||
DLL_QUEUE_REMOVE(FirstView, LastView, it);
|
||||
Dealloc(&it->carets);
|
||||
Dealloc(sys_allocator, it);
|
||||
DLL_QUEUE_REMOVE(FirstView, LastView, it);
|
||||
}
|
||||
|
||||
for (Buffer *it = FirstBuffer, *next = NULL; it; it = next) {
|
||||
@@ -549,8 +522,8 @@ void GarbageCollect() {
|
||||
continue;
|
||||
}
|
||||
|
||||
DeallocBuffer(it);
|
||||
DLL_QUEUE_REMOVE(FirstBuffer, LastBuffer, it);
|
||||
DeallocBuffer(it);
|
||||
}
|
||||
|
||||
// for (Window *it = FirstWindow, *next = NULL; it; it = next) {
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
struct Serializer {
|
||||
Buffer *buffer; // for writing
|
||||
};
|
||||
|
||||
void Serialize(Serializer *s, String name, Int *datum) {
|
||||
RawAppendf(s->buffer, "%S = %lld, ", name, (long long)*datum);
|
||||
}
|
||||
|
||||
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, float *datum) {
|
||||
RawAppendf(s->buffer, "%S = %f, ", name, *datum);
|
||||
}
|
||||
|
||||
void Serialize(Serializer *s, String name, char **text) {
|
||||
String str = *text;
|
||||
RawAppendf(s->buffer, "%S = \"%S\", ", name, str);
|
||||
}
|
||||
|
||||
void SerializeBegin(Serializer *s) {
|
||||
RawAppendf(s->buffer, "{");
|
||||
}
|
||||
|
||||
void SerializeEnd(Serializer *s) {
|
||||
RawAppendf(s->buffer, "},\n");
|
||||
}
|
||||
@@ -16,6 +16,7 @@ SDL_Window *SDLWindow;
|
||||
bool IsInFullscreen;
|
||||
int FullScreenSizeX, FullScreenSizeY;
|
||||
int FullScreenPositionX, FullScreenPositionY;
|
||||
bool Testing = true;
|
||||
|
||||
#include "generated_variables.cpp"
|
||||
#include "render/generated_font.cpp"
|
||||
@@ -24,13 +25,12 @@ int FullScreenPositionX, FullScreenPositionY;
|
||||
|
||||
#include "buffer.h"
|
||||
#include "text_editor.h"
|
||||
#include "intern_table.cpp"
|
||||
#include "buffer.cpp"
|
||||
|
||||
#include "intern_table.cpp"
|
||||
#include "management.cpp"
|
||||
#include "window.cpp"
|
||||
#include "process.cpp"
|
||||
#include "serializer.cpp"
|
||||
#include "event.cpp"
|
||||
|
||||
#include "lua_api.cpp"
|
||||
@@ -328,8 +328,11 @@ void MainLoop() {
|
||||
|
||||
Scratch scratch;
|
||||
Array<Event> frame_events = GetEventsForFrame(scratch);
|
||||
Serializer ser = {EventBuffer};
|
||||
For(frame_events) {
|
||||
// Serialize(&ser, &it);
|
||||
if (it.kind != 1) {
|
||||
if (!Testing) Serialize(&ser, &it);
|
||||
}
|
||||
if (it.kind == EVENT_QUIT) {
|
||||
AppIsRunning = false;
|
||||
return;
|
||||
@@ -392,8 +395,8 @@ int main(int argc, char **argv)
|
||||
BeginProfiler();
|
||||
|
||||
if (1) {
|
||||
TestArena();
|
||||
TestBuffer();
|
||||
RunArenaTest();
|
||||
RunBufferTest();
|
||||
// ReportErrorf("Testing DONE\n");
|
||||
// return 0;
|
||||
}
|
||||
@@ -484,20 +487,19 @@ int main(int argc, char **argv)
|
||||
if (scale != 1.0f) DPIScale = scale;
|
||||
}
|
||||
|
||||
InitScratchBuffer();
|
||||
InitBuffers();
|
||||
InitRender();
|
||||
ReloadFont();
|
||||
InitWindows();
|
||||
InitOS(ReportWarningf);
|
||||
|
||||
|
||||
bool testing = false;
|
||||
for (int i = 1; i < argc; i += 1) {
|
||||
String it = argv[i];
|
||||
if (!FileExists(it)) continue;
|
||||
|
||||
if (it == "--testing") {
|
||||
testing = true;
|
||||
Testing = true;
|
||||
} else if (EndsWith(it, ".project.lua")) {
|
||||
SetProjectFile(BufferOpenFile(it));
|
||||
} else {
|
||||
@@ -508,7 +510,7 @@ int main(int argc, char **argv)
|
||||
|
||||
ReportConsolef("WorkDir = %S", WorkDir);
|
||||
InitLuaConfig();
|
||||
if (testing) InitTests();
|
||||
if (Testing) InitTests();
|
||||
#if OS_WINDOWS
|
||||
CoAdd(Windows_SetupVCVarsall);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user