diff --git a/imgui.cpp b/imgui.cpp index 92926ef5..2a7ce38c 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -2664,11 +2664,13 @@ static ImVec2 GetNavInputAmount2d(int stick_no, ImGuiNavReadMode mode, float slo return delta; } -// Window management mode (change focus, move/resize window, jump back and forth to menu layer) +// Window management mode (change focus, move/resize window, toggle menu layer) static void ImGui::NavUpdateWindowing() { ImGuiContext& g = *GImGui; - if (!g.NavWindowingTarget && (IsNavInputPressed(ImGuiNavInput_PadMenu, ImGuiNavReadMode_Pressed) || IsNavInputPressed(ImGuiNavInput_KeyMenu, ImGuiNavReadMode_Pressed))) + bool toggle_layer = false; + + if (!g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_PadMenu, ImGuiNavReadMode_Pressed)) { ImGuiWindow* window = g.NavWindow; if (!window) @@ -2713,7 +2715,7 @@ static void ImGui::NavUpdateWindowing() } } - if (!IsNavInputDown(ImGuiNavInput_PadMenu) && !IsNavInputDown(ImGuiNavInput_KeyMenu)) + if (!IsNavInputDown(ImGuiNavInput_PadMenu)) { // Apply actual focus only when releasing the NavMenu button (until then the window was merely rendered front-most) if (g.NavWindowingTarget && !g.NavWindowingToggleLayer && (!g.NavWindow || g.NavWindowingTarget != g.NavWindow->RootNonPopupWindow)) @@ -2727,20 +2729,27 @@ static void ImGui::NavUpdateWindowing() // Single press toggles NavLayer if (g.NavWindowingToggleLayer && g.NavWindow) - { - if ((g.NavWindow->DC.NavLayerActiveMask & (1 << 1)) == 0 && (g.NavWindow->RootWindow->DC.NavLayerActiveMask & (1 << 1)) != 0) - FocusWindow(g.NavWindow->RootWindow); - g.NavLayer = (g.NavWindow->DC.NavLayerActiveMask & (1 << 1)) ? (g.NavLayer ^ 1) : 0; - g.NavDisableHighlight = false; - g.NavDisableMouseHover = true; - if (g.NavLayer == 0 && g.NavWindow->NavLastIds[0] != 0) - SetNavIDAndMoveMouse(g.NavWindow->NavLastIds[0], g.NavLayer, ImRect()); - else - NavInitWindow(g.NavWindow, true); - } + toggle_layer = true; g.NavWindowingTarget = NULL; } } + + // Keyboard: Press and release ALT to toggle menu + if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && IsNavInputPressed(ImGuiNavInput_KeyMenu, ImGuiNavReadMode_Released)) + toggle_layer = true; + + if (toggle_layer && g.NavWindow) + { + if ((g.NavWindow->DC.NavLayerActiveMask & (1 << 1)) == 0 && (g.NavWindow->RootWindow->DC.NavLayerActiveMask & (1 << 1)) != 0) + FocusWindow(g.NavWindow->RootWindow); + g.NavLayer = (g.NavWindow->DC.NavLayerActiveMask & (1 << 1)) ? (g.NavLayer ^ 1) : 0; + g.NavDisableHighlight = false; + g.NavDisableMouseHover = true; + if (g.NavLayer == 0 && g.NavWindow->NavLastIds[0] != 0) + SetNavIDAndMoveMouse(g.NavWindow->NavLastIds[0], g.NavLayer, ImRect()); + else + NavInitWindow(g.NavWindow, true); + } } // NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.