NextActiveWindowID to fix the bug where ctrl+q would trigger for 2 registered commands and it would work on 2 different active windows

This commit is contained in:
Krzosa Karol
2025-12-27 12:46:46 +01:00
parent 9ae73e5c04
commit b6f3a1ebec
5 changed files with 38 additions and 38 deletions

View File

@@ -221,7 +221,7 @@ void ReportErrorf(const char *fmt, ...) {
View *view = GetView(NullViewID);
if (view) {
Appendf(view, "%S\n", string);
ActiveWindowID = NullWindowID;
NextActiveWindowID = NullWindowID;
}
}
@@ -432,7 +432,7 @@ View *ExecHidden(String buffer_name, String cmd, String working_dir) {
BSet Exec(String cmd, String working_dir, bool set_active = true) {
BSet main = GetBSet(LastActiveLayoutWindowID);
if (set_active) {
ActiveWindowID = main.window->id;
NextActiveWindowID = main.window->id;
}
JumpGarbageBuffer(&main);
Exec(main.view->id, true, cmd, working_dir);
@@ -441,7 +441,7 @@ BSet Exec(String cmd, String working_dir, bool set_active = true) {
BSet ExecBuild(String cmd) {
BSet main = GetBSet(LastActiveLayoutWindowID);
ActiveWindowID = main.window->id;
NextActiveWindowID = main.window->id;
View *view = WindowOpenBufferView(main.window, BuildBuffer->name);
ResetBuffer(BuildBuffer);
Exec(view->id, true, cmd, WorkDir);
@@ -608,7 +608,7 @@ BSet Open(Window *window, String path, String meta, bool set_active = true) {
ResolvedOpen o = ResolveOpen(scratch, path, meta);
if (o.kind == OpenKind_Goto) {
if (set_active) {
ActiveWindowID = set.window->id;
NextActiveWindowID = set.window->id;
}
if (IsDir(o.path)) {
View *view = WindowOpenBufferView(set.window, o.path);
@@ -630,7 +630,7 @@ BSet Open(Window *window, String path, String meta, bool set_active = true) {
UpdateScroll(set.window, true);
} else if (o.kind == OpenKind_Exec) {
if (set_active) {
ActiveWindowID = set.window->id;
NextActiveWindowID = set.window->id;
}
JumpGarbageBuffer(&set);
Exec(set.view->id, true, o.path, GetMainDir());
@@ -674,7 +674,7 @@ void Command_SaveAll() {
void Command_Reopen() {
BSet main = GetBSet(LastActiveLayoutWindowID);
ReopenBuffer(main.buffer);
ActiveWindowID = main.window->id;
NextActiveWindowID = main.window->id;
} RegisterCommand(Command_Reopen, "");
void Command_New() {
@@ -998,7 +998,7 @@ void Command_SelectLeft() {
} RegisterCommand(Command_SelectLeft, "shift-left");
void Command_FocusLeftWindow() {
ActiveWindowID = SwitchWindow(DIR_LEFT)->id;
NextActiveWindowID = SwitchWindow(DIR_LEFT)->id;
} RegisterCommand(Command_FocusLeftWindow, "alt-left");
void Command_MoveLeft() {
@@ -1022,7 +1022,7 @@ void Command_SelectRight() {
} RegisterCommand(Command_SelectRight, "shift-right");
void Command_FocusRightWindow() {
ActiveWindowID = SwitchWindow(DIR_RIGHT)->id;
NextActiveWindowID = SwitchWindow(DIR_RIGHT)->id;
} RegisterCommand(Command_FocusRightWindow, "alt-right");
void Command_MoveRight() {
@@ -1130,13 +1130,13 @@ void Command_CreateCaretOnNextFind() {
} RegisterCommand(Command_CreateCaretOnNextFind, "ctrl-d");
void Command_FocusWindow1() {
ActiveWindowID = GetOverlappingWindow({0,0}, GetWindow(ActiveWindowID))->id;
NextActiveWindowID = GetOverlappingWindow({0,0}, GetWindow(ActiveWindowID))->id;
} RegisterCommand(Command_FocusWindow1, "ctrl-1");
void Command_FocusWindow2() {
Window *first = GetOverlappingWindow({0,0}, GetWindow(ActiveWindowID));
Vec2I p = GetSideOfWindow(first, DIR_RIGHT);
ActiveWindowID = GetOverlappingWindow(p, GetWindow(ActiveWindowID))->id;
NextActiveWindowID = GetOverlappingWindow(p, GetWindow(ActiveWindowID))->id;
} RegisterCommand(Command_FocusWindow2, "ctrl-2");
void Command_FocusWindow3() {
@@ -1146,7 +1146,7 @@ void Command_FocusWindow3() {
if (second) {
Window *third = GetOverlappingWindow(GetSideOfWindow(second, DIR_RIGHT));
if (third) {
ActiveWindowID = third->id;
NextActiveWindowID = third->id;
}
}
}
@@ -1165,15 +1165,12 @@ void Command_ClearCarets() {
if (active.window->layout) {
//
} else {
ActiveWindowID = LastActiveLayoutWindowID;
NextActiveWindowID = LastActiveLayoutWindowID;
}
}
For (Windows) {
if (it->lose_visibility_on_escape && it->visible) {
if (ActiveWindowID == it->id) {
ActiveWindowID = LastActiveLayoutWindowID;
}
it->visible = false;
}
}

View File

@@ -32,6 +32,7 @@ WindowID SearchWindowID;
ViewID SearchViewID;
BufferID SearchBufferID;
WindowID NextActiveWindowID;
WindowID ActiveWindowID;
WindowID LastActiveLayoutWindowID;
WindowID ScrollbarSelected = {-1};

View File

@@ -275,7 +275,7 @@ void OnCommand(Event event) {
}
bool mouse_in_document = AreOverlapping(mouse, it->document_rect);
if (mouse_in_document) {
ActiveWindowID = it->id;
NextActiveWindowID = ActiveWindowID = it->id;
break;
}
}
@@ -525,6 +525,12 @@ void Update(Event event) {
UpdateProcesses();
CoUpdate(&event);
For(IterateInReverse(&order)) {
if (!it->visible) continue;
View *view = GetView(it->active_view);
UpdateScroll(it, !AreEqual(view->main_caret_on_begin_frame, view->carets[0]) && view->update_scroll);
}
// We update it here despite the name to make it sure that all the possible changes are
// included albeit with delayed response. If we did this at the beginning of the frame
// and the DebugWindowUpdated we wouldnt get to know that in the OnCommand.
@@ -533,7 +539,7 @@ void Update(Event event) {
}
{
ProfileScope(WindowEndOfFrameVisibilityAndLastActive);
ProfileScope(UpdateWindows);
For (Windows) {
if (it->jump_history) {
View *view = GetView(it->active_view);
@@ -556,7 +562,7 @@ void Update(Event event) {
}
if (it->sync_visibility_with_focus) {
if (it->id == ActiveWindowID) {
if (it->id == NextActiveWindowID) {
it->visible = true;
} else {
it->visible = false;
@@ -564,22 +570,20 @@ void Update(Event event) {
}
}
Window *window = GetWindow(ActiveWindowID);
if (ActiveWindowID.id != LastActiveLayoutWindowID.id) {
ActiveWindowID = NextActiveWindowID;
Window *window = GetWindow(ActiveWindowID, NULL);
if (window == NULL || window->visible == false) {
ActiveWindowID = NextActiveWindowID = LastActiveLayoutWindowID;
window = GetWindow(ActiveWindowID);
}
if (ActiveWindowID != LastActiveLayoutWindowID) {
if (window->layout) {
LastActiveLayoutWindowID = ActiveWindowID;
}
}
}
For(IterateInReverse(&order)) {
if (!it->visible) continue;
View *view = GetView(it->active_view);
UpdateScroll(it, !AreEqual(view->main_caret_on_begin_frame, view->carets[0]) && view->update_scroll);
}
GarbageCollect();
}

View File

@@ -111,7 +111,7 @@ void CommandWindowUpdate() {
void Command_ShowCommands() {
if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowCommands) {
ActiveWindowID = LastActiveLayoutWindowID;
NextActiveWindowID = LastActiveLayoutWindowID;
return;
}
ProfileFunction();
@@ -119,7 +119,7 @@ void Command_ShowCommands() {
BSet command_bar = GetBSet(CommandWindowID);
command_bar.window->visible = true;
command_bar.window->eval_command = true;
ActiveWindowID = command_bar.window->id;
NextActiveWindowID = command_bar.window->id;
ResetBuffer(command_bar.buffer);
For(CommandFunctions) {
RawAppendf(command_bar.buffer, "\n%S", it.name);
@@ -130,7 +130,7 @@ void Command_ShowCommands() {
void Command_ShowDebugBufferList() {
if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowDebugBufferList) {
ActiveWindowID = LastActiveLayoutWindowID;
NextActiveWindowID = LastActiveLayoutWindowID;
return;
}
ProfileFunction();
@@ -138,7 +138,7 @@ void Command_ShowDebugBufferList() {
BSet command_bar = GetBSet(CommandWindowID);
command_bar.window->visible = true;
command_bar.window->eval_command = false;
ActiveWindowID = command_bar.window->id;
NextActiveWindowID = command_bar.window->id;
ResetBuffer(command_bar.buffer);
For (Buffers) {
RawAppendf(command_bar.buffer, "\n%S", it->name);
@@ -149,7 +149,7 @@ void Command_ShowDebugBufferList() {
void Command_ShowBufferList() {
if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowBufferList) {
ActiveWindowID = LastActiveLayoutWindowID;
NextActiveWindowID = LastActiveLayoutWindowID;
return;
}
ProfileFunction();
@@ -157,7 +157,7 @@ void Command_ShowBufferList() {
BSet command_bar = GetBSet(CommandWindowID);
command_bar.window->visible = true;
command_bar.window->eval_command = false;
ActiveWindowID = command_bar.window->id;
NextActiveWindowID = command_bar.window->id;
ResetBuffer(command_bar.buffer);
For (Buffers) {
if (it->special || it->garbage || it->is_dir) {
@@ -202,7 +202,7 @@ void OpenCommand(BSet active) {
}
if (active.window->eval_command) {
BSet main = GetBSet(LastActiveLayoutWindowID);
ActiveWindowID = main.window->id;
NextActiveWindowID = main.window->id;
EvalCommand(string);
} else {
Open(string);

View File

@@ -41,7 +41,7 @@ void Command_Search() {
}
BSet set = GetBSet(SearchWindowID);
set.window->visible = true;
ActiveWindowID = SearchWindowID;
NextActiveWindowID = SearchWindowID;
SelectEntireBuffer(set.view);
if (string.len > 0) {
Replace(set.view, string);
@@ -98,7 +98,6 @@ void Command_SearchAll() {
SearchAll();
BSet set = GetBSet(SearchWindowID);
set.window->visible = false;
ActiveWindowID = LastActiveLayoutWindowID;
} RegisterCommand(Command_SearchAll, "alt-f3");
@@ -109,7 +108,6 @@ void Command_SearchAllInSearch() {
SearchAll();
BSet set = GetBSet(SearchWindowID);
set.window->visible = false;
ActiveWindowID = LastActiveLayoutWindowID;
} RegisterCommand(Command_SearchAllInSearch, "alt-enter");