mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +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:
		@@ -48,6 +48,8 @@ Other changes:
 | 
			
		||||
 | 
			
		||||
- 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]
 | 
			
		||||
- 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 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.
 | 
			
		||||
const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size)
 | 
			
		||||
const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (key_chord & ImGuiMod_Shortcut)
 | 
			
		||||
        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_Shift) ? "Shift+" : "",
 | 
			
		||||
        (key_chord & ImGuiMod_Alt) ? "Alt+" : "",
 | 
			
		||||
        (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
 | 
			
		||||
        GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
 | 
			
		||||
    return out_buf;
 | 
			
		||||
    return g.TempKeychordName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
        {
 | 
			
		||||
            routing_entry = &rt->Entries[old_routing_idx];
 | 
			
		||||
            routing_entry->RoutingCurrScore = routing_entry->RoutingNextScore;
 | 
			
		||||
            routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry
 | 
			
		||||
            routing_entry->RoutingNext = ImGuiKeyOwner_None;
 | 
			
		||||
            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
 | 
			
		||||
 | 
			
		||||
    // [DEBUG] Debug break requested by user
 | 
			
		||||
    if (g.DebugBreakInShortcutRouting == key_chord)
 | 
			
		||||
    if (g.DebugBreakInShortcutRouting != 0 && g.DebugBreakInShortcutRouting == ConvertShortcutMod(key_chord))
 | 
			
		||||
        IM_DEBUG_BREAK();
 | 
			
		||||
 | 
			
		||||
    if (flags & ImGuiInputFlags_RouteUnlessBgFocused)
 | 
			
		||||
@@ -8371,9 +8372,13 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
 | 
			
		||||
            return false;
 | 
			
		||||
    // Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this?
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
@@ -8389,6 +8394,8 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -14350,6 +14357,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiDebugAllocInfo* info = &g.DebugAllocInfo;
 | 
			
		||||
        Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount);
 | 
			
		||||
        if (SmallButton("GC now")) { g.GcCompactAll = true; }
 | 
			
		||||
        Text("Recent frames with allocations:");
 | 
			
		||||
        int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf);
 | 
			
		||||
        for (int n = buf_size - 1; n >= 0; n--)
 | 
			
		||||
@@ -14437,10 +14445,9 @@ void ImGui::ShowMetricsWindow(bool* p_open)
 | 
			
		||||
                    ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
 | 
			
		||||
                    for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; )
 | 
			
		||||
                    {
 | 
			
		||||
                        char key_chord_name[64];
 | 
			
		||||
                        ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
 | 
			
		||||
                        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);
 | 
			
		||||
                        if (g.IO.ConfigDebugIsDebuggerPresent)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -15096,7 +15103,10 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
 | 
			
		||||
        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("Clipper", ImGuiDebugLogFlags_EventClipper);
 | 
			
		||||
    ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
 | 
			
		||||
@@ -15104,6 +15114,7 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
 | 
			
		||||
    ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
 | 
			
		||||
    ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
 | 
			
		||||
    //ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
 | 
			
		||||
    ShowDebugLogFlag("InputRouting", ImGuiDebugLogFlags_EventInputRouting);
 | 
			
		||||
 | 
			
		||||
    if (SmallButton("Clear"))
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							@@ -24,7 +24,7 @@
 | 
			
		||||
// Library Version
 | 
			
		||||
// (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_NUM   19011
 | 
			
		||||
#define IMGUI_VERSION_NUM   19012
 | 
			
		||||
#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_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_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
 | 
			
		||||
 | 
			
		||||
// Static Asserts
 | 
			
		||||
#define IM_STATIC_ASSERT(_COND)         static_assert(_COND, "")
 | 
			
		||||
@@ -1369,11 +1370,12 @@ struct ImGuiKeyRoutingData
 | 
			
		||||
{
 | 
			
		||||
    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.
 | 
			
		||||
    ImU8                            RoutingCurrScore;   // [DEBUG] For debug display
 | 
			
		||||
    ImU8                            RoutingNextScore;   // Lower is better (0: perfect score)
 | 
			
		||||
    ImGuiID                         RoutingCurr;
 | 
			
		||||
    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.
 | 
			
		||||
@@ -1788,8 +1790,9 @@ enum ImGuiDebugLogFlags_
 | 
			
		||||
    ImGuiDebugLogFlags_EventClipper         = 1 << 4,
 | 
			
		||||
    ImGuiDebugLogFlags_EventSelection       = 1 << 5,
 | 
			
		||||
    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_OutputToTestEngine   = 1 << 21,  // Also send output to Test Engine
 | 
			
		||||
};
 | 
			
		||||
@@ -2190,6 +2193,7 @@ struct ImGuiContext
 | 
			
		||||
    int                     WantCaptureKeyboardNextFrame;       // "
 | 
			
		||||
    int                     WantTextInputNextFrame;
 | 
			
		||||
    ImVector<char>          TempBuffer;                         // Temporary text buffer
 | 
			
		||||
    char                    TempKeychordName[64];
 | 
			
		||||
 | 
			
		||||
    ImGuiContext(ImFontAtlas* shared_font_atlas)
 | 
			
		||||
    {
 | 
			
		||||
@@ -3129,7 +3133,7 @@ namespace ImGui
 | 
			
		||||
 | 
			
		||||
    IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey 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); }
 | 
			
		||||
    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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user