Pārlūkot izejas kodu

Nav: Alt doesn't toggle menu layer if other modifiers are held. (#4439)

ocornut 4 gadi atpakaļ
vecāks
revīzija
8fa502ca42
2 mainītis faili ar 15 papildinājumiem un 5 dzēšanām
  1. 1 0
      docs/CHANGELOG.txt
  2. 14 5
      imgui.cpp

+ 1 - 0
docs/CHANGELOG.txt

@@ -72,6 +72,7 @@ Other Changes:
 - Menus: MenuItem() and BeginMenu() are not affected/overlapping when style.SelectableTextAlign is altered.
 - Menus: fix hovering a disabled menu or menu item not closing other menus. (#211)
 - Popups: fix BeginPopup/OpenPopup sequence failing when there are no focused windows. (#4308) [@rokups]
+- Nav: Alt doesn't toggle menu layer if other modifiers are held. (#4439)
 - Nav: Disabled items are not candidate for default focus. (#211, #787)
 - Disabled: disabled items set HoveredId, allowing e.g. HoveredIdTimer to function. (#211, #3419) [@rokups]
 - Disabled: disabled mode more consistently release active id if the active item got disabled. (#211)

+ 14 - 5
imgui.cpp

@@ -9123,9 +9123,15 @@ static void ImGui::NavUpdate()
         if (io.KeyAlt && !io.KeyCtrl)
             io.NavInputs[ImGuiNavInput_KeyMenu_]  = 1.0f;
 
-        // We automatically cancel toggling nav layer when any text has been typed while holding Alt. (See #370)
-        if (io.KeyAlt && !io.KeyCtrl && g.NavWindowingToggleLayer && io.InputQueueCharacters.Size > 0)
-            g.NavWindowingToggleLayer = false;
+        // We cancel toggling nav layer when any text has been typed while holding Alt. (See #370)
+        // We cancel toggling nav layer when other modifiers are pressed. (See #4439)
+        if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard)
+        {
+            if (io.KeyAlt && !io.KeyCtrl && io.InputQueueCharacters.Size > 0)
+                g.NavWindowingToggleLayer = false;
+            if (io.KeyCtrl || io.KeyShift || io.KeySuper)
+                g.NavWindowingToggleLayer = false;
+        }
 
         #undef NAV_MAP_KEY
     }
@@ -9643,7 +9649,7 @@ static void ImGui::NavUpdateWindowing()
         {
             g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow;
             g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
-            g.NavWindowingToggleLayer = start_windowing_with_keyboard ? false : true;
+            g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer
             g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad;
         }
 
@@ -9687,8 +9693,11 @@ static void ImGui::NavUpdateWindowing()
 
     // Keyboard: Press and Release ALT to toggle menu layer
     // FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of backend clearing releases all keys on ALT-TAB
-    if (IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed))
+    if (IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed) && g.IO.KeyMods == ImGuiKeyModFlags_Alt)
+    {
         g.NavWindowingToggleLayer = true;
+        g.NavInputSource = ImGuiInputSource_Keyboard;
+    }
     if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released))
         if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev))
             apply_toggle_layer = true;