mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
Debug Log: added InputRouting logging. Made GetKeyChordName() use its own buffer. Fixed debug break in SetShortcutRouting(). (#6798, #2637, #456)
This commit is contained in:
parent
dd0efdc637
commit
2156db7a07
@ -48,6 +48,8 @@ Other changes:
|
|||||||
|
|
||||||
- Fixed SetKeyboardFocusHere() not working when current nav focus is in different scope,
|
- Fixed SetKeyboardFocusHere() not working when current nav focus is in different scope,
|
||||||
regression from 1.90.1 related to code scoping Tab presses to local scope. (#7226) [@bratpilz]
|
regression from 1.90.1 related to code scoping Tab presses to local scope. (#7226) [@bratpilz]
|
||||||
|
- Debug Tools: Metrics: Fixed debug break in SetShortcutRouting() not handling ImGuiMod_Shortcut redirect.
|
||||||
|
- Debug Tools: Debug Log: Added "Input Routing" logging.
|
||||||
- Backends: Vulkan: Fixed vkMapMemory() calls unnecessarily using full buffer size. (#3957)
|
- Backends: Vulkan: Fixed vkMapMemory() calls unnecessarily using full buffer size. (#3957)
|
||||||
- Backends: Vulkan: Fixed handling of ImGui_ImplVulkan_InitInfo::MinAllocationSize field. (#7189, #4238)
|
- Backends: Vulkan: Fixed handling of ImGui_ImplVulkan_InitInfo::MinAllocationSize field. (#7189, #4238)
|
||||||
|
|
||||||
|
25
imgui.cpp
25
imgui.cpp
@ -8146,18 +8146,18 @@ const char* ImGui::GetKeyName(ImGuiKey key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ImGuiMod_Shortcut is translated to either Ctrl or Super.
|
// ImGuiMod_Shortcut is translated to either Ctrl or Super.
|
||||||
const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size)
|
const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (key_chord & ImGuiMod_Shortcut)
|
if (key_chord & ImGuiMod_Shortcut)
|
||||||
key_chord = ConvertShortcutMod(key_chord);
|
key_chord = ConvertShortcutMod(key_chord);
|
||||||
ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s",
|
ImFormatString(g.TempKeychordName, IM_ARRAYSIZE(g.TempKeychordName), "%s%s%s%s%s",
|
||||||
(key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "",
|
(key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "",
|
||||||
(key_chord & ImGuiMod_Shift) ? "Shift+" : "",
|
(key_chord & ImGuiMod_Shift) ? "Shift+" : "",
|
||||||
(key_chord & ImGuiMod_Alt) ? "Alt+" : "",
|
(key_chord & ImGuiMod_Alt) ? "Alt+" : "",
|
||||||
(key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
|
(key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
|
||||||
GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
|
GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
|
||||||
return out_buf;
|
return g.TempKeychordName;
|
||||||
}
|
}
|
||||||
|
|
||||||
// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime)
|
// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime)
|
||||||
@ -8224,6 +8224,7 @@ static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt)
|
|||||||
for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex)
|
for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex)
|
||||||
{
|
{
|
||||||
routing_entry = &rt->Entries[old_routing_idx];
|
routing_entry = &rt->Entries[old_routing_idx];
|
||||||
|
routing_entry->RoutingCurrScore = routing_entry->RoutingNextScore;
|
||||||
routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry
|
routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry
|
||||||
routing_entry->RoutingNext = ImGuiKeyOwner_None;
|
routing_entry->RoutingNext = ImGuiKeyOwner_None;
|
||||||
routing_entry->RoutingNextScore = 255;
|
routing_entry->RoutingNextScore = 255;
|
||||||
@ -8363,7 +8364,7 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|||||||
IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used
|
IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used
|
||||||
|
|
||||||
// [DEBUG] Debug break requested by user
|
// [DEBUG] Debug break requested by user
|
||||||
if (g.DebugBreakInShortcutRouting == key_chord)
|
if (g.DebugBreakInShortcutRouting != 0 && g.DebugBreakInShortcutRouting == ConvertShortcutMod(key_chord))
|
||||||
IM_DEBUG_BREAK();
|
IM_DEBUG_BREAK();
|
||||||
|
|
||||||
if (flags & ImGuiInputFlags_RouteUnlessBgFocused)
|
if (flags & ImGuiInputFlags_RouteUnlessBgFocused)
|
||||||
@ -8371,9 +8372,13 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|||||||
return false;
|
return false;
|
||||||
// Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this?
|
// Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this?
|
||||||
if (flags & ImGuiInputFlags_RouteAlways)
|
if (flags & ImGuiInputFlags_RouteAlways)
|
||||||
|
{
|
||||||
|
IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, owner_id=0x%08X, flags=%04X) -> always\n", GetKeyChordName(key_chord), owner_id, flags);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags);
|
const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags);
|
||||||
|
IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, owner_id=0x%08X, flags=%04X) -> score %d\n", GetKeyChordName(key_chord), owner_id, flags, score);
|
||||||
if (score == 255)
|
if (score == 255)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -8389,6 +8394,8 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return routing state for CURRENT frame
|
// Return routing state for CURRENT frame
|
||||||
|
if (routing_data->RoutingCurr == routing_id)
|
||||||
|
IMGUI_DEBUG_LOG_INPUTROUTING("--> granting current route\n");
|
||||||
return routing_data->RoutingCurr == routing_id;
|
return routing_data->RoutingCurr == routing_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14350,6 +14357,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
{
|
{
|
||||||
ImGuiDebugAllocInfo* info = &g.DebugAllocInfo;
|
ImGuiDebugAllocInfo* info = &g.DebugAllocInfo;
|
||||||
Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount);
|
Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount);
|
||||||
|
if (SmallButton("GC now")) { g.GcCompactAll = true; }
|
||||||
Text("Recent frames with allocations:");
|
Text("Recent frames with allocations:");
|
||||||
int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf);
|
int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf);
|
||||||
for (int n = buf_size - 1; n >= 0; n--)
|
for (int n = buf_size - 1; n >= 0; n--)
|
||||||
@ -14437,10 +14445,9 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
|
ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
|
||||||
for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; )
|
for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; )
|
||||||
{
|
{
|
||||||
char key_chord_name[64];
|
|
||||||
ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
|
ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
|
||||||
ImGuiKeyChord key_chord = key | routing_data->Mods;
|
ImGuiKeyChord key_chord = key | routing_data->Mods;
|
||||||
Text("%s: 0x%08X", GetKeyChordName(key_chord, key_chord_name, IM_ARRAYSIZE(key_chord_name)), routing_data->RoutingCurr);
|
Text("%s: 0x%08X (scored %d)", GetKeyChordName(key_chord), routing_data->RoutingCurr, routing_data->RoutingCurrScore);
|
||||||
DebugLocateItemOnHover(routing_data->RoutingCurr);
|
DebugLocateItemOnHover(routing_data->RoutingCurr);
|
||||||
if (g.IO.ConfigDebugIsDebuggerPresent)
|
if (g.IO.ConfigDebugIsDebuggerPresent)
|
||||||
{
|
{
|
||||||
@ -15096,7 +15103,10 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_);
|
ImGuiDebugLogFlags all_enable_flags = ImGuiDebugLogFlags_EventMask_ & ~ImGuiDebugLogFlags_EventInputRouting;
|
||||||
|
CheckboxFlags("All", &g.DebugLogFlags, all_enable_flags);
|
||||||
|
SetItemTooltip("(except InputRouting which is spammy)");
|
||||||
|
|
||||||
ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId);
|
ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId);
|
||||||
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
||||||
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
||||||
@ -15104,6 +15114,7 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
|
|||||||
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
||||||
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
||||||
//ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
//ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
||||||
|
ShowDebugLogFlag("InputRouting", ImGuiDebugLogFlags_EventInputRouting);
|
||||||
|
|
||||||
if (SmallButton("Clear"))
|
if (SmallButton("Clear"))
|
||||||
{
|
{
|
||||||
|
2
imgui.h
2
imgui.h
@ -24,7 +24,7 @@
|
|||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
||||||
#define IMGUI_VERSION "1.90.2 WIP"
|
#define IMGUI_VERSION "1.90.2 WIP"
|
||||||
#define IMGUI_VERSION_NUM 19011
|
#define IMGUI_VERSION_NUM 19012
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -234,6 +234,7 @@ namespace ImStb
|
|||||||
#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
|
#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
|
|
||||||
// Static Asserts
|
// Static Asserts
|
||||||
#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
|
#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
|
||||||
@ -1369,11 +1370,12 @@ struct ImGuiKeyRoutingData
|
|||||||
{
|
{
|
||||||
ImGuiKeyRoutingIndex NextEntryIndex;
|
ImGuiKeyRoutingIndex NextEntryIndex;
|
||||||
ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super.
|
ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super.
|
||||||
|
ImU8 RoutingCurrScore; // [DEBUG] For debug display
|
||||||
ImU8 RoutingNextScore; // Lower is better (0: perfect score)
|
ImU8 RoutingNextScore; // Lower is better (0: perfect score)
|
||||||
ImGuiID RoutingCurr;
|
ImGuiID RoutingCurr;
|
||||||
ImGuiID RoutingNext;
|
ImGuiID RoutingNext;
|
||||||
|
|
||||||
ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; }
|
ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
|
// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
|
||||||
@ -1788,8 +1790,9 @@ enum ImGuiDebugLogFlags_
|
|||||||
ImGuiDebugLogFlags_EventClipper = 1 << 4,
|
ImGuiDebugLogFlags_EventClipper = 1 << 4,
|
||||||
ImGuiDebugLogFlags_EventSelection = 1 << 5,
|
ImGuiDebugLogFlags_EventSelection = 1 << 5,
|
||||||
ImGuiDebugLogFlags_EventIO = 1 << 6,
|
ImGuiDebugLogFlags_EventIO = 1 << 6,
|
||||||
|
ImGuiDebugLogFlags_EventInputRouting = 1 << 7,
|
||||||
|
|
||||||
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO,
|
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting,
|
||||||
ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
|
ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
|
||||||
ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
|
ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
|
||||||
};
|
};
|
||||||
@ -2190,6 +2193,7 @@ struct ImGuiContext
|
|||||||
int WantCaptureKeyboardNextFrame; // "
|
int WantCaptureKeyboardNextFrame; // "
|
||||||
int WantTextInputNextFrame;
|
int WantTextInputNextFrame;
|
||||||
ImVector<char> TempBuffer; // Temporary text buffer
|
ImVector<char> TempBuffer; // Temporary text buffer
|
||||||
|
char TempKeychordName[64];
|
||||||
|
|
||||||
ImGuiContext(ImFontAtlas* shared_font_atlas)
|
ImGuiContext(ImFontAtlas* shared_font_atlas)
|
||||||
{
|
{
|
||||||
@ -3129,7 +3133,7 @@ namespace ImGui
|
|||||||
|
|
||||||
IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
|
IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
|
||||||
inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
|
inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
|
||||||
IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size);
|
IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord);
|
||||||
inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
|
inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
|
||||||
IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
|
IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
|
||||||
IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
|
IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
|
||||||
|
Loading…
Reference in New Issue
Block a user