From b474bff6c68423e6b5b6456dc0279e98acbe9848 Mon Sep 17 00:00:00 2001 From: ocornut Date: Fri, 21 May 2021 18:39:17 +0200 Subject: [PATCH] Nav: Fixed single frame CTRL+Tab from properly enabling the menu layer of target window if it doesn't have other active layers. --- docs/CHANGELOG.txt | 2 ++ imgui.cpp | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index c1ecde9a6..ef58aeddd 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -55,6 +55,8 @@ Other Changes: - Nav, InputText: Fixed accidental menu toggling while typing non-ascii characters using AltGR. [@rokups] (#370) - Nav: Fixed using SetItemDefaultFocus() on windows with _NavFlattened flag. (#787) - Nav: Fixed Tabbing initial activation from skipping the first item if it is tabbable through. (#787) +- Nav: Fixed fast CTRL+Tab (where keys are only held for one single frame) from properly enabling the + menu layer of target window if it doesn't have other active layers. - Tables: Expose TableSetColumnEnabled() in public api. (#3935) - Tables: Better preserve widths when columns count changes. (#4046) - Tables: Sharing more memory buffers between tables, reducing general memory footprints. (#3740) diff --git a/imgui.cpp b/imgui.cpp index b1ce008df..44e7d2814 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -9668,8 +9668,13 @@ static void ImGui::NavUpdateWindowing() NavInitWindow(apply_focus_window, false); // If the window has ONLY a menu layer (no main layer), select it directly - // FIXME-NAV: This should be done in NavInit.. or in FocusWindow.. - if (apply_focus_window->DC.NavLayersActiveMask == (1 << ImGuiNavLayer_Menu)) + // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame, + // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since + // the target window as already been previewed once. + // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases, + // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask* + // won't be valid. + if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu)) g.NavLayer = ImGuiNavLayer_Menu; } if (apply_focus_window)