Drag and Drop, Nav: Disabling navigation arrow keys when drag and drop is active. (#3025)
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index f3d7cbf..765b81d 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -36,6 +36,8 @@
Other Changes:
+- Drag and Drop, Nav: Disabling navigation arrow keys when drag and drop is active. In the docking
+ branch pressing arrow keys while dragging a window from a tab could trigger an assert. (#3025)
- ColorButton: Added ImGuiColorEditFlags_NoBorder flag to remove the border normally enforced
by default for standalone ColorButton.
- InputText: Fixed password fields displaying ASCII spaces as blanks instead of using the '*'
diff --git a/imgui.cpp b/imgui.cpp
index 53b05aa..85ecc45 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -3254,6 +3254,9 @@
// Handle mouse moving window
// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing()
+// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId.
+// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs,
+// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other.
void ImGui::UpdateMouseMovingWindowNewFrame()
{
ImGuiContext& g = *GImGui;
@@ -8999,6 +9002,11 @@
return false;
source_parent_id = window->IDStack.back();
source_drag_active = IsMouseDragging(mouse_button);
+
+ // Disable navigation and key inputs while dragging
+ g.ActiveIdUsingNavDirMask = ~(ImU32)0;
+ g.ActiveIdUsingNavInputMask = ~(ImU32)0;
+ g.ActiveIdUsingKeyInputMask = ~(ImU64)0;
}
else
{