mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Merge misc changes from docking branch to reduce small drift.
In particular: - imgui.cpp : move UpdateInputEvents() higher in NewFrame() to match docking + update RenderMouseCursor() to match. - imgui_draw.cpp: ImDrawList::_ResetForNewFrame() change from c807192ab - Backends: SDL2. Add MouseWindowID + change SDL_CaptureMouse() test to match docking branch. Not strictly necessary but aimed at reducing drift because we go on and fork this file. + moved responsability of checking valid names to TabBarGetTabName() to simplify both branches.
This commit is contained in:
		
							
								
								
									
										55
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -1864,7 +1864,7 @@ static const ImU32 GCrc32LookupTable[256] =
 | 
			
		||||
// Known size hash
 | 
			
		||||
// It is ok to call ImHashData on a string with known length but the ### operator won't be supported.
 | 
			
		||||
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
 | 
			
		||||
ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
ImGuiID ImHashData(const void* data_p, size_t data_size, ImGuiID seed)
 | 
			
		||||
{
 | 
			
		||||
    ImU32 crc = ~seed;
 | 
			
		||||
    const unsigned char* data = (const unsigned char*)data_p;
 | 
			
		||||
@@ -1880,7 +1880,7 @@ ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
// - If we reach ### in the string we discard the hash so far and reset to the seed.
 | 
			
		||||
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build)
 | 
			
		||||
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
 | 
			
		||||
ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed)
 | 
			
		||||
{
 | 
			
		||||
    seed = ~seed;
 | 
			
		||||
    ImU32 crc = seed;
 | 
			
		||||
@@ -3374,24 +3374,26 @@ void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCurso
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
 | 
			
		||||
    ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas;
 | 
			
		||||
    for (int n = 0; n < g.Viewports.Size; n++)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
        ImDrawList* draw_list = GetForegroundDrawList(viewport);
 | 
			
		||||
        ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas;
 | 
			
		||||
        // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor.
 | 
			
		||||
        ImVec2 offset, size, uv[4];
 | 
			
		||||
        if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
 | 
			
		||||
        {
 | 
			
		||||
            const ImVec2 pos = base_pos - offset;
 | 
			
		||||
            const float scale = base_scale;
 | 
			
		||||
            ImTextureID tex_id = font_atlas->TexID;
 | 
			
		||||
            draw_list->PushTextureID(tex_id);
 | 
			
		||||
            draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
            draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
            draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[2], uv[3], col_border);
 | 
			
		||||
            draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[0], uv[1], col_fill);
 | 
			
		||||
            draw_list->PopTextureID();
 | 
			
		||||
        }
 | 
			
		||||
        if (!font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
 | 
			
		||||
            continue;
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
        const ImVec2 pos = base_pos - offset;
 | 
			
		||||
        const float scale = base_scale;
 | 
			
		||||
        if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
 | 
			
		||||
            continue;
 | 
			
		||||
        ImDrawList* draw_list = GetForegroundDrawList(viewport);
 | 
			
		||||
        ImTextureID tex_id = font_atlas->TexID;
 | 
			
		||||
        draw_list->PushTextureID(tex_id);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[2], uv[3], col_border);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[0], uv[1], col_fill);
 | 
			
		||||
        draw_list->PopTextureID();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -3886,7 +3888,7 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        // Special handling for calling after Begin() which represent the title bar or tab.
 | 
			
		||||
        // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case.
 | 
			
		||||
        // When the window is skipped/collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case.
 | 
			
		||||
        if (g.LastItemData.ID == window->MoveId && window->WriteAccessed)
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -4353,6 +4355,11 @@ void ImGui::NewFrame()
 | 
			
		||||
    g.FramerateSecPerFrameCount = ImMin(g.FramerateSecPerFrameCount + 1, IM_ARRAYSIZE(g.FramerateSecPerFrame));
 | 
			
		||||
    g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)g.FramerateSecPerFrameCount)) : FLT_MAX;
 | 
			
		||||
 | 
			
		||||
    // Process input queue (trickle as many events as possible), turn events into writes to IO structure
 | 
			
		||||
    g.InputEventsTrail.resize(0);
 | 
			
		||||
    UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue);
 | 
			
		||||
 | 
			
		||||
    // Update viewports (after processing input queue, so io.MouseHoveredViewport is set)
 | 
			
		||||
    UpdateViewportsNewFrame();
 | 
			
		||||
 | 
			
		||||
    // Setup current font and draw list shared data
 | 
			
		||||
@@ -4474,10 +4481,6 @@ void ImGui::NewFrame()
 | 
			
		||||
    //if (g.IO.AppFocusLost)
 | 
			
		||||
    //    ClosePopupsExceptModals();
 | 
			
		||||
 | 
			
		||||
    // Process input queue (trickle as many events as possible)
 | 
			
		||||
    g.InputEventsTrail.resize(0);
 | 
			
		||||
    UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue);
 | 
			
		||||
 | 
			
		||||
    // Update keyboard input state
 | 
			
		||||
    UpdateKeyboardInputs();
 | 
			
		||||
 | 
			
		||||
@@ -5777,7 +5780,7 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
 | 
			
		||||
    if (window->Collapsed)
 | 
			
		||||
    {
 | 
			
		||||
        // Title bar only
 | 
			
		||||
        float backup_border_size = style.FrameBorderSize;
 | 
			
		||||
        const float backup_border_size = style.FrameBorderSize;
 | 
			
		||||
        g.Style.FrameBorderSize = window->WindowBorderSize;
 | 
			
		||||
        ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
 | 
			
		||||
        RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
 | 
			
		||||
@@ -9983,7 +9986,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
 | 
			
		||||
    const int current_stack_size = g.BeginPopupStack.Size;
 | 
			
		||||
 | 
			
		||||
    if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup)
 | 
			
		||||
        if (IsPopupOpen(0u, ImGuiPopupFlags_AnyPopupId))
 | 
			
		||||
        if (IsPopupOpen((ImGuiID)0, ImGuiPopupFlags_AnyPopupId))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
    ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
 | 
			
		||||
@@ -13977,7 +13980,7 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
 | 
			
		||||
        p += ImFormatString(p, buf_end - p, "%s'%s'",
 | 
			
		||||
            tab_n > 0 ? ", " : "", (tab->NameOffset != -1) ? TabBarGetTabName(tab_bar, tab) : "???");
 | 
			
		||||
            tab_n > 0 ? ", " : "", TabBarGetTabName(tab_bar, tab));
 | 
			
		||||
    }
 | 
			
		||||
    p += ImFormatString(p, buf_end - p, (tab_bar->Tabs.Size > 3) ? " ... }" : " } ");
 | 
			
		||||
    if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); }
 | 
			
		||||
@@ -13999,7 +14002,7 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
 | 
			
		||||
            if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2);
 | 
			
		||||
            if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine();
 | 
			
		||||
            Text("%02d%c Tab 0x%08X '%s' Offset: %.2f, Width: %.2f/%.2f",
 | 
			
		||||
                tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? TabBarGetTabName(tab_bar, tab) : "???", tab->Offset, tab->Width, tab->ContentWidth);
 | 
			
		||||
                tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, TabBarGetTabName(tab_bar, tab), tab->Offset, tab->Width, tab->ContentWidth);
 | 
			
		||||
            PopID();
 | 
			
		||||
        }
 | 
			
		||||
        TreePop();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user