|
@@ -438,6 +438,10 @@ CODE
|
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
|
|
|
|
|
|
|
+ - 2024/06/21 (1.90.9) - BeginChild: added ImGuiChildFlags_NavFlattened as a replacement for the window flag ImGuiWindowFlags_NavFlattened: the feature only ever made sense for BeginChild() anyhow.
|
|
|
|
+ - old: BeginChild("Name", size, 0, ImGuiWindowFlags_NavFlattened);
|
|
|
|
+ - new: BeginChild("Name", size, ImGuiChildFlags_NavFlattened, 0);
|
|
|
|
+ - 2024/06/21 (1.90.9) - io: ClearInputKeys() (first exposed in 1.89.8) doesn't clear mouse data, newly added ClearInputMouse() does.
|
|
- 2024/06/20 (1.90.9) - renamed ImGuiDragDropFlags_SourceAutoExpirePayload to ImGuiDragDropFlags_PayloadAutoExpire.
|
|
- 2024/06/20 (1.90.9) - renamed ImGuiDragDropFlags_SourceAutoExpirePayload to ImGuiDragDropFlags_PayloadAutoExpire.
|
|
- 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
|
|
- 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
|
|
- 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
|
|
- 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
|
|
@@ -1493,7 +1497,7 @@ void ImGuiIO::ClearEventsQueue()
|
|
g.InputEventsQueue.clear();
|
|
g.InputEventsQueue.clear();
|
|
}
|
|
}
|
|
|
|
|
|
-// Clear current keyboard/mouse/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons.
|
|
|
|
|
|
+// Clear current keyboard/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons.
|
|
void ImGuiIO::ClearInputKeys()
|
|
void ImGuiIO::ClearInputKeys()
|
|
{
|
|
{
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
@@ -1501,12 +1505,26 @@ void ImGuiIO::ClearInputKeys()
|
|
#endif
|
|
#endif
|
|
for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++)
|
|
for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++)
|
|
{
|
|
{
|
|
|
|
+ if (ImGui::IsMouseKey((ImGuiKey)(n + ImGuiKey_KeysData_OFFSET)))
|
|
|
|
+ continue;
|
|
KeysData[n].Down = false;
|
|
KeysData[n].Down = false;
|
|
KeysData[n].DownDuration = -1.0f;
|
|
KeysData[n].DownDuration = -1.0f;
|
|
KeysData[n].DownDurationPrev = -1.0f;
|
|
KeysData[n].DownDurationPrev = -1.0f;
|
|
}
|
|
}
|
|
KeyCtrl = KeyShift = KeyAlt = KeySuper = false;
|
|
KeyCtrl = KeyShift = KeyAlt = KeySuper = false;
|
|
KeyMods = ImGuiMod_None;
|
|
KeyMods = ImGuiMod_None;
|
|
|
|
+ InputQueueCharacters.resize(0); // Behavior of old ClearInputCharacters().
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGuiIO::ClearInputMouse()
|
|
|
|
+{
|
|
|
|
+ for (ImGuiKey key = ImGuiKey_Mouse_BEGIN; key < ImGuiKey_Mouse_END; key = (ImGuiKey)(key + 1))
|
|
|
|
+ {
|
|
|
|
+ ImGuiKeyData* key_data = &KeysData[key - ImGuiKey_KeysData_OFFSET];
|
|
|
|
+ key_data->Down = false;
|
|
|
|
+ key_data->DownDuration = -1.0f;
|
|
|
|
+ key_data->DownDurationPrev = -1.0f;
|
|
|
|
+ }
|
|
MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
|
|
MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
|
|
for (int n = 0; n < IM_ARRAYSIZE(MouseDown); n++)
|
|
for (int n = 0; n < IM_ARRAYSIZE(MouseDown); n++)
|
|
{
|
|
{
|
|
@@ -1514,7 +1532,6 @@ void ImGuiIO::ClearInputKeys()
|
|
MouseDownDuration[n] = MouseDownDurationPrev[n] = -1.0f;
|
|
MouseDownDuration[n] = MouseDownDurationPrev[n] = -1.0f;
|
|
}
|
|
}
|
|
MouseWheel = MouseWheelH = 0.0f;
|
|
MouseWheel = MouseWheelH = 0.0f;
|
|
- InputQueueCharacters.resize(0); // Behavior of old ClearInputCharacters().
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// Removed this as it is ambiguous/misleading and generally incorrect to use with the existence of a higher-level input queue.
|
|
// Removed this as it is ambiguous/misleading and generally incorrect to use with the existence of a higher-level input queue.
|
|
@@ -4740,13 +4757,14 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
bool clear_hovered_windows = false;
|
|
bool clear_hovered_windows = false;
|
|
FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
|
|
FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
|
|
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
|
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
|
|
|
+ g.HoveredWindowBeforeClear = g.HoveredWindow;
|
|
|
|
|
|
// Modal windows prevents mouse from hovering behind them.
|
|
// Modal windows prevents mouse from hovering behind them.
|
|
ImGuiWindow* modal_window = GetTopMostPopupModal();
|
|
ImGuiWindow* modal_window = GetTopMostPopupModal();
|
|
if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window)) // FIXME-MERGE: RootWindowDockTree ?
|
|
if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window)) // FIXME-MERGE: RootWindowDockTree ?
|
|
clear_hovered_windows = true;
|
|
clear_hovered_windows = true;
|
|
|
|
|
|
- // Disabled mouse?
|
|
|
|
|
|
+ // Disabled mouse hovering (we don't currently clear MousePos, we could)
|
|
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse)
|
|
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse)
|
|
clear_hovered_windows = true;
|
|
clear_hovered_windows = true;
|
|
|
|
|
|
@@ -5793,7 +5811,7 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, I
|
|
IM_ASSERT(id != 0);
|
|
IM_ASSERT(id != 0);
|
|
|
|
|
|
// Sanity check as it is likely that some user will accidentally pass ImGuiWindowFlags into the ImGuiChildFlags argument.
|
|
// Sanity check as it is likely that some user will accidentally pass ImGuiWindowFlags into the ImGuiChildFlags argument.
|
|
- const ImGuiChildFlags ImGuiChildFlags_SupportedMask_ = ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_FrameStyle;
|
|
|
|
|
|
+ const ImGuiChildFlags ImGuiChildFlags_SupportedMask_ = ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_FrameStyle | ImGuiChildFlags_NavFlattened;
|
|
IM_UNUSED(ImGuiChildFlags_SupportedMask_);
|
|
IM_UNUSED(ImGuiChildFlags_SupportedMask_);
|
|
IM_ASSERT((child_flags & ~ImGuiChildFlags_SupportedMask_) == 0 && "Illegal ImGuiChildFlags value. Did you pass ImGuiWindowFlags values instead of ImGuiChildFlags?");
|
|
IM_ASSERT((child_flags & ~ImGuiChildFlags_SupportedMask_) == 0 && "Illegal ImGuiChildFlags value. Did you pass ImGuiWindowFlags values instead of ImGuiChildFlags?");
|
|
IM_ASSERT((window_flags & ImGuiWindowFlags_AlwaysAutoResize) == 0 && "Cannot specify ImGuiWindowFlags_AlwaysAutoResize for BeginChild(). Use ImGuiChildFlags_AlwaysAutoResize!");
|
|
IM_ASSERT((window_flags & ImGuiWindowFlags_AlwaysAutoResize) == 0 && "Cannot specify ImGuiWindowFlags_AlwaysAutoResize for BeginChild(). Use ImGuiChildFlags_AlwaysAutoResize!");
|
|
@@ -5805,6 +5823,8 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, I
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
if (window_flags & ImGuiWindowFlags_AlwaysUseWindowPadding)
|
|
if (window_flags & ImGuiWindowFlags_AlwaysUseWindowPadding)
|
|
child_flags |= ImGuiChildFlags_AlwaysUseWindowPadding;
|
|
child_flags |= ImGuiChildFlags_AlwaysUseWindowPadding;
|
|
|
|
+ if (window_flags & ImGuiWindowFlags_NavFlattened)
|
|
|
|
+ child_flags |= ImGuiChildFlags_NavFlattened;
|
|
#endif
|
|
#endif
|
|
if (child_flags & ImGuiChildFlags_AutoResizeX)
|
|
if (child_flags & ImGuiChildFlags_AutoResizeX)
|
|
child_flags &= ~ImGuiChildFlags_ResizeX;
|
|
child_flags &= ~ImGuiChildFlags_ResizeX;
|
|
@@ -5883,7 +5903,7 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, I
|
|
const ImGuiID temp_id_for_activation = ImHashStr("##Child", 0, id);
|
|
const ImGuiID temp_id_for_activation = ImHashStr("##Child", 0, id);
|
|
if (g.ActiveId == temp_id_for_activation)
|
|
if (g.ActiveId == temp_id_for_activation)
|
|
ClearActiveID();
|
|
ClearActiveID();
|
|
- if (g.NavActivateId == id && !(window_flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY))
|
|
|
|
|
|
+ if (g.NavActivateId == id && !(child_flags & ImGuiChildFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY))
|
|
{
|
|
{
|
|
FocusWindow(child_window);
|
|
FocusWindow(child_window);
|
|
NavInitWindow(child_window, false);
|
|
NavInitWindow(child_window, false);
|
|
@@ -5909,7 +5929,8 @@ void ImGui::EndChild()
|
|
ImGuiWindow* parent_window = g.CurrentWindow;
|
|
ImGuiWindow* parent_window = g.CurrentWindow;
|
|
ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + child_size);
|
|
ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + child_size);
|
|
ItemSize(child_size);
|
|
ItemSize(child_size);
|
|
- if ((child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY) && !(child_window->Flags & ImGuiWindowFlags_NavFlattened))
|
|
|
|
|
|
+ const bool nav_flattened = (child_window->ChildFlags & ImGuiChildFlags_NavFlattened) != 0;
|
|
|
|
+ if ((child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY) && !nav_flattened)
|
|
{
|
|
{
|
|
ItemAdd(bb, child_window->ChildId);
|
|
ItemAdd(bb, child_window->ChildId);
|
|
RenderNavHighlight(bb, child_window->ChildId);
|
|
RenderNavHighlight(bb, child_window->ChildId);
|
|
@@ -5926,7 +5947,7 @@ void ImGui::EndChild()
|
|
ItemAdd(bb, child_window->ChildId, NULL, ImGuiItemFlags_NoNav);
|
|
ItemAdd(bb, child_window->ChildId, NULL, ImGuiItemFlags_NoNav);
|
|
|
|
|
|
// But when flattened we directly reach items, adjust active layer mask accordingly
|
|
// But when flattened we directly reach items, adjust active layer mask accordingly
|
|
- if (child_window->Flags & ImGuiWindowFlags_NavFlattened)
|
|
|
|
|
|
+ if (nav_flattened)
|
|
parent_window->DC.NavLayersActiveMaskNext |= child_window->DC.NavLayersActiveMaskNext;
|
|
parent_window->DC.NavLayersActiveMaskNext |= child_window->DC.NavLayersActiveMaskNext;
|
|
}
|
|
}
|
|
if (g.HoveredWindow == child_window)
|
|
if (g.HoveredWindow == child_window)
|
|
@@ -6799,7 +6820,7 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
|
|
window->RootWindowPopupTree = parent_window->RootWindowPopupTree;
|
|
window->RootWindowPopupTree = parent_window->RootWindowPopupTree;
|
|
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) // FIXME: simply use _NoTitleBar ?
|
|
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) // FIXME: simply use _NoTitleBar ?
|
|
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
|
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
|
- while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
|
|
|
|
|
|
+ while (window->RootWindowForNav->ChildFlags & ImGuiChildFlags_NavFlattened)
|
|
{
|
|
{
|
|
IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL);
|
|
IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL);
|
|
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
|
|
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
|
|
@@ -6895,9 +6916,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
|
|
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
|
|
flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
|
|
flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
|
|
|
|
|
|
- if (flags & ImGuiWindowFlags_NavFlattened)
|
|
|
|
- IM_ASSERT(flags & ImGuiWindowFlags_ChildWindow);
|
|
|
|
-
|
|
|
|
const int current_frame = g.FrameCount;
|
|
const int current_frame = g.FrameCount;
|
|
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
|
|
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
|
|
window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow);
|
|
window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow);
|
|
@@ -7009,7 +7027,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
}
|
|
}
|
|
|
|
|
|
// Add to focus scope stack
|
|
// Add to focus scope stack
|
|
- PushFocusScope((flags & ImGuiWindowFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID);
|
|
|
|
|
|
+ PushFocusScope((window->ChildFlags & ImGuiChildFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID);
|
|
window->NavRootFocusScopeId = g.CurrentFocusScopeId;
|
|
window->NavRootFocusScopeId = g.CurrentFocusScopeId;
|
|
|
|
|
|
// Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[]
|
|
// Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[]
|
|
@@ -7721,8 +7739,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
{
|
|
{
|
|
// Child window can be out of sight and have "negative" clip windows.
|
|
// Child window can be out of sight and have "negative" clip windows.
|
|
// Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
|
|
// Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
|
|
- IM_ASSERT((flags& ImGuiWindowFlags_NoTitleBar) != 0 || window->DockIsActive);
|
|
|
|
- const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
|
|
|
|
|
|
+ IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0 || window->DockIsActive);
|
|
|
|
+ const bool nav_request = (window->ChildFlags & ImGuiChildFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
|
|
if (!g.LogEnabled && !nav_request)
|
|
if (!g.LogEnabled && !nav_request)
|
|
if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y)
|
|
if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y)
|
|
{
|
|
{
|
|
@@ -9751,6 +9769,9 @@ static void ImGui::UpdateKeyboardInputs()
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiIO& io = g.IO;
|
|
ImGuiIO& io = g.IO;
|
|
|
|
|
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
|
|
|
|
+ io.ClearInputKeys();
|
|
|
|
+
|
|
// Import legacy keys or verify they are not used
|
|
// Import legacy keys or verify they are not used
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
if (io.BackendUsingLegacyKeyArrays == 0)
|
|
if (io.BackendUsingLegacyKeyArrays == 0)
|
|
@@ -10205,6 +10226,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
|
else if (e->Type == ImGuiInputEventType_Key)
|
|
else if (e->Type == ImGuiInputEventType_Key)
|
|
{
|
|
{
|
|
// Trickling Rule: Stop processing queued events if we got multiple action on the same button
|
|
// Trickling Rule: Stop processing queued events if we got multiple action on the same button
|
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
|
|
|
|
+ continue;
|
|
ImGuiKey key = e->Key.Key;
|
|
ImGuiKey key = e->Key.Key;
|
|
IM_ASSERT(key != ImGuiKey_None);
|
|
IM_ASSERT(key != ImGuiKey_None);
|
|
ImGuiKeyData* key_data = GetKeyData(key);
|
|
ImGuiKeyData* key_data = GetKeyData(key);
|
|
@@ -10225,6 +10248,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
|
}
|
|
}
|
|
else if (e->Type == ImGuiInputEventType_Text)
|
|
else if (e->Type == ImGuiInputEventType_Text)
|
|
{
|
|
{
|
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
|
|
|
|
+ continue;
|
|
// Trickling Rule: Stop processing queued events if keys/mouse have been interacted with
|
|
// Trickling Rule: Stop processing queued events if keys/mouse have been interacted with
|
|
if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
|
|
if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
|
|
break;
|
|
break;
|
|
@@ -10269,7 +10294,10 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
|
// - we clear in EndFrame() and not now in order allow application/user code polling this flag
|
|
// - we clear in EndFrame() and not now in order allow application/user code polling this flag
|
|
// (e.g. custom backend may want to clear additional data, custom widgets may want to react with a "canceling" event).
|
|
// (e.g. custom backend may want to clear additional data, custom widgets may want to react with a "canceling" event).
|
|
if (g.IO.AppFocusLost)
|
|
if (g.IO.AppFocusLost)
|
|
|
|
+ {
|
|
g.IO.ClearInputKeys();
|
|
g.IO.ClearInputKeys();
|
|
|
|
+ g.IO.ClearInputMouse();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
ImGuiID ImGui::GetKeyOwner(ImGuiKey key)
|
|
ImGuiID ImGui::GetKeyOwner(ImGuiKey key)
|
|
@@ -10840,7 +10868,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
|
|
window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent);
|
|
window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent);
|
|
if (g.NavId == id || g.NavAnyRequest)
|
|
if (g.NavId == id || g.NavAnyRequest)
|
|
if (g.NavWindow->RootWindowForNav == window->RootWindowForNav)
|
|
if (g.NavWindow->RootWindowForNav == window->RootWindowForNav)
|
|
- if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened))
|
|
|
|
|
|
+ if (window == g.NavWindow || ((window->ChildFlags | g.NavWindow->ChildFlags) & ImGuiChildFlags_NavFlattened))
|
|
NavProcessItem();
|
|
NavProcessItem();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -12340,7 +12368,7 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result)
|
|
// When entering through a NavFlattened border, we consider child window items as fully clipped for scoring
|
|
// When entering through a NavFlattened border, we consider child window items as fully clipped for scoring
|
|
if (window->ParentWindow == g.NavWindow)
|
|
if (window->ParentWindow == g.NavWindow)
|
|
{
|
|
{
|
|
- IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened);
|
|
|
|
|
|
+ IM_ASSERT((window->ChildFlags | g.NavWindow->ChildFlags) & ImGuiChildFlags_NavFlattened);
|
|
if (!window->ClipRect.Overlaps(cand))
|
|
if (!window->ClipRect.Overlaps(cand))
|
|
return false;
|
|
return false;
|
|
cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window
|
|
cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window
|
|
@@ -13812,6 +13840,8 @@ void ImGui::NavUpdateWindowingOverlay()
|
|
SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
|
SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
|
PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f);
|
|
PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f);
|
|
Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings);
|
|
Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings);
|
|
|
|
+ if (g.ContextName[0] != 0)
|
|
|
|
+ SeparatorText(g.ContextName);
|
|
for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--)
|
|
for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--)
|
|
{
|
|
{
|
|
ImGuiWindow* window = g.WindowsFocusOrder[n];
|
|
ImGuiWindow* window = g.WindowsFocusOrder[n];
|