Layout window to PrimaryWindow, command documentation

This commit is contained in:
Krzosa Karol
2026-01-02 16:05:56 +01:00
parent 9730aa944d
commit 215dd4a03f
15 changed files with 108 additions and 104 deletions

View File

@@ -5,9 +5,10 @@ Use session 4
- ":OpenAt C:/Work" - ":OpenAt C:/Work"
- :OpenCodeAt C:/Work - :OpenCodeAt C:/Work
- :SetWorkDirAt C:/Work or :Set WorkDir "." ? or :Set WorkDir "C:/text_editor" - :SetWorkDirAt C:/Work or :Set WorkDir "." ? or :Set WorkDir "C:/text_editor"
- Maybe some convention for commands that accept arguments?
- Delete file command - Delete file command
- :Close Fuzzy search exact match doesn't match with Close - :Close Fuzzy search exact match doesn't match with Close
- Maybe search everything window should have a special buffer
- Setting variables maybe should create and modify config, commit these changes immediately? So user can change keybindings in command window and commit immediately
- Make a fuzzy command !> grep and fuzzy over it??? (doesn't seem very useful for grep) - Make a fuzzy command !> grep and fuzzy over it??? (doesn't seem very useful for grep)
- Make the equivalent of SearchProject but for cmds like !@git grep -n "@>" - Make the equivalent of SearchProject but for cmds like !@git grep -n "@>"

View File

@@ -29,7 +29,7 @@ String GetDir(Buffer *buffer) {
} }
String GetMainDir() { String GetMainDir() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
return GetDir(main.buffer); return GetDir(main.buffer);
} }
@@ -162,7 +162,7 @@ void Appendf(View *view, const char *fmt, ...) {
void UIMessagef(const char *fmt, ...) { void UIMessagef(const char *fmt, ...) {
Scratch scratch; Scratch scratch;
STRING_FORMAT(scratch, fmt, string); STRING_FORMAT(scratch, fmt, string);
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
JumpTempBuffer(&main); JumpTempBuffer(&main);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
RawAppendf(main.buffer, "\n %S\n :Close\n", string); RawAppendf(main.buffer, "\n %S\n :Close\n", string);
@@ -217,7 +217,7 @@ void CenterView(WindowID window) {
} }
void CMD_CenterView() { void CMD_CenterView() {
CenterView(LastActiveLayoutWindowID); CenterView(PrimaryWindowID);
} RegisterCommand(CMD_CenterView, ""); } RegisterCommand(CMD_CenterView, "");
void MoveCursorByPageSize(Window *window, int direction, bool shift = false) { void MoveCursorByPageSize(Window *window, int direction, bool shift = false) {
@@ -341,7 +341,7 @@ void GotoNextInList(Window *window, Int line_offset = 1) {
{ {
Int idx = 0; Int idx = 0;
String16 delim = u"|::|"; String16 delim = u"||>";
if (Seek(line, delim, &idx, SeekFlag_None)) { if (Seek(line, delim, &idx, SeekFlag_None)) {
line = Skip(line, idx + delim.len); line = Skip(line, idx + delim.len);
} }
@@ -425,7 +425,7 @@ View *ExecHidden(String buffer_name, String cmd, String working_dir) {
} }
BSet Exec(String cmd, String working_dir, bool set_active = true) { BSet Exec(String cmd, String working_dir, bool set_active = true) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
if (set_active) { if (set_active) {
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
} }
@@ -436,7 +436,7 @@ BSet Exec(String cmd, String working_dir, bool set_active = true) {
BSet ExecBuild(String cmd) { BSet ExecBuild(String cmd) {
BSet build = GetBSet(BuildWindowID); BSet build = GetBSet(BuildWindowID);
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
SelectRange(build.view, Range{}); SelectRange(build.view, Range{});
ResetBuffer(build.buffer); ResetBuffer(build.buffer);
Exec(build.view->id, true, cmd, WorkDir); Exec(build.view->id, true, cmd, WorkDir);
@@ -466,12 +466,12 @@ void CMD_Build() {
} RegisterCommand(CMD_Build, "f1"); } RegisterCommand(CMD_Build, "f1");
void CMD_GotoNextInList() { void CMD_GotoNextInList() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
GotoNextInList(main.window, 1); GotoNextInList(main.window, 1);
} RegisterCommand(CMD_GotoNextInList, "ctrl-e"); } RegisterCommand(CMD_GotoNextInList, "ctrl-e");
void CMD_GotoPrevInList() { void CMD_GotoPrevInList() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
GotoNextInList(main.window, -1); GotoNextInList(main.window, -1);
} RegisterCommand(CMD_GotoPrevInList, "alt-e"); } RegisterCommand(CMD_GotoPrevInList, "alt-e");
@@ -664,7 +664,7 @@ BSet Open(Window *window, String path, ResolveOpenMeta meta, bool set_active = t
} }
BSet Open(String path, ResolveOpenMeta meta) { BSet Open(String path, ResolveOpenMeta meta) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
main = Open(main.window, path, meta); main = Open(main.window, path, meta);
return main; return main;
} }
@@ -676,18 +676,18 @@ BSet Open(String16 path, ResolveOpenMeta meta) {
} }
void CMD_Save() { void CMD_Save() {
BSet active = GetBSet(LastActiveLayoutWindowID); BSet active = GetBSet(PrimaryWindowID);
SaveBuffer(active.buffer); SaveBuffer(active.buffer);
} RegisterCommand(CMD_Save, "ctrl-s"); } RegisterCommand(CMD_Save, "ctrl-s");
void CMD_Reopen() { void CMD_Reopen() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
ReopenBuffer(main.buffer); ReopenBuffer(main.buffer);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
} RegisterCommand(CMD_Reopen, ""); } RegisterCommand(CMD_Reopen, "");
void CMD_New() { void CMD_New() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
New(main.window, ""); New(main.window, "");
} RegisterCommand(CMD_New, "ctrl-n"); } RegisterCommand(CMD_New, "ctrl-n");
@@ -710,7 +710,7 @@ void CMD_ToggleFullscreen() {
void CMD_SetWorkDir() { void CMD_SetWorkDir() {
Scratch scratch; Scratch scratch;
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
WorkDir = GetDir(main.buffer); WorkDir = GetDir(main.buffer);
For (Buffers) { For (Buffers) {
if (it->special) { if (it->special) {
@@ -722,7 +722,7 @@ void CMD_SetWorkDir() {
String Coro_OpenCodeDir; String Coro_OpenCodeDir;
void Coro_OpenCode(mco_coro *co) { void Coro_OpenCode(mco_coro *co) {
Array<String> patterns = Split(CoCurr->arena, NonCodePatterns_EndsWith, "|"); Array<String> patterns = Split(CoCurr->arena, Coro_OpenCodeDir, "|");
Array<String> dirs = {CoCurr->arena}; Array<String> dirs = {CoCurr->arena};
Add(&dirs, Coro_OpenCodeDir); Add(&dirs, Coro_OpenCodeDir);
for (int diri = 0; diri < dirs.len; diri += 1) { for (int diri = 0; diri < dirs.len; diri += 1) {
@@ -758,24 +758,24 @@ void OpenCode(String dir) {
void CMD_OpenCode() { void CMD_OpenCode() {
OpenCode(WorkDir); OpenCode(WorkDir);
} RegisterCommand(CMD_OpenCode, ""); } RegisterCommand(CMD_OpenCode, "", "Open all code files in current WorkDir, the code files are determined through NonCodePatterns_EndsWith config variable list");
void CMD_KillProcess() { void CMD_KillProcess() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
KillProcess(main.view); KillProcess(main.view);
} RegisterCommand(CMD_KillProcess, ""); } RegisterCommand(CMD_KillProcess, "", "Kill process in the last active primary window");
void CMD_CloseWindow() { void CMD_CloseWindow() {
Close(LastActiveLayoutWindowID); Close(PrimaryWindowID);
} RegisterCommand(CMD_CloseWindow, ""); } RegisterCommand(CMD_CloseWindow, "", "Close the last active primary window");
void AddHook(Array<CommandData> *arr, String name, String binding, Function *function) { void AddHook(Array<CommandData> *arr, String name, String binding, Function *function) {
CommandData n = {name, binding, function, ParseKeyCached(binding)}; CommandData n = {name, binding, function, "Not listing hooks anywhere currently", ParseKeyCached(binding)};
Add(arr, n); Add(arr, n);
} }
void Coro_Rename(mco_coro *co) { void Coro_Rename(mco_coro *co) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
Buffer *buffer = main.buffer; Buffer *buffer = main.buffer;
JumpTempBuffer(&main); JumpTempBuffer(&main);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
@@ -787,7 +787,7 @@ void Coro_Rename(mco_coro *co) {
AddHook(&main.view->hooks, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}); AddHook(&main.view->hooks, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";});
String result = "Cancel"; String result = "Cancel";
for (;;) { for (;;) {
if (main.window->active_view != main.view->id || (main.window->id != LastActiveLayoutWindowID && main.window->id != ActiveWindowID) || main.window->close) { if (main.window->active_view != main.view->id || (main.window->id != PrimaryWindowID && main.window->id != ActiveWindowID) || main.window->close) {
break; break;
} }
@@ -817,7 +817,7 @@ void CMD_Rename() {
CoRemove("Coro_Rename"); CoRemove("Coro_Rename");
CoData *data = CoAdd(Coro_Rename); CoData *data = CoAdd(Coro_Rename);
CoResume(data); CoResume(data);
} RegisterCommand(CMD_Rename, ""); } RegisterCommand(CMD_Rename, "", "Opens a UI asking for a new name of a buffer open in the last active primary window");
String Coro_YesNoCancel(mco_coro *co, BSet main, String question) { String Coro_YesNoCancel(mco_coro *co, BSet main, String question) {
JumpTempBuffer(&main); JumpTempBuffer(&main);
@@ -834,7 +834,7 @@ String Coro_YesNoCancel(mco_coro *co, BSet main, String question) {
AddHook(&main.view->hooks, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}); AddHook(&main.view->hooks, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";});
String result = "Cancel"; String result = "Cancel";
for (;;) { for (;;) {
if (main.window->active_view != main.view->id || (main.window->id != LastActiveLayoutWindowID && main.window->id != ActiveWindowID) || main.window->close) { if (main.window->active_view != main.view->id || (main.window->id != PrimaryWindowID && main.window->id != ActiveWindowID) || main.window->close) {
break; break;
} }
@@ -850,7 +850,7 @@ String Coro_YesNoCancel(mco_coro *co, BSet main, String question) {
} }
void Coro_Close(mco_coro *co) { void Coro_Close(mco_coro *co) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
if (main.buffer->special || main.buffer->temp) { if (main.buffer->special || main.buffer->temp) {
Close(main.view->id); Close(main.view->id);
return; return;
@@ -893,15 +893,14 @@ void CMD_Close() {
CoRemove("Coro_Close"); CoRemove("Coro_Close");
CoData *data = CoAdd(Coro_Close); CoData *data = CoAdd(Coro_Close);
CoResume(data); CoResume(data);
} RegisterCommand(CMD_Close, "ctrl-w", "Close open view in the last active primary window");
} RegisterCommand(CMD_Close, "ctrl-w");
// Considerations with coroutines: // Considerations with coroutines:
// 1. Does scratch memory leak across Yield boundary? Or interacts badly with Yield stuff in any way? // 1. Does scratch memory leak across Yield boundary? Or interacts badly with Yield stuff in any way?
// 2. Are pointers and globals correct over time? Or might they get deleted etc. // 2. Are pointers and globals correct over time? Or might they get deleted etc.
// 3. Imagine a scenario where the coroutine gets deleted before completion, will the memory leak? // 3. Imagine a scenario where the coroutine gets deleted before completion, will the memory leak?
String Coro_CloseAllEx(mco_coro *co) { String Coro_CloseAllEx(mco_coro *co) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
Array<BufferID> buffers = {CoCurr->arena}; Array<BufferID> buffers = {CoCurr->arena};
For (Buffers) Add(&buffers, it->id); For (Buffers) Add(&buffers, it->id);
ForItem (id, buffers) { ForItem (id, buffers) {
@@ -941,11 +940,11 @@ void CMD_Quit() {
CoRemove("Coro_Quit"); CoRemove("Coro_Quit");
CoData *data = CoAdd(Coro_Quit); CoData *data = CoAdd(Coro_Quit);
CoResume(data); CoResume(data);
} RegisterCommand(CMD_Quit, ""); } RegisterCommand(CMD_Quit, "", "Ask user which files he would like to save and exit");
void CMD_QuitWithoutSaving() { void CMD_QuitWithoutSaving() {
AppIsRunning = false; AppIsRunning = false;
} RegisterCommand(CMD_QuitWithoutSaving, ""); } RegisterCommand(CMD_QuitWithoutSaving, "", "Self explanatory");
void Coro_CloseAll(mco_coro *co) { void Coro_CloseAll(mco_coro *co) {
Coro_CloseAllEx(co); Coro_CloseAllEx(co);
@@ -955,77 +954,77 @@ void CMD_CloseAll() {
CoRemove("Coro_CloseAll"); CoRemove("Coro_CloseAll");
CoData *data = CoAdd(Coro_CloseAll); CoData *data = CoAdd(Coro_CloseAll);
CoResume(data); CoResume(data);
} RegisterCommand(CMD_CloseAll, ""); } RegisterCommand(CMD_CloseAll, "", "Ask user which files to save and close all open normal views and buffers");
void CMD_JumpPrev() { void CMD_JumpPrev() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
JumpToLastValidView(main.window); JumpToLastValidView(main.window);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
} RegisterCommand(CMD_JumpPrev, "ctrl-tab"); } RegisterCommand(CMD_JumpPrev, "ctrl-tab", "Go to the previous open view in primary window");
void CMD_Prev() { void CMD_Prev() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
main.window->skip_checkpoint = true; main.window->skip_checkpoint = true;
JumpBack(main.window); JumpBack(main.window);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
} RegisterCommand(CMD_Prev, "alt-q | mousex1"); } RegisterCommand(CMD_Prev, "alt-q | mousex1", "Go to previous position (either previous view that was open or caret position) in the primary window");
void CMD_Next() { void CMD_Next() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
main.window->skip_checkpoint = true; main.window->skip_checkpoint = true;
JumpForward(main.window); JumpForward(main.window);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
} RegisterCommand(CMD_Next, "alt-shift-q | mousex2"); } RegisterCommand(CMD_Next, "alt-shift-q | mousex2", "Go to next position, after backtracking, in the primary window");
void CMD_OpenUpFolder() { void CMD_OpenUpFolder() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
String name = ChopLastSlash(main.buffer->name); String name = ChopLastSlash(main.buffer->name);
Open(name); Open(name);
} RegisterCommand(CMD_OpenUpFolder, "ctrl-period"); } RegisterCommand(CMD_OpenUpFolder, "ctrl-period", "Open current's file directory or up directory in other cases");
void CMD_EncloseLine() { void CMD_EncloseLine() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
EncloseLine(active.view); EncloseLine(active.view);
} RegisterCommand(CMD_EncloseLine, "ctrl-l"); } RegisterCommand(CMD_EncloseLine, "ctrl-l", "Select the entire line on which your caret is placed");
void CMD_SelectAll() { void CMD_SelectAll() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
SelectEntireBuffer(active.view); SelectEntireBuffer(active.view);
active.view->update_scroll = false; active.view->update_scroll = false;
} RegisterCommand(CMD_SelectAll, "ctrl-a"); } RegisterCommand(CMD_SelectAll, "ctrl-a", "Select the entire buffer");
void CMD_Redo() { void CMD_Redo() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
RedoEdit(active.buffer, &active.view->carets); RedoEdit(active.buffer, &active.view->carets);
} RegisterCommand(CMD_Redo, "ctrl-shift-z"); } RegisterCommand(CMD_Redo, "ctrl-shift-z", "Redo after undoing changes to the buffer");
void CMD_Undo() { void CMD_Undo() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
UndoEdit(active.buffer, &active.view->carets); UndoEdit(active.buffer, &active.view->carets);
} RegisterCommand(CMD_Undo, "ctrl-z"); } RegisterCommand(CMD_Undo, "ctrl-z", "Undo last change you made to the buffer");
void CMD_MakeFontLarger() { void CMD_MakeFontLarger() {
FontSize += 1; FontSize += 1;
ReloadFont(Font, (U32)FontSize); ReloadFont(Font, (U32)FontSize);
} RegisterCommand(CMD_MakeFontLarger, "ctrl-equals"); } RegisterCommand(CMD_MakeFontLarger, "ctrl-equals", "Increase the font size");
void CMD_MakeFontSmaller() { void CMD_MakeFontSmaller() {
if (FontSize > 4) { if (FontSize > 4) {
FontSize -= 1; FontSize -= 1;
ReloadFont(Font, (U32)FontSize); ReloadFont(Font, (U32)FontSize);
} }
} RegisterCommand(CMD_MakeFontSmaller, "ctrl-minus"); } RegisterCommand(CMD_MakeFontSmaller, "ctrl-minus", "Decrease the font size");
void CMD_OpenLoadWord() { void CMD_OpenLoadWord() {
Scratch scratch; Scratch scratch;
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
String16 load_word = FetchLoadWord(active.view); String16 load_word = FetchLoadWord(active.view);
// String load_word = ToString(scratch, load_word16); // String load_word = ToString(scratch, load_word16);
Window *window = GetWindow(LastActiveLayoutWindowID); // Window *window = GetWindow(PrimaryWindowID);
window->active_goto_list = active.view->id; // window->active_goto_list = active.view->id;
window->goto_list_pos = active.view->carets[0].range.min; // window->goto_list_pos = active.view->carets[0].range.min;
Open(load_word); Open(load_word);
} RegisterCommand(CMD_OpenLoadWord, "ctrl-q"); } RegisterCommand(CMD_OpenLoadWord, "ctrl-q", "Open a link under the caret (file link, url, command) or open the selection");
void CMD_KillSelectedLines() { void CMD_KillSelectedLines() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
@@ -1289,10 +1288,10 @@ void CMD_ClearCarets() {
active.view->carets[0] = MakeCaret(GetFront(active.view->carets[0])); active.view->carets[0] = MakeCaret(GetFront(active.view->carets[0]));
if (active.window->lose_focus_on_escape && active.window->id == ActiveWindowID) { if (active.window->lose_focus_on_escape && active.window->id == ActiveWindowID) {
if (active.window->layout) { if (active.window->primary) {
// //
} else { } else {
NextActiveWindowID = LastActiveLayoutWindowID; NextActiveWindowID = PrimaryWindowID;
} }
} }
@@ -1446,12 +1445,12 @@ void CMD_Set() {
} RegisterCommand(CMD_Set, ""); } RegisterCommand(CMD_Set, "");
void EvalCommandsLineByLine(BSet set) { void EvalCommandsLineByLine(BSet set) {
WindowID save_last = LastActiveLayoutWindowID; WindowID save_last = PrimaryWindowID;
WindowID save_active = ActiveWindowID; WindowID save_active = ActiveWindowID;
WindowID save_next = NextActiveWindowID; WindowID save_next = NextActiveWindowID;
Caret save_caret = set.view->carets[0]; Caret save_caret = set.view->carets[0];
ActiveWindowID = set.window->id; ActiveWindowID = set.window->id;
LastActiveLayoutWindowID = set.window->id; PrimaryWindowID = set.window->id;
NextActiveWindowID = set.window->id; NextActiveWindowID = set.window->id;
for (Int i = 0; i < set.buffer->line_starts.len; i += 1) { for (Int i = 0; i < set.buffer->line_starts.len; i += 1) {
Int pos = GetLineRangeWithoutNL(set.buffer, i).min; Int pos = GetLineRangeWithoutNL(set.buffer, i).min;
@@ -1468,13 +1467,13 @@ void EvalCommandsLineByLine(BSet set) {
Open(string); Open(string);
} }
set.view->carets[0] = save_caret; set.view->carets[0] = save_caret;
LastActiveLayoutWindowID = save_last; PrimaryWindowID = save_last;
ActiveWindowID = save_active; ActiveWindowID = save_active;
NextActiveWindowID = save_next; NextActiveWindowID = save_next;
} }
void CMD_EvalCommandsLineByLine() { void CMD_EvalCommandsLineByLine() {
BSet set = GetBSet(LastActiveLayoutWindowID); BSet set = GetBSet(PrimaryWindowID);
EvalCommandsLineByLine(set); EvalCommandsLineByLine(set);
} RegisterCommand(CMD_EvalCommandsLineByLine, ""); } RegisterCommand(CMD_EvalCommandsLineByLine, "");

View File

@@ -107,7 +107,7 @@ void DrawWindow(Window *window, Event &event) {
SetScissor(screen_rect); SetScissor(screen_rect);
bool is_active = window->id == ActiveWindowID; bool is_active = window->id == ActiveWindowID;
bool active_layed_out_doc = window->id == LastActiveLayoutWindowID; bool active_layed_out_doc = window->id == PrimaryWindowID;
Color color_whitespace_during_selection = SelectedWhitespaceColor; Color color_whitespace_during_selection = SelectedWhitespaceColor;
Color color_background = BackgroundColor; Color color_background = BackgroundColor;

View File

@@ -38,7 +38,7 @@ BufferID BuildBufferID;
WindowID NextActiveWindowID; WindowID NextActiveWindowID;
WindowID ActiveWindowID; WindowID ActiveWindowID;
WindowID LastActiveLayoutWindowID; WindowID PrimaryWindowID;
WindowID ScrollbarSelected = {-1}; WindowID ScrollbarSelected = {-1};
WindowID DocumentSelected = {-1}; WindowID DocumentSelected = {-1};
WindowID ResizerSelected = {-1}; WindowID ResizerSelected = {-1};

View File

@@ -88,7 +88,7 @@ void SetMouseCursor(Event event) {
if (ResizerSelected.id != -1) { if (ResizerSelected.id != -1) {
Window *window = GetWindow(ResizerSelected); Window *window = GetWindow(ResizerSelected);
if (window->layout) { if (window->primary) {
SetMouseCursor(SDL_SYSTEM_CURSOR_EW_RESIZE); SetMouseCursor(SDL_SYSTEM_CURSOR_EW_RESIZE);
} else { } else {
SetMouseCursor(SDL_SYSTEM_CURSOR_NS_RESIZE); SetMouseCursor(SDL_SYSTEM_CURSOR_NS_RESIZE);
@@ -98,7 +98,7 @@ void SetMouseCursor(Event event) {
if (ResizerHover.id != -1) { if (ResizerHover.id != -1) {
Window *window = GetWindow(ResizerHover); Window *window = GetWindow(ResizerHover);
if (window->layout) { if (window->primary) {
SetMouseCursor(SDL_SYSTEM_CURSOR_EW_RESIZE); SetMouseCursor(SDL_SYSTEM_CURSOR_EW_RESIZE);
} else { } else {
SetMouseCursor(SDL_SYSTEM_CURSOR_NS_RESIZE); SetMouseCursor(SDL_SYSTEM_CURSOR_NS_RESIZE);
@@ -256,7 +256,7 @@ void OnCommand(Event event) {
ResizerSelected.id = {-1}; ResizerSelected.id = {-1};
} else if (ResizerSelected.id != -1) { } else if (ResizerSelected.id != -1) {
Window *window = GetWindow(ResizerSelected); Window *window = GetWindow(ResizerSelected);
if (window->layout) { if (window->primary) {
Vec2I mouse = MouseVec2I(); Vec2I mouse = MouseVec2I();
Int offx = mouse.x - window->resizer_rect.min.x; Int offx = mouse.x - window->resizer_rect.min.x;
window->weight += (double)offx / (double)WindowCalcEvenResizerValue(event.xwindow); window->weight += (double)offx / (double)WindowCalcEvenResizerValue(event.xwindow);
@@ -403,7 +403,7 @@ void OnCommand(Event event) {
} }
} }
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
bool executed = false; bool executed = false;
@@ -630,7 +630,7 @@ void Update(Event event) {
ActiveWindowID = NextActiveWindowID; ActiveWindowID = NextActiveWindowID;
Window *window = GetWindow(ActiveWindowID, NULL); Window *window = GetWindow(ActiveWindowID, NULL);
if (window == NULL || window->visible == false) { if (window == NULL || window->visible == false) {
ActiveWindowID = NextActiveWindowID = LastActiveLayoutWindowID; ActiveWindowID = NextActiveWindowID = PrimaryWindowID;
window = GetWindow(ActiveWindowID, NULL); window = GetWindow(ActiveWindowID, NULL);
if (window == NULL) { if (window == NULL) {
ActiveWindowID = NullWindowID; ActiveWindowID = NullWindowID;
@@ -653,10 +653,10 @@ void Update(Event event) {
} }
} }
if (ActiveWindowID != LastActiveLayoutWindowID) { if (ActiveWindowID != PrimaryWindowID) {
Window *window = GetWindow(ActiveWindowID, NULL); Window *window = GetWindow(ActiveWindowID, NULL);
if (window->layout) { if (window->primary) {
LastActiveLayoutWindowID = ActiveWindowID; PrimaryWindowID = ActiveWindowID;
} }
} }
} }

View File

@@ -134,8 +134,8 @@ struct Register_Function {
}; };
#define RegisterFunction(functions, name) Register_Function RF__##name(functions, #name, name) #define RegisterFunction(functions, name) Register_Function RF__##name(functions, #name, name)
struct Register_Command { Register_Command(Array<CommandData> *fucs, Function *function, String name, String binding) { if (StartsWith(name, "CMD_")) name = Skip(name, sizeof("CMD_") - 1); Add(fucs, {name, binding, function}); } }; struct Register_Command { Register_Command(Array<CommandData> *fucs, Function *function, String name, String binding, String doc = "") { if (StartsWith(name, "CMD_")) name = Skip(name, sizeof("CMD_") - 1); Add(fucs, {name, binding, function, doc}); } };
#define RegisterCommand(name, binding) Register_Command RC__##name(&CommandFunctions, name, #name, binding) #define RegisterCommand(name, ...) Register_Command RC__##name(&CommandFunctions, name, #name, __VA_ARGS__)
const int DIR_RIGHT = 0; const int DIR_RIGHT = 0;
const int DIR_LEFT = 1; const int DIR_LEFT = 1;

View File

@@ -126,7 +126,7 @@ String16 FetchFuzzyViewLoadLine(View *view) {
string = GetLineStringWithoutNL(buffer, line); string = GetLineStringWithoutNL(buffer, line);
Int idx = 0; Int idx = 0;
String16 delim = u"|::|"; String16 delim = u"||>";
if (Seek(string, delim, &idx, SeekFlag_None)) { if (Seek(string, delim, &idx, SeekFlag_None)) {
string = Skip(string, idx + delim.len); string = Skip(string, idx + delim.len);
} }

View File

@@ -3,7 +3,7 @@ struct ViewID { Int id; View *o; };
typedef void Function(); typedef void Function();
struct FunctionData { String name; Function *function; }; struct FunctionData { String name; Function *function; };
struct CommandData { String name; String binding; Function *function; struct Trigger *trigger; }; struct CommandData { String name; String binding; Function *function; String doc; struct Trigger *trigger; };
enum ViewKind { enum ViewKind {
ViewKind_Normal, ViewKind_Normal,

View File

@@ -7,7 +7,7 @@ Window *CreateWind() {
Window *w = AllocType(allocator, Window); Window *w = AllocType(allocator, Window);
w->font = &PrimaryFont; w->font = &PrimaryFont;
w->visible = true; w->visible = true;
w->layout = true; w->primary = true;
w->draw_scrollbar = true; w->draw_scrollbar = true;
w->draw_line_numbers = true; w->draw_line_numbers = true;
w->draw_line_highlight = true; w->draw_line_highlight = true;
@@ -134,7 +134,7 @@ double WindowCalcEvenResizerValue(Int screen_size_x, Int *out_count = NULL) {
double w = 0; double w = 0;
Int c = 0; Int c = 0;
ForItem(n, Windows) { ForItem(n, Windows) {
if (n->layout) { if (n->primary) {
w += n->weight; w += n->weight;
c += 1; c += 1;
} }
@@ -162,7 +162,7 @@ void LayoutWindows(int16_t wx, int16_t wy) {
int i = 0; int i = 0;
ForItem(n, Windows) { ForItem(n, Windows) {
if (!n->layout) { if (!n->primary) {
continue; continue;
} }

View File

@@ -30,7 +30,7 @@ struct Window {
uint32_t secondary_window_style : 1; uint32_t secondary_window_style : 1;
uint32_t draw_line_highlight : 1; uint32_t draw_line_highlight : 1;
uint32_t visible : 1; uint32_t visible : 1;
uint32_t layout : 1; uint32_t primary : 1;
uint32_t close : 1; uint32_t close : 1;
uint32_t sync_visibility_with_focus : 1; uint32_t sync_visibility_with_focus : 1;
uint32_t lose_focus_on_escape : 1; uint32_t lose_focus_on_escape : 1;

View File

@@ -11,7 +11,7 @@ void BuildWindowInit() {
window->active_view = view->id; window->active_view = view->id;
window->secondary_window_style = true; window->secondary_window_style = true;
window->draw_line_highlight = true; window->draw_line_highlight = true;
window->layout = false; window->primary = false;
window->visible = false; window->visible = false;
window->lose_visibility_on_escape = true; window->lose_visibility_on_escape = true;
window->jump_history = false; window->jump_history = false;

View File

@@ -1,6 +1,6 @@
void CMD_ShowCommands() { void CMD_ShowCommands() {
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowCommands) { if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowCommands) {
NextActiveWindowID = LastActiveLayoutWindowID; NextActiveWindowID = PrimaryWindowID;
return; return;
} }
ProfileFunction(); ProfileFunction();
@@ -13,15 +13,18 @@ void CMD_ShowCommands() {
if (it.name == "OpenCommand") { if (it.name == "OpenCommand") {
continue; continue;
} }
RawAppendf(command_bar.buffer, "\n:%S", it.name); RawAppendf(command_bar.buffer, "\n:%-30S <|| :Set %-30S '%-30S'", it.name, it.name, it.binding);
if (it.doc.len) {
RawAppendf(command_bar.buffer, " |::| %S", it.doc);
}
} }
command_bar.view->update_scroll = true; command_bar.view->update_scroll = true;
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
} RegisterCommand(CMD_ShowCommands, "ctrl-shift-p"); } RegisterCommand(CMD_ShowCommands, "ctrl-shift-p", "List available commands and their documentation inside the command window");
void CMD_ShowDebugBufferList() { void CMD_ShowDebugBufferList() {
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowDebugBufferList) { if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowDebugBufferList) {
NextActiveWindowID = LastActiveLayoutWindowID; NextActiveWindowID = PrimaryWindowID;
return; return;
} }
ProfileFunction(); ProfileFunction();
@@ -35,11 +38,11 @@ void CMD_ShowDebugBufferList() {
} }
command_bar.view->update_scroll = true; command_bar.view->update_scroll = true;
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
} RegisterCommand(CMD_ShowDebugBufferList, ""); } RegisterCommand(CMD_ShowDebugBufferList, "", "Show full list of buffers, including the special ones that normally just clutter list");
void CMD_ShowBufferList() { void CMD_ShowBufferList() {
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowBufferList) { if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowBufferList) {
NextActiveWindowID = LastActiveLayoutWindowID; NextActiveWindowID = PrimaryWindowID;
return; return;
} }
ProfileFunction(); ProfileFunction();
@@ -53,7 +56,7 @@ void CMD_ShowBufferList() {
} }
command_bar.view->update_scroll = true; command_bar.view->update_scroll = true;
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
} RegisterCommand(CMD_ShowBufferList, "ctrl-p"); } RegisterCommand(CMD_ShowBufferList, "ctrl-p", "List open buffers inside the command window that you can fuzzy search over");
void OpenCommand(BSet active) { void OpenCommand(BSet active) {
ProfileFunction(); ProfileFunction();
@@ -63,13 +66,13 @@ void OpenCommand(BSet active) {
void CMD_CommandWindowOpen() { void CMD_CommandWindowOpen() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
String16 string = FetchFuzzyViewLoadLine(active.view); String16 string = FetchFuzzyViewLoadLine(active.view);
// if (active.view->kind == ViewKind_ActiveSearch) { if (active.view->kind == ViewKind_ActiveSearch) {
main.window->active_goto_list = active.view->id; main.window->active_goto_list = active.view->id;
main.window->goto_list_pos = active.view->carets[0].range.min; main.window->goto_list_pos = active.view->carets[0].range.min;
// } }
Open(string); Open(string);
} }
@@ -120,8 +123,9 @@ Array<FuzzyPair> FuzzySearchLines(Allocator allocator, Buffer *buffer, Int line_
String16 s = GetLineStringWithoutNL(buffer, i); String16 s = GetLineStringWithoutNL(buffer, i);
Int idx = 0; Int idx = 0;
String16 delim = u"|::|"; if (Seek(s, u"||>", &idx, SeekFlag_None)) {
if (Seek(s, delim, &idx, SeekFlag_None)) { s = GetPrefix(s, idx);
} else if (Seek(s, u"<||", &idx, SeekFlag_None)) {
s = GetPrefix(s, idx); s = GetPrefix(s, idx);
} }
s = Trim(s); s = Trim(s);
@@ -155,7 +159,7 @@ void Coro_SearchProject(mco_coro *co) {
Int line = PosToLine(it, pos); Int line = PosToLine(it, pos);
String16 line_string = GetLineStringWithoutNL(it, line); String16 line_string = GetLineStringWithoutNL(it, line);
String line_string8 = ToString(scratch, line_string); String line_string8 = ToString(scratch, line_string);
RawAppendf(out_buffer, "%S |::| %S:%lld\n", line_string8, it->name, (long long)line + 1); RawAppendf(out_buffer, "%S ||> %S:%lld\n", line_string8, it->name, (long long)line + 1);
} }
} }
CoYield(co); CoYield(co);
@@ -163,7 +167,7 @@ void Coro_SearchProject(mco_coro *co) {
} }
void CMD_ReplaceAll() { void CMD_ReplaceAll() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
String16 string = FetchLoadWord(main.view); String16 string = FetchLoadWord(main.view);
Scratch scratch; Scratch scratch;
Array<String16> parts = Split(scratch, string, u"@>"); Array<String16> parts = Split(scratch, string, u"@>");
@@ -183,7 +187,7 @@ void CMD_ReplaceAll() {
SelectAllOccurences(view, needle); SelectAllOccurences(view, needle);
Replace(view, replace); Replace(view, replace);
} }
} RegisterCommand(CMD_ReplaceAll, ""); } RegisterCommand(CMD_ReplaceAll, "", "Search and replace over the entire project, you need to select a text with format like this 'FindAnd@>ReplaceWith' and executing the command will change all occurences of FindAnd to ReplaceWith");
void FuzzySearchViewUpdate() { void FuzzySearchViewUpdate() {
ProfileFunction(); ProfileFunction();
@@ -240,13 +244,13 @@ void FuzzySearchViewUpdate() {
} }
void CMD_SearchProject() { void CMD_SearchProject() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
JumpTempBuffer(&main); JumpTempBuffer(&main);
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
main.view->kind = ViewKind_ActiveSearch; main.view->kind = ViewKind_ActiveSearch;
AddHook(&main.view->hooks, "Open", "ctrl-q | enter", CMD_CommandWindowOpen); AddHook(&main.view->hooks, "Open", "ctrl-q | enter", CMD_CommandWindowOpen);
main.buffer->no_history = true; main.buffer->no_history = true;
} RegisterCommand(CMD_SearchProject, "ctrl-shift-f"); } RegisterCommand(CMD_SearchProject, "ctrl-shift-f", "Interactive search over the entire project in a new buffer view");
void SetFuzzy(View *view) { void SetFuzzy(View *view) {
view->kind = ViewKind_FuzzySearch; view->kind = ViewKind_FuzzySearch;
@@ -267,7 +271,7 @@ void CommandWindowInit() {
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->secondary_window_style = true; window->secondary_window_style = true;
window->draw_line_highlight = true; window->draw_line_highlight = true;
window->layout = false; window->primary = false;
window->visible = false; window->visible = false;
window->sync_visibility_with_focus = true; window->sync_visibility_with_focus = true;
window->lose_focus_on_escape = true; window->lose_focus_on_escape = true;

View File

@@ -5,7 +5,7 @@ void DebugWindowInit() {
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->visible = false; window->visible = false;
window->z = 2; window->z = 2;
window->layout = false; window->primary = false;
window->jump_history = false; window->jump_history = false;
Buffer *buffer = CreateBuffer(SysAllocator, GetUniqueBufferName(WorkDir, "debug")); Buffer *buffer = CreateBuffer(SysAllocator, GetUniqueBufferName(WorkDir, "debug"));
@@ -43,7 +43,7 @@ void DebugWindowUpdate() {
return; return;
} }
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
Scratch scratch; Scratch scratch;
String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)main.window->id.id, (int)main.view->id.id, (int)main.buffer->id.id, (long long)FrameID); String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)main.window->id.id, (int)main.view->id.id, (int)main.buffer->id.id, (long long)FrameID);

View File

@@ -15,12 +15,12 @@ void CMD_Search() {
} RegisterCommand(CMD_Search, "ctrl-f"); } RegisterCommand(CMD_Search, "ctrl-f");
void SearchWindowFindNext(bool forward = true) { void SearchWindowFindNext(bool forward = true) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
BSet set = GetBSet(SearchWindowID); BSet set = GetBSet(SearchWindowID);
String16 seek = GetString(set.buffer, GetRange(set.buffer)); String16 seek = GetString(set.buffer, GetRange(set.buffer));
Find(main.view, seek, forward); Find(main.view, seek, forward);
main.window->search_bar_anchor = main.view->carets[0]; main.window->search_bar_anchor = main.view->carets[0];
CenterView(LastActiveLayoutWindowID); CenterView(PrimaryWindowID);
} }
void CMD_SearchNextInSearch() { void CMD_SearchNextInSearch() {
@@ -40,7 +40,7 @@ void CMD_SearchPrev() {
} RegisterCommand(CMD_SearchPrev, "shift-f3"); } RegisterCommand(CMD_SearchPrev, "shift-f3");
void CMD_SearchAll() { void CMD_SearchAll() {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
BSet set = GetBSet(SearchWindowID); BSet set = GetBSet(SearchWindowID);
String16 needle = GetString(set.buffer, GetRange(set.buffer)); String16 needle = GetString(set.buffer, GetRange(set.buffer));
SelectAllOccurences(main.view, needle); SelectAllOccurences(main.view, needle);
@@ -58,7 +58,7 @@ void CMD_ToggleSearchWordBoundary() {
void SearchWindowUpdate() { void SearchWindowUpdate() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);
if (active.window->id == SearchWindowID && active.buffer->begin_frame_change_id != active.buffer->change_id) { if (active.window->id == SearchWindowID && active.buffer->begin_frame_change_id != active.buffer->change_id) {
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
BSet set = GetBSet(SearchWindowID); BSet set = GetBSet(SearchWindowID);
main.view->carets[0] = main.window->search_bar_anchor; main.view->carets[0] = main.window->search_bar_anchor;
String16 seek = GetString(set.buffer, GetRange(set.buffer)); String16 seek = GetString(set.buffer, GetRange(set.buffer));
@@ -92,7 +92,7 @@ void SearchWindowInit() {
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->secondary_window_style = true; window->secondary_window_style = true;
window->draw_line_highlight = false; window->draw_line_highlight = false;
window->layout = false; window->primary = false;
window->visible = false; window->visible = false;
window->lose_visibility_on_escape = true; window->lose_visibility_on_escape = true;
window->jump_history = false; window->jump_history = false;

View File

@@ -11,7 +11,7 @@ void StatusWindowInit() {
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->draw_line_highlight = true; window->draw_line_highlight = true;
window->secondary_window_style = true; window->secondary_window_style = true;
window->layout = false; window->primary = false;
window->jump_history = false; window->jump_history = false;
window->lose_focus_on_escape = true; window->lose_focus_on_escape = true;
} }
@@ -30,7 +30,7 @@ void StatusWindowUpdate() {
ProfileFunction(); ProfileFunction();
Window *status_bar_window = GetWindow(StatusBarWindowID, NULL); Window *status_bar_window = GetWindow(StatusBarWindowID, NULL);
Scratch scratch; Scratch scratch;
BSet main = GetBSet(LastActiveLayoutWindowID); BSet main = GetBSet(PrimaryWindowID);
BSet title = GetBSet(status_bar_window); BSet title = GetBSet(status_bar_window);
title.view->scroll.y = 0; title.view->scroll.y = 0;