diff --git a/data/init.lua b/data/init.lua index 8f0c513..30a9262 100644 --- a/data/init.lua +++ b/data/init.lua @@ -323,10 +323,6 @@ function MatchGotoBuild(s, meta) end function MatchExec(s, meta) - if meta ~= "exec" then - return nil - end - if s:match(".exe$") or s:match(".bat$") or s:match(".sh$") then return {kind = "exec_console", cmd = s, working_dir = GetMainDir()} end diff --git a/src/backup/todo.txt b/src/backup/todo.txt index dc6db64..4ac6494 100644 --- a/src/backup/todo.txt +++ b/src/backup/todo.txt @@ -13,7 +13,6 @@ Needs to change: - How to design Command view? - How to design popup view (input field)? - How to design search view? or search and replace view? -- Window management, splitting, GC Things I like: - Basic editing diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 7ffdecf..75f9cfd 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -642,7 +642,7 @@ void SaveBuffer(Buffer *buffer) { } } void Command_Save() { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); SaveBuffer(set.buffer); } int Lua_Save(lua_State *L) { @@ -889,7 +889,7 @@ void ReopenBuffer(Buffer *buffer) { } void Command_Reopen() { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); ReopenBuffer(set.buffer); ActiveWindow = set.window->id; } @@ -917,7 +917,7 @@ void New(Window *window, String name = "") { } void Command_New(String name = "") { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); New(main.window, name); } @@ -950,7 +950,7 @@ void NewDir(Window *window, String name = "") { int Lua_NewDir(lua_State *L) { String name = lua_tostring(L, 1); lua_pop(L, 1); - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); NewDir(main.window, name); return 0; } @@ -996,7 +996,7 @@ void ListFilesRecursive(Buffer *buffer, String dir) { } void Command_ListCode(String dir = WorkDir) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); JumpGarbageBuffer(&main); ListFilesRecursive(main.buffer, dir); main.view->fuzzy_search = true; @@ -1021,7 +1021,7 @@ View *Command_ExecHidden(String buffer_name, String cmd, String working_dir) { } BSet Command_Exec(String cmd, String working_dir, bool set_active = true) { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); if (set_active) ActiveWindow = set.window->id; JumpGarbageBuffer(&set); Exec(set.view->id, true, cmd, working_dir); @@ -1080,7 +1080,7 @@ BSet Command_Open(Window *window, String path, String meta, bool set_active = tr } BSet Command_Open(String path, String meta) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); main = Command_Open(main.window, path, meta); return main; } @@ -1119,7 +1119,7 @@ int Lua_Cmd(lua_State *L) { String kind = lua_tostring(L, -1); lua_pop(L, 1); - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); if (kind == "console") { BSet set = GetConsoleSet(); Command_SelectRangeOneCursor(set.view, MakeRange(set.buffer->len)); @@ -1141,7 +1141,7 @@ int Lua_Cmd(lua_State *L) { } void Command_ListBuffers() { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); ActiveWindow = main.window->id; JumpGarbageBuffer(&main); For(Buffers) { @@ -1158,7 +1158,7 @@ int Lua_ListBuffers(lua_State *L) { } void Command_ListViews() { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); ActiveWindow = main.window->id; JumpGarbageBuffer(&main); For(Views) { @@ -1200,7 +1200,7 @@ void SetProjectFile(Buffer *buffer) { } int Lua_SetProjectFile(lua_State *L) { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); SetProjectFile(set.buffer); return 0; } @@ -1208,7 +1208,7 @@ int Lua_SetProjectFile(lua_State *L) { int Lua_SetWorkDir(lua_State *L) { String dir = lua_tostring(L, -1); if (dir.len == 0) { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); WorkDir = ChopLastSlash(set.buffer->name); } else { WorkDir = dir; @@ -1217,7 +1217,7 @@ int Lua_SetWorkDir(lua_State *L) { } int Lua_ListCommands(lua_State *L) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); Command_BeginJump(&main); for (int i = 0; LuaFunctions[i].name != NULL; i += 1) { Command_Appendf(main.view, "%20s() ", LuaFunctions[i].name); diff --git a/src/text_editor/commands_bindings.cpp b/src/text_editor/commands_bindings.cpp index 7f7435d..d329d76 100644 --- a/src/text_editor/commands_bindings.cpp +++ b/src/text_editor/commands_bindings.cpp @@ -266,7 +266,7 @@ void OnCommand(Event event) { } if (CtrlPress(SDLK_W)) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); main.window->kill = true; } @@ -308,7 +308,7 @@ void OnCommand(Event event) { } } - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); BSet active = GetActiveSet(); Int buffer_change_id = active.buffer->change_id; @@ -529,6 +529,11 @@ void OnCommand(Event event) { } } + if (CtrlPress(SDLK_F)) { + Window *window = GetWindow(SearchBarWindowID); + window->visible = !window->visible; + } + // if (CtrlPress(SDLK_N)) { // Command_New(); // } diff --git a/src/text_editor/generated_config.cpp b/src/text_editor/generated_config.cpp index 7dddf3a..48eab6d 100644 --- a/src/text_editor/generated_config.cpp +++ b/src/text_editor/generated_config.cpp @@ -324,10 +324,6 @@ function MatchGotoBuild(s, meta) end function MatchExec(s, meta) - if meta ~= "exec" then - return nil - end - if s:match(".exe$") or s:match(".bat$") or s:match(".sh$") then return {kind = "exec_console", cmd = s, working_dir = GetMainDir()} end diff --git a/src/text_editor/lua_api.cpp b/src/text_editor/lua_api.cpp index f652a61..e8ebfaf 100644 --- a/src/text_editor/lua_api.cpp +++ b/src/text_editor/lua_api.cpp @@ -24,7 +24,7 @@ int Lua_Print(lua_State *L) { } int Lua_Kill(lua_State *L) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); KillProcess(main.view); return 0; } @@ -52,7 +52,7 @@ int Lua_BufferExists(lua_State *L) { int Lua_GetSelection(lua_State *L) { Scratch scratch; - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); String16 string16 = GetString(main.buffer, main.view->carets[0].range); String string = ToString(scratch, string16); lua_pushlstring(L, string.data, string.len); @@ -61,7 +61,7 @@ int Lua_GetSelection(lua_State *L) { int Lua_GetEntireBuffer(lua_State *L) { Scratch scratch; - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); String16 string16 = GetString(main.buffer); String string = ToString(scratch, string16); lua_pushlstring(L, string.data, string.len); @@ -76,13 +76,13 @@ int Lua_GetClipboard(lua_State *L) { } int Lua_GetFilename(lua_State *L) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); lua_pushlstring(L, main.buffer->name.data, main.buffer->name.len); return 1; } int Lua_GetLine(lua_State *L) { - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); Caret caret = main.view->carets[0]; Int front = GetFront(caret); Int line = PosToLine(main.buffer, front); @@ -117,7 +117,7 @@ int Lua_GetMainDir(lua_State *L) { } int Lua_KillWindow(lua_State *L) { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); set.window->kill = true; return 0; } diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 4d661ce..854c708 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -15,9 +15,13 @@ WindowID DebugWindowID; ViewID DebugViewID; BufferID DebugBufferID; -WindowID BarWindowID; +WindowID StatusBarWindowID; +WindowID SearchBarWindowID; +ViewID SearchViewID; +BufferID SearchBufferID; WindowID ActiveWindow; +WindowID LastActiveLayoutWindowID; WindowID ScrollbarSelected = {-1}; WindowID DocumentSelected = {-1}; WindowID ResizerSelected = {-1}; @@ -151,40 +155,13 @@ Window *CreateWind() { w->layout = true; w->draw_scrollbar = StyleDrawScrollbar; w->draw_line_numbers = StyleDrawLineNumbers; + w->draw_line_highlight = true; w->id = AllocWindowID(w); w->weight = 1.0; Add(&Windows, w); return w; } -void DestroyWindow(Window *window) { - // Allocator allocator = GetSystemAllocator(); - // window->kill = true; - // Window *split = window; - // if (split && split->parent) { - // Assert(split->kind == WindowSplitKind_Window); - - // WindowSplit *p = split->parent; - // WindowSplit *pp = p->parent; - // WindowSplit *other = p->left == split ? p->right : p->left; - - // if (pp) { - // if (pp->left == p) { - // pp->left = other; - // } else { - // pp->right = other; - // } - // other->parent = pp; - // } - - // Dealloc(allocator, p); - // Dealloc(allocator, split); - // } - - - // Dealloc(allocator, window); -} - View *CreateView(BufferID active_buffer) { Allocator al = GetSystemAllocator(); View *view = AllocType(al, View); @@ -265,21 +242,13 @@ BSet GetBSet(WindowID window_id) { return result; } -BSet GetMainSet(Window *window) { - BSet result = GetBSet(window); - return result; -} - BSet GetActiveSet() { Window *window = GetWindow(ActiveWindow); return GetBSet(window); } -BSet GetActiveMainSet() { - Window *window = GetWindow(ActiveWindow); - // if (window->is_title_bar) window = GetWindow(window->title_bar_window); - // if (window->is_search_bar) window = GetWindow(window->search_bar_window); - return GetBSet(window); +BSet GetLastActiveLayoutSet() { + return GetBSet(LastActiveLayoutWindowID); } BSet GetConsoleSet() { @@ -291,7 +260,7 @@ BSet GetConsoleSet() { } String Command_GetFilename() { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); return set.buffer->name; } @@ -301,7 +270,7 @@ String GetDir(Buffer *buffer) { } String Command_GetMainDir() { - BSet set = GetActiveMainSet(); + BSet set = GetLastActiveLayoutSet(); String name = ChopLastSlash(set.buffer->name); return name; } @@ -437,6 +406,14 @@ bool BufferIsReferenced(BufferID buffer_id) { void GarbageCollect() { Allocator sys_allocator = GetSystemAllocator(); + + if (ActiveWindow.id != LastActiveLayoutWindowID.id) { + Window *window = GetWindow(ActiveWindow); + if (window->layout) { + LastActiveLayoutWindowID = ActiveWindow; + } + } + For(Buffers) { if (it->file_mod_time) { int64_t new_file_mod_time = GetFileModTime(it->name); @@ -484,8 +461,8 @@ void GarbageCollect() { IterRemove(Windows) { IterRemovePrepare(Windows); if (it->kill) { - DestroyWindow(it); - remove_item = true; - } + Dealloc(sys_allocator, it); + remove_item = true; + } } } diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index 14cbce9..dc87eee 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -249,8 +249,9 @@ void Update(Event event) { UpdateProcesses(); CoUpdate(&event); ReloadLuaConfigs(); - CallLuaOnUpdate(&event); + StatusBarUpdate(); UpdateDebugBuffer(); + CallLuaOnUpdate(&event); GarbageCollect(); For(IterateInReverse(&order)) { diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index e33b21e..70a27dd 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -16,14 +16,6 @@ struct View { String16 prev_search_line; }; -enum WindowKind { - WindowKind_None, - WindowKind_Root, - WindowKind_Leaf, - WindowKind_SplitHori, - WindowKind_SplitVerti, -}; - struct Window { WindowID id; ViewID active_view; @@ -34,15 +26,17 @@ struct Window { Rect2I line_numbers_rect; Rect2I resizer_rect; - Font *font; + Font *font; double mouse_scroller_offset; int z; double weight; - Int offset_resizer; + Int status_bar_last_buffer_change_id; struct { bool draw_scrollbar : 1; bool draw_line_numbers : 1; + bool draw_darker : 1; + bool draw_line_highlight : 1; bool visible : 1; bool layout : 1; bool kill : 1; diff --git a/src/text_editor/title_bar.cpp b/src/text_editor/title_bar.cpp index b7e56f1..2d957ca 100644 --- a/src/text_editor/title_bar.cpp +++ b/src/text_editor/title_bar.cpp @@ -5,7 +5,7 @@ void UpdateDebugBuffer() { View *view = GetView(window->active_view); if (view->active_buffer.id == buffer->id.id) return; - BSet main = GetActiveMainSet(); + BSet main = GetLastActiveLayoutSet(); 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); @@ -40,3 +40,74 @@ void UpdateDebugBuffer() { RawAppendf(buffer, "int changed_on_disk = %d\n", main.buffer->changed_on_disk); RawAppendf(buffer, "int garbage = %d\n", main.buffer->garbage); } + +void StatusBarUpdate() { + Window *status_bar_window = GetWindow(StatusBarWindowID, NULL); + if (status_bar_window == NULL) { + return; + } + + Scratch scratch; + BSet main = GetLastActiveLayoutSet(); + BSet title = GetBSet(status_bar_window); + title.view->scroll.y = 0; + + String16 buffer_string = GetString(title.buffer); + Range replace_range = {0, title.buffer->len}; + bool found_separator = Seek(buffer_string, u" |", &replace_range.max); + + // Parse the title and line + if (title.window->id == ActiveWindow) { + if (title.buffer->change_id == title.window->status_bar_last_buffer_change_id) { + return; + } + String16 buffer_name = GetString(title.buffer, replace_range); + buffer_name = Skip(buffer_name, 1); + buffer_name = Trim(buffer_name); + + Int column = ChopNumber(&buffer_name); + if (column == -1) return; + + Int line = ChopNumber(&buffer_name); + if (line == -1) { + line = column; + column = 0; + } + + Int buffer_pos = XYToPos(main.buffer, {column, line}); + Caret &caret = main.view->carets[0]; + if (GetFront(caret) != buffer_pos) { + caret = MakeCaret(buffer_pos); + } + title.window->status_bar_last_buffer_change_id = title.buffer->change_id; + return; + } + + Caret caret = main.view->carets[0]; + XY xy = PosToXY(main.buffer, GetFront(caret)); + + // add separator at the end of buffer + if (!found_separator) { + Command_SelectRangeOneCursor(title.view, GetBufferEndAsRange(title.buffer)); + Array edits = Command_ReplaceEx(scratch, title.view, u" |"); + } + + + // replace data up to separator with filename and stuff + const char *reopen = main.buffer->changed_on_disk ? " Reopen()" : ""; + String s = Format(scratch, "# %S:%lld:%lld%s", main.buffer->name, (long long)xy.line + 1ll, (long long)xy.col + 1ll, reopen); + For (ActiveProcesses) { + if (it.view_id == main.view->id.id) { + s = Format(scratch, "%S %lld Kill()", s, (long long)it.id); + } + } + + String16 string = ToString16(scratch, s); + String16 string_to_replace = GetString(title.buffer, replace_range); + if (string_to_replace != string) { + Command_SelectRangeOneCursor(title.view, replace_range); + Array edits = Command_ReplaceEx(scratch, title.view, string); + } + + Command_SelectRangeOneCursor(title.view, MakeRange(0)); +} \ No newline at end of file diff --git a/src/text_editor/window.cpp b/src/text_editor/window.cpp index 6db183b..c0fec81 100644 --- a/src/text_editor/window.cpp +++ b/src/text_editor/window.cpp @@ -40,18 +40,37 @@ void InitWindows() { } } - // BAR at the bottom + // SEARCH BAR { Window *window = CreateWind(); - BarWindowID = window->id; + SearchBarWindowID = window->id; + Buffer *buffer = CreateBuffer(SysAllocator, "search_bar"); + SearchBufferID = buffer->id; + View *view = CreateView(buffer->id); + SearchViewID = view->id; + window->active_view = view->id; + window->draw_line_numbers = false; + window->draw_scrollbar = false; + window->draw_darker = true; + window->draw_line_highlight = false; + window->layout = false; + window->visible = false; + } + + // STATUS BAR at the bottom + { + Window *window = CreateWind(); + StatusBarWindowID = window->id; + Buffer *buffer = CreateBuffer(SysAllocator, "status_bar"); + View *view = CreateView(buffer->id); + window->active_view = view->id; + buffer->no_history = true; window->font = &SecondaryFont; window->draw_line_numbers = false; window->draw_scrollbar = false; + window->draw_line_highlight = false; + window->draw_darker = true; window->layout = false; - Buffer *buffer = CreateBuffer(SysAllocator, "bar"); - buffer->no_history = true; - View *view = CreateView(buffer->id); - window->active_view = view->id; } // DEBUG WINDOW @@ -101,11 +120,20 @@ void LayoutWindows(int16_t wx, int16_t wy) { // bar at the bottom { - Window *n = GetWindow(BarWindowID); + Window *n = GetWindow(StatusBarWindowID); Int barsize = GetTitleBarSize(n); n->document_rect = n->total_rect = CutBottom(&screen_rect, barsize); } + // search bar + { + Window *n = GetWindow(SearchBarWindowID); + if (n->visible) { + Int barsize = GetTitleBarSize(n); + n->document_rect = n->total_rect = CutBottom(&screen_rect, barsize); + } + } + // floating debug window { Window *n = GetWindow(DebugWindowID); @@ -119,26 +147,26 @@ void LayoutWindows(int16_t wx, int16_t wy) { } // Column layout - if (1) { - Int c = 0; - double size = WindowCalcEvenResizerValue(wx, &c); - if (c == 0) { - return; + Int c = 0; + double size = WindowCalcEvenResizerValue(wx, &c); + if (c == 0) { + return; + } + + int i = 0; + ForItem(n, Windows) { + if (!n->layout) { + continue; } - int i = 0; - ForItem(n, Windows) { - if (!n->layout) { - continue; - } - - n->total_rect = n->document_rect = CutLeft(&screen_rect, (Int)(size * n->weight)); - if (i != (c - 1)) { - Int resizer_size = (Int)(PrimaryFont.char_spacing*0.5f); - n->resizer_rect = CutRight(&n->document_rect, resizer_size); - } - CalcNiceties(n); - i += 1; + n->total_rect = n->document_rect = CutLeft(&screen_rect, (Int)(size * n->weight)); + if (i != (c - 1)) { + Int resizer_size = (Int)(PrimaryFont.char_spacing*0.5f); + n->resizer_rect = CutRight(&n->document_rect, resizer_size); + } else { + n->resizer_rect = {}; } + CalcNiceties(n); + i += 1; } } \ No newline at end of file diff --git a/src/text_editor/window_draw.cpp b/src/text_editor/window_draw.cpp index 315ff67..7ab9e22 100644 --- a/src/text_editor/window_draw.cpp +++ b/src/text_editor/window_draw.cpp @@ -46,7 +46,7 @@ void DrawVisibleText(Window *window, Color tint) { Rect2I visible = GetVisibleCells(window); for (Int line_index = visible.min.y; line_index < visible.max.y && line_index >= 0 && line_index < buffer->line_starts.len; line_index += 1) { String16 line_string = GetLineString(buffer, line_index); - Vec2I pos = Vec2I{visible.min.x, line_index} * (Int)window->font->line_spacing - view->scroll + window->document_rect.min; + Vec2I pos = Vec2I{visible.min.x, line_index} * Vec2I{(Int)window->font->char_spacing, (Int)window->font->line_spacing} - view->scroll + window->document_rect.min; float text_offset_x = 0; for (Int col_index = visible.min.x; col_index < visible.max.x && col_index >= 0 && col_index < line_string.len; col_index += 1) { @@ -106,6 +106,7 @@ void DrawWindow(Window *window, Event &event) { SetScissor(screen_rect); bool is_active = window->id == ActiveWindow; + bool active_layed_out_doc = window->id == LastActiveLayoutWindowID; Color color_whitespace_during_selection = ColorWhitespaceDuringSelection; Color color_background = ColorBackground; @@ -115,7 +116,24 @@ void DrawWindow(Window *window, Event &event) { Color color_sub_caret = ColorSubCaret; Color color_text_line_numbers = ColorTextLineNumbers; Color color_text = ColorText; + + if (window->draw_darker) { + if (is_active) { + color_background = ColorTitleBarActiveBackground; + } else { + color_background = ColorTitleBarBackground; + } + color_selection = ColorTitleBarSelection; + color_text = ColorTitleBarText; + color_line_highlight = ColorTitleBarBackground; + } + + DrawRect(window->total_rect, color_background); + if (window->draw_darker) { + Rect2I rect = window->total_rect; + DrawRect(CutTop(&rect, 1), ColorResizerOutline); + } Rect2I combined_document_line_number = window->document_rect; if (window->draw_line_numbers) combined_document_line_number.min.x = window->line_numbers_rect.min.x; @@ -170,6 +188,18 @@ void DrawWindow(Window *window, Event &event) { } } } + } else if (window->draw_line_highlight) { + // + // Draw highlight + Int front = GetFront(it); + XY fxy = PosToXY(buffer, front); + Vec2I pos = XYToWorldPos(window, XYLine(fxy.line)); + Vec2I scrolled_pos = pos - view->scroll + window->document_rect.min; + Rect2 rect = { + {(float)window->total_rect.min.x, (float)scrolled_pos.y}, + {(float)window->total_rect.max.x, (float)scrolled_pos.y + (float)window->font->line_spacing} + }; + DrawRect(rect, color_line_highlight); } } @@ -202,16 +232,19 @@ void DrawWindow(Window *window, Event &event) { EndProfileScope(); DrawVisibleText(window, color_text); - BeginProfileScope(draw_carets); - For(view->carets) { - Int front = GetFront(it); - XY fxy = PosToXY(buffer, front); - if (fxy.col >= visible.min.x && fxy.col < visible.max.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) { - bool main_caret = &it == &view->carets.data[0]; - DrawCaret(window, fxy, 0.3f, main_caret ? color_main_caret : color_sub_caret); + // Draw caret "|" markings + if (is_active) { + BeginProfileScope(draw_carets); + For(view->carets) { + Int front = GetFront(it); + XY fxy = PosToXY(buffer, front); + if (fxy.col >= visible.min.x && fxy.col < visible.max.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) { + bool main_caret = &it == &view->carets.data[0]; + DrawCaret(window, fxy, 0.3f, main_caret ? color_main_caret : color_sub_caret); + } } + EndProfileScope(); } - EndProfileScope(); // Draw line numbers if (window->draw_line_numbers) { @@ -245,15 +278,18 @@ void DrawWindow(Window *window, Event &event) { DrawRect(rect, color); } - if (window->z == 1) { + // color the floating object to make it stand out + if (window->z >= 1) { SetScissor(window->total_rect); DrawRect(window->total_rect, {255, 255, 255, 25}); } + // darken the inactive windows + if (!is_active) { + SetScissor(screen_rect); + DrawRect(window->total_rect, ColorInactiveWindow); + } - - SetScissor(screen_rect); - DrawRect(window->total_rect, ColorInactiveWindow); // Draw resizer rect { Rect2I rect = window->resizer_rect;