ktsu.ImGuiApp 2.1.7

Prefix Reserved
dotnet add package ktsu.ImGuiApp --version 2.1.7
                    
NuGet\Install-Package ktsu.ImGuiApp -Version 2.1.7
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ktsu.ImGuiApp" Version="2.1.7" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.ImGuiApp" Version="2.1.7" />
                    
Directory.Packages.props
<PackageReference Include="ktsu.ImGuiApp" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ktsu.ImGuiApp --version 2.1.7
                    
#r "nuget: ktsu.ImGuiApp, 2.1.7"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ktsu.ImGuiApp@2.1.7
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ktsu.ImGuiApp&version=2.1.7
                    
Install as a Cake Addin
#tool nuget:?package=ktsu.ImGuiApp&version=2.1.7
                    
Install as a Cake Tool

ktsu.ImGuiApp

A .NET library that provides application scaffolding for Dear ImGui, using Silk.NET and Hexa.NET.ImGui.

NuGet License NuGet Downloads GitHub Stars

Introduction

ImGuiApp is a .NET library that provides application scaffolding for Dear ImGui, using Silk.NET for OpenGL and window management and Hexa.NET.ImGui for the ImGui bindings. It simplifies the creation of ImGui-based applications by abstracting away the complexities of window management, rendering, and input handling.

Features

  • Simple API: Create ImGui applications with minimal boilerplate code
  • Full Integration: Seamless integration with Silk.NET for OpenGL and input handling
  • Window Management: Automatic window state, rendering, and input handling
  • Performance Optimization: Sleep-based throttled rendering with lowest-selection logic when unfocused, idle, or not visible to maximize resource savings
  • PID Frame Limiting: Precision frame rate control using a PID controller with comprehensive auto-tuning capabilities for highly accurate target FPS achievement
  • DPI Awareness: Built-in support for high-DPI displays and scaling
  • Font Management: Flexible font loading system with customization options and dynamic scaling
  • Unicode & Emoji Support: Built-in support for Unicode characters and emojis (enabled by default)
  • Texture Support: Built-in texture management with caching and automatic cleanup for ImGui
  • Debug Logging: Comprehensive debug logging system for troubleshooting crashes and performance issues
  • Context Handling: Automatic OpenGL context change detection and texture reloading
  • Lifecycle Callbacks: Customizable delegate callbacks for application events
  • Menu System: Easy-to-use API for creating application menus
  • Positioning Guards: Offscreen positioning checks to keep windows visible
  • Modern .NET: Supports .NET 9 and newer
  • Active Development: Open-source and actively maintained

Getting Started

Prerequisites

  • .NET 9.0 or later

Installation

Package Manager Console

Install-Package ktsu.ImGuiApp

.NET CLI

dotnet add package ktsu.ImGuiApp

Package Reference

<PackageReference Include="ktsu.ImGuiApp" Version="x.y.z" />

Usage Examples

Basic Application

Create a new class and call ImGuiApp.Start() with your application config:

using ktsu.ImGuiApp;
using Hexa.NET.ImGui;

static class Program
{
    static void Main()
    {
        ImGuiApp.Start(new ImGuiAppConfig()
        {
            Title = "ImGuiApp Demo",
            OnStart = () => { /* Initialization code */ },
            OnUpdate = delta => { /* Logic updates */ },
            OnRender = delta => { ImGui.Text("Hello, ImGuiApp!"); },
            OnAppMenu = () =>
            {
                if (ImGui.BeginMenu("File"))
                {
                    // Menu items
                    if (ImGui.MenuItem("Exit"))
                    {
                        ImGuiApp.Stop();
                    }
                    ImGui.EndMenu();
                }
            }
        });
    }
}

Custom Font Management

Use the resource designer to add font files to your project, then load the fonts:

ImGuiApp.Start(new()
{
    Title = "ImGuiApp Demo",
    OnRender = OnRender,
    Fonts = new Dictionary<string, byte[]>
    {
        { nameof(Resources.MY_FONT), Resources.MY_FONT }
    },
});

Or load the font data manually:

var fontData = File.ReadAllBytes("path/to/font.ttf");
ImGuiApp.Start(new()
{
    Title = "ImGuiApp Demo",
    OnRender = OnRender,
    Fonts = new Dictionary<string, byte[]>
    {
        { "MyFont", fontData }
    },
});

Then apply the font to ImGui using the FontAppearance class:

private static void OnRender(float deltaTime)
{
    ImGui.Text("Hello, I am normal text!");

    using (new FontAppearance("MyFont", 24))
    {
        ImGui.Text("Hello, I am BIG fancy text!");
    }

    using (new FontAppearance(32))
    {
        ImGui.Text("Hello, I am just huge text!");
    }

    using (new FontAppearance("MyFont"))
    {
        ImGui.Text("Hello, I am somewhat fancy!");
    }
}

Unicode and Emoji Support

ImGuiApp automatically includes support for Unicode characters and emojis. This feature is enabled by default, so you can use extended characters without any configuration:

private static void OnRender(float deltaTime)
{
    ImGui.Text("Basic ASCII: Hello World!");
    ImGui.Text("Accented characters: café, naïve, résumé");
    ImGui.Text("Mathematical symbols: ∞ ≠ ≈ ≤ ≥ ± × ÷ ∂ ∑");
    ImGui.Text("Currency symbols: $ € £ ¥ ₹ ₿");
    ImGui.Text("Arrows: ← → ↑ ↓ ↔ ↕");
    ImGui.Text("Emojis (if font supports): 😀 🚀 🌟 💻 🎨 🌈");
}

Note: Character display depends on your font's Unicode support. Most modern fonts include extended Latin characters and symbols, but emojis require specialized fonts.

To disable Unicode support (ASCII only), set EnableUnicodeSupport = false:

ImGuiApp.Start(new()
{
    Title = "ASCII Only App",
    EnableUnicodeSupport = false, // Disables Unicode support
    // ... other settings
});

Texture Management

Load and manage textures with the built-in texture management system:

private static void OnRender(float deltaTime)
{
    // Load texture from file path
    var textureInfo = ImGuiApp.GetOrLoadTexture("path/to/texture.png");

    // Use the texture in ImGui (using the new TextureRef API for Hexa.NET.ImGui)
    ImGui.Image(textureInfo.TextureRef, new Vector2(128, 128));

    // Clean up when done (optional - textures are cached and managed automatically)
    ImGuiApp.DeleteTexture(textureInfo);
}

PID Frame Limiting

ImGuiApp features a sophisticated PID (Proportional-Integral-Derivative) controller for precise frame rate limiting. This system provides highly accurate target FPS control that learns and adapts to your system's characteristics.

Key Features
  • High-Precision Timing: Hybrid sleep system combining Thread.Sleep() for coarse delays with spin-waiting for sub-millisecond accuracy
  • PID Controller: Advanced control algorithm that learns from frame timing errors and dynamically adjusts sleep times
  • Comprehensive Auto-Tuning: Multi-phase tuning procedure that automatically finds optimal PID parameters for your system
  • VSync Independence: Works independently of monitor refresh rates for any target FPS
  • Real-Time Diagnostics: Built-in performance monitoring and tuning visualization
Optimized Defaults

ImGuiApp comes pre-configured with optimal PID parameters derived from comprehensive auto-tuning:

  • Kp: 1.800 - Proportional gain for current error response
  • Ki: 0.048 - Integral gain for accumulated error correction
  • Kd: 0.237 - Derivative gain for predictive adjustment

These defaults provide excellent frame timing accuracy out-of-the-box for most systems.

Configuration

Configure frame limiting through ImGuiAppPerformanceSettings:

ImGuiApp.Start(new ImGuiAppConfig
{
    Title = "PID Frame Limited App",
    OnRender = OnRender,
    PerformanceSettings = new ImGuiAppPerformanceSettings
    {
        EnableThrottledRendering = true,
        FocusedFps = 30.0,           // Target 30 FPS when focused
        UnfocusedFps = 5.0,          // Target 5 FPS when unfocused
        IdleFps = 10.0,              // Target 10 FPS when idle
        NotVisibleFps = 2.0,         // Target 2 FPS when minimized
        EnableIdleDetection = true,
        IdleTimeoutSeconds = 30.0    // Idle after 30 seconds
    }
});
Auto-Tuning Procedure

For maximum accuracy, ImGuiApp includes a comprehensive 3-phase auto-tuning system:

  1. Coarse Phase (8s per test): Tests 24 parameter combinations to find the general optimal range
  2. Fine Phase (12s per test): Tests 25 refined parameters around the best coarse result
  3. Precision Phase (15s per test): Final optimization with 9 precision-focused parameters

Total tuning time: ~12-15 minutes for maximum accuracy

Access auto-tuning through the Debug > Show Performance Monitor menu, which provides:

  • Real-time tuning progress visualization
  • Performance metrics (Average Error, Max Error, Stability, Score)
  • Interactive tuning controls and results display
  • Live FPS graphs showing PID controller performance
Technical Details

The PID controller works by:

  • Measuring actual frame times vs. target frame times
  • Calculating error using smoothed measurements to reduce noise
  • Adjusting sleep duration using PID mathematics: output = Kp×error + Ki×∫error + Kd×Δerror
  • Learning from past performance to minimize future timing errors

The system automatically:

  • Disables VSync to prevent interference with custom frame limiting
  • Pauses throttling during auto-tuning for accurate measurements
  • Uses integral windup prevention to maintain stability
  • Applies high-precision sleep for sub-millisecond timing accuracy

Full Application with Multiple Windows

using ktsu.ImGuiApp;
using Hexa.NET.ImGui;
using System.Numerics;

class Program
{
    private static bool _showDemoWindow = true;
    private static bool _showCustomWindow = true;

    static void Main()
    {
        ImGuiApp.Start(new ImGuiAppConfig
        {
            Title = "Advanced ImGuiApp Demo",
            InitialWindowState = new ImGuiAppWindowState
            {
                Size = new Vector2(1280, 720),
                Pos = new Vector2(100, 100)
            },
            OnStart = OnStart,
            OnUpdate = OnUpdate,
            OnRender = OnRender,
            OnAppMenu = OnAppMenu,
        });
    }

    private static void OnStart()
    {
        // Initialize your application state
        Console.WriteLine("Application started");
    }

    private static void OnUpdate(float deltaTime)
    {
        // Update your application state
        // This runs before rendering each frame
    }

    private static void OnRender(float deltaTime)
    {
        // ImGui demo window
        if (_showDemoWindow)
            ImGui.ShowDemoWindow(ref _showDemoWindow);

        // Custom window
        if (_showCustomWindow)
        {
            ImGui.Begin("Custom Window", ref _showCustomWindow);

            ImGui.Text($"Frame time: {deltaTime * 1000:F2} ms");
            ImGui.Text($"FPS: {1.0f / deltaTime:F1}");

            if (ImGui.Button("Click Me"))
                Console.WriteLine("Button clicked!");

            ImGui.ColorEdit3("Background Color", ref _backgroundColor);

            ImGui.End();
        }
    }

    private static void OnAppMenu()
    {
        if (ImGui.BeginMenu("File"))
        {
            if (ImGui.MenuItem("Exit"))
                ImGuiApp.Stop();

            ImGui.EndMenu();
        }

        if (ImGui.BeginMenu("Windows"))
        {
            ImGui.MenuItem("Demo Window", string.Empty, ref _showDemoWindow);
            ImGui.MenuItem("Custom Window", string.Empty, ref _showCustomWindow);
            ImGui.EndMenu();
        }
    }

    private static Vector3 _backgroundColor = new Vector3(0.45f, 0.55f, 0.60f);
}

API Reference

ImGuiApp Static Class

The main entry point for creating and managing ImGui applications.

Properties
Name Type Description
WindowState ImGuiAppWindowState Gets the current state of the application window
Invoker Invoker Gets an instance to delegate tasks to the window thread
IsFocused bool Gets whether the application window is focused
IsVisible bool Gets whether the application window is visible
IsIdle bool Gets whether the application is currently idle
ScaleFactor float Gets the current DPI scale factor
Methods
Name Parameters Return Type Description
Start ImGuiAppConfig config void Starts the ImGui application with the provided configuration
Stop void Stops the running application
GetOrLoadTexture AbsoluteFilePath path ImGuiAppTextureInfo Loads a texture from file or returns cached texture info if already loaded
TryGetTexture AbsoluteFilePath path, out ImGuiAppTextureInfo textureInfo bool Attempts to get a cached texture by path
DeleteTexture uint textureId void Deletes a texture and frees its resources
DeleteTexture ImGuiAppTextureInfo textureInfo void Deletes a texture and frees its resources (convenience overload)
CleanupAllTextures void Cleans up all loaded textures
SetWindowIcon string iconPath void Sets the window icon using the specified icon file path
EmsToPx float ems int Converts a value in ems to pixels based on current font size
PtsToPx int pts int Converts a value in points to pixels based on current scale factor
UseImageBytes Image<Rgba32> image, Action<byte[]> action void Executes an action with temporary access to image bytes using pooled memory

ImGuiAppConfig Class

Configuration for the ImGui application.

Properties
Name Type Default Description
TestMode bool false Whether the application is running in test mode
Title string "ImGuiApp" The window title
IconPath string "" The file path to the application window icon
InitialWindowState ImGuiAppWindowState new() The initial state of the application window
Fonts Dictionary<string, byte[]> [] Font name to font data mapping
EnableUnicodeSupport bool true Whether to enable Unicode and emoji support
SaveIniSettings bool true Whether ImGui should save window settings to imgui.ini
PerformanceSettings ImGuiAppPerformanceSettings new() Performance settings for throttled rendering
OnStart Action () => { } Called when the application starts
FrameWrapperFactory Func<ScopedAction?> () => null Factory for creating frame wrappers
OnUpdate Action<float> (delta) => { } Called each frame before rendering (param: delta time)
OnRender Action<float> (delta) => { } Called each frame for rendering (param: delta time)
OnAppMenu Action () => { } Called each frame for rendering the application menu
OnMoveOrResize Action () => { } Called when the application window is moved or resized

ImGuiAppPerformanceSettings Class

Configuration for performance optimization and throttled rendering. Uses a sophisticated PID controller with high-precision timing to achieve accurate target frame rates while maintaining system resource efficiency. The system combines Thread.Sleep for coarse delays with spin-waiting for sub-millisecond precision, and automatically disables VSync to prevent interference with custom frame limiting.

Properties
Name Type Default Description
EnableThrottledRendering bool true Enables/disables throttled rendering feature
FocusedFps double 30.0 Target frame rate when the window is focused and active
UnfocusedFps double 5.0 Target frame rate when the window is unfocused
IdleFps double 10.0 Target frame rate when the application is idle (no user input)
NotVisibleFps double 2.0 Target frame rate when the window is not visible (minimized or hidden)
EnableIdleDetection bool true Enables/disables idle detection based on user input
IdleTimeoutSeconds double 30.0 Time in seconds without user input before considering the app idle
Example Usage
ImGuiApp.Start(new ImGuiAppConfig
{
    Title = "My Application",
    OnRender = OnRender,
    PerformanceSettings = new ImGuiAppPerformanceSettings
    {
        EnableThrottledRendering = true,
        FocusedFps = 60.0,           // Custom higher rate when focused
        UnfocusedFps = 15.0,         // Custom rate when unfocused
        IdleFps = 2.0,               // Custom very low rate when idle
        NotVisibleFps = 1.0,         // Custom ultra-low rate when minimized
        EnableIdleDetection = true,
        IdleTimeoutSeconds = 10.0    // Custom idle timeout
    }
    // PID controller uses optimized defaults: Kp=1.8, Ki=0.048, Kd=0.237
    // For fine-tuning, use Debug > Show Performance Monitor > Start Auto-Tuning
});

This feature automatically:

  • Uses a PID controller with optimized defaults for highly accurate frame rate targeting
  • Combines Thread.Sleep with spin-waiting for sub-millisecond timing precision
  • Disables VSync automatically to prevent interference with custom frame limiting
  • Detects when the window loses/gains focus and visibility state (minimized/hidden)
  • Tracks user input (keyboard, mouse movement, clicks, scrolling) for idle detection
  • Evaluates all applicable throttling conditions and selects the lowest frame rate
  • Saves significant CPU and GPU resources without affecting user experience
  • Provides instant transitions between different performance states
  • Uses conservative defaults: 30 FPS focused, 5 FPS unfocused, 10 FPS idle, 2 FPS not visible

The PID controller learns from timing errors and adapts to your system's characteristics, providing much more accurate frame rate control than simple sleep-based methods. The throttling system uses a "lowest wins" approach - if multiple conditions apply (e.g., unfocused + idle), the lowest frame rate is automatically selected for maximum resource savings.

FontAppearance Class

A utility class for applying font styles using a using statement.

Constructors
Constructor Parameters Description
FontAppearance string fontName Creates a font appearance with the named font at default size
FontAppearance float fontSize Creates a font appearance with the default font at the specified size
FontAppearance string fontName, float fontSize Creates a font appearance with the named font at the specified size

ImGuiAppWindowState Class

Represents the state of the application window.

Properties
Name Type Description
Size Vector2 The size of the window
Pos Vector2 The position of the window
LayoutState WindowState The layout state of the window (Normal, Maximized, etc.)

Debug Features

ImGuiApp includes comprehensive debug logging capabilities to help troubleshoot crashes and performance issues:

Debug Logging

The application automatically creates debug logs on the desktop (ImGuiApp_Debug.log) when issues occur. These logs include:

  • Window initialization steps
  • OpenGL context creation
  • Font loading progress
  • Error conditions and exceptions

Debug Menu

When using the OnAppMenu callback, ImGuiApp automatically adds a Debug menu with options to:

  • Show ImGui Demo Window
  • Show ImGui Metrics Window
  • Show Performance Monitor (real-time FPS graphs and throttling visualization)

Performance Monitoring

The core library includes a built-in performance monitor accessible via the debug menu. It provides:

  • Real-time FPS tracking and visualization
  • Throttling state monitoring (focused/unfocused/idle/not visible)
  • Performance testing tips and interactive guidance
  • Historical performance data graphing

Access it through: Debug > Show Performance Monitor

Demo Application

Check out the included demo project to see a comprehensive working example:

  1. Clone or download the repository
  2. Open the solution in Visual Studio (or run dotnet build)
  3. Start the ImGuiAppDemo project to see a feature-rich ImGui application
  4. Explore the different tabs:
    • Unicode & Emojis: Test character rendering with extended Unicode support
    • Widgets & Layout: Comprehensive ImGui widget demonstrations
    • Graphics & Plotting: Custom drawing and data visualization examples
    • Nerd Font Icons: Browse and test various icon sets and glyphs
  5. Use the debug menu to access additional features:
    • Debug > Show Performance Monitor: Real-time FPS graph showing PID controller performance with comprehensive auto-tuning capabilities
    • Debug > Show ImGui Demo: Official ImGui demo window
    • Debug > Show ImGui Metrics: ImGui internal metrics and debugging info

The Performance Monitor includes:

  • Live FPS graphs that visualize frame rate changes as you focus/unfocus the window, let it go idle, or minimize it
  • PID Controller diagnostics showing real-time proportional, integral, and derivative values
  • Comprehensive Auto-Tuning with 3-phase optimization (Coarse, Fine, Precision phases)
  • Performance metrics including Average Error, Max Error, Stability, and composite Score
  • Interactive tuning controls to start/stop optimization and view detailed results

Perfect for seeing both the throttling system and PID controller work in real-time!

Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Please make sure to update tests as appropriate and adhere to the existing coding style.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Versioning

Check the CHANGELOG.md for detailed release notes and version changes.

Acknowledgements

  • Dear ImGui - The immediate mode GUI library
  • Hexa.NET.ImGui - .NET bindings for Dear ImGui
  • Silk.NET - .NET bindings for OpenGL and windowing
  • All contributors and the .NET community for their support

Support

If you encounter any issues or have questions, please open an issue.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.1.7 378 8/8/2025
2.1.6 223 8/8/2025
2.1.5 243 8/7/2025
2.1.4 244 8/7/2025
2.1.3 147 7/30/2025
2.1.2 114 7/30/2025
2.1.1 501 7/24/2025
2.1.0 551 7/23/2025
2.0.12 551 7/22/2025
2.0.11 516 7/22/2025
2.0.10 516 7/22/2025
2.0.8 515 7/22/2025
2.0.7-pre.1 297 7/20/2025
2.0.6 167 7/18/2025
1.12.5-pre.13 140 4/28/2025
1.12.5-pre.12 132 4/28/2025
1.12.5-pre.11 146 4/28/2025
1.12.5-pre.10 139 4/28/2025
1.12.5-pre.9 154 4/28/2025
1.12.5-pre.8 119 4/27/2025
1.12.5-pre.7 117 4/27/2025
1.12.5-pre.6 116 4/27/2025
1.12.5-pre.5 63 4/26/2025
1.12.5-pre.4 72 4/25/2025
1.12.5-pre.3 142 4/8/2025
1.12.5-pre.2 121 4/4/2025
1.12.5-pre.1 126 4/4/2025
1.12.4 781 4/4/2025
1.12.3 297 3/30/2025
1.12.2 596 3/30/2025
1.12.1 133 3/29/2025
1.12.0 188 3/21/2025
1.11.1-pre.1 143 3/20/2025
1.11.0 217 3/19/2025
1.10.0 227 3/17/2025
1.9.0 163 3/15/2025
1.8.1 152 3/15/2025
1.8.0 243 3/14/2025
1.7.1 240 3/12/2025
1.7.0 266 3/12/2025
1.6.1-pre.1 141 3/12/2025
1.6.0 271 3/12/2025
1.5.1-pre.1 149 3/11/2025
1.5.0 344 3/7/2025
1.4.1-pre.3 186 3/6/2025
1.4.1-pre.2 79 2/19/2025
1.4.1-pre.1 91 2/17/2025
1.4.0 386 2/17/2025
1.3.1-pre.1 86 2/11/2025
1.3.0 831 2/7/2025
1.2.1-pre.1 80 2/6/2025
1.2.0 278 2/5/2025
1.1.0 1,066 1/5/2025
1.0.12 216 12/28/2024
1.0.12-pre.11 90 1/4/2025
1.0.12-pre.10 86 1/3/2025
1.0.12-pre.9 88 1/3/2025
1.0.12-pre.8 85 1/3/2025
1.0.12-pre.7 77 1/3/2025
1.0.12-pre.6 81 1/1/2025
1.0.12-pre.5 112 12/31/2024
1.0.12-pre.4 72 12/29/2024
1.0.12-pre.3 76 12/28/2024
1.0.12-pre.2 92 12/27/2024
1.0.12-pre.1 65 12/27/2024
1.0.11-pre.1 70 12/27/2024
1.0.10-pre.1 78 12/27/2024
1.0.9 162 12/26/2024
1.0.8 147 12/26/2024
1.0.7 155 12/25/2024
1.0.6 184 12/24/2024
1.0.5 159 12/23/2024
1.0.4 120 12/23/2024
1.0.3 290 12/19/2024
1.0.2 188 12/17/2024
1.0.1 205 12/13/2024
1.0.0 231 12/9/2024
1.0.0-alpha.76 138 12/7/2024
1.0.0-alpha.75 88 12/6/2024
1.0.0-alpha.74 116 12/5/2024
1.0.0-alpha.73 189 12/2/2024
1.0.0-alpha.72 77 12/2/2024
1.0.0-alpha.71 101 12/1/2024
1.0.0-alpha.70 103 11/30/2024
1.0.0-alpha.69 93 11/29/2024
1.0.0-alpha.68 126 11/28/2024
1.0.0-alpha.67 128 11/26/2024
1.0.0-alpha.66 178 11/21/2024
1.0.0-alpha.65 131 11/20/2024
1.0.0-alpha.64 142 11/17/2024
1.0.0-alpha.63 80 11/15/2024
1.0.0-alpha.62 104 11/14/2024
1.0.0-alpha.61 124 11/13/2024
1.0.0-alpha.60 173 11/7/2024
1.0.0-alpha.59 84 11/7/2024
1.0.0-alpha.58 107 11/6/2024
1.0.0-alpha.57 120 11/5/2024
1.0.0-alpha.56 225 11/2/2024
1.0.0-alpha.55 82 11/1/2024
1.0.0-alpha.54 361 10/18/2024
1.0.0-alpha.53 342 10/9/2024
1.0.0-alpha.52 114 10/8/2024
1.0.0-alpha.51 162 10/5/2024
1.0.0-alpha.50 101 10/4/2024
1.0.0-alpha.49 295 9/25/2024
1.0.0-alpha.48 109 9/24/2024
1.0.0-alpha.47 129 9/21/2024
1.0.0-alpha.46 119 9/19/2024
1.0.0-alpha.45 92 9/19/2024
1.0.0-alpha.44 103 9/19/2024
1.0.0-alpha.43 72 9/19/2024
1.0.0-alpha.42 113 9/19/2024
1.0.0-alpha.41 130 9/18/2024
1.0.0-alpha.40 92 9/18/2024
1.0.0-alpha.39 98 9/18/2024
1.0.0-alpha.38 90 9/18/2024
1.0.0-alpha.37 147 9/18/2024
1.0.0-alpha.36 248 9/14/2024

## v2.1.7 (patch)

Changes since v2.1.6:

- Fix NuGet package source URL in Invoke-NuGetPublish function: Updated the source URL to ensure correct package publishing to packages.ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance .NET CI workflow: Added support for skipped releases in the GitHub Actions workflow. Updated conditions for SonarQube execution, coverage report upload, and Winget manifest updates to account for skipped releases, improving control over the release process. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.6 (patch)

Changes since v2.1.5:

- Add Ktsu package key support in build configuration: Updated the .NET CI workflow and PowerShell script to include an optional Ktsu package key for publishing. Enhanced documentation for the new parameter and added conditional publishing logic for Ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.5 (patch)

Changes since v2.1.4:

- Implement modern DPI awareness handling in Windows: Updated ForceDpiAware to utilize the latest DPI awareness APIs for better compatibility with windowing libraries. Added fallback mechanisms for older Windows versions and enhanced NativeMethods with new DPI awareness context functions. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.4 (patch)

Changes since v2.1.3:

- Enhance window position validation logic: Implemented performance optimizations to skip unnecessary checks when window position and size remain unchanged. Added methods for better multi-monitor support, ensuring windows are relocated when insufficiently visible. Updated tests to verify new behavior and performance improvements. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.3 (patch)

Changes since v2.1.2:

- Add manual trigger support to GitHub Actions workflow: Enabled workflow_dispatch to allow manual execution of the .NET CI pipeline. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.2 (patch)

Changes since v2.1.1:

- Refactor SonarQube conditional checks in GitHub Actions: Updated syntax for SONAR_TOKEN checks to use the correct expression format, ensuring proper execution of caching and installation steps. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor SonarQube token handling in GitHub Actions: Updated conditional checks to use environment variables for SONAR_TOKEN, ensuring consistent access across caching and installation steps. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance SonarQube integration in GitHub Actions: Added conditional checks for SONAR_TOKEN to ensure caching and installation steps only execute when the token is available, improving workflow reliability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiApp configuration handling: Introduced AdjustConfigForStartup method to automatically convert minimized window state to normal during startup, improving application reliability. Updated tests to validate this new behavior. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGuiApp configuration validation: Automatically convert minimized and fullscreen window states to normal during startup to prevent issues. Updated tests to reflect this change, ensuring proper state handling without exceptions. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.1 (patch)

Changes since v2.1.0:

- Additional tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.0 (minor)

Changes since v2.0.0:

- Add Nerd Font tab to ImGuiAppDemo, showcasing various icon sets including Powerline, Font Awesome, Material Design, Weather, Devicons, Octicons, and Brand Logos. Enhanced user guidance for using Nerd Fonts effectively. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor demo app with tabbed interface and improved Unicode/emoji display ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve font memory management with custom font handle tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Add NotoEmoji font support to ImGuiApp. Introduced NotoEmoji.ttf as a resource for emoji display and updated related resource files. Enhanced PowerShell script to preserve manually placed emoji fonts during Nerd Font installation, ensuring full emoji support in the application. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enable Unicode and emoji support by default in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiApp documentation and features: Updated project overview, added detailed descriptions for performance optimization, debug logging, and Unicode support. Introduced performance monitoring capabilities with real-time FPS tracking and throttling visualization. Improved font management and DPI handling. Refactored configuration settings for better usability. Updated demo application to showcase new features. ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiAppDemo to streamline tab rendering and remove redundant performance tab code ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Add NotVisibleFps setting for ultra-low frame rate when minimized ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance Invoke-DotNetPack function in PSBuild script to handle release notes exceeding NuGet's 35,000 character limit. Added logic to truncate long release notes and create a temporary file for compliance, with appropriate logging and cleanup of temporary files after packaging. ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve performance throttling with multi-condition rate selection ([@Cursor Agent](https://github.com/Cursor Agent))
- Update ImGuiFontConfig test to allow empty font path ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance FontHelper by adding support for extended Unicode and emoji glyph ranges. Introduced initialization flags and cleanup methods to manage memory more effectively. This refactor improves glyph range handling and prevents memory deallocation issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement deferred performance updates to prevent mid-cycle rate changes ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve window focus detection and add debug logging for throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor Performance tab into separate method and reorder tabs ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor FontHelper for flexible Unicode support with user-configured fonts ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove blank lines ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance emoji font support in ImGuiApp. Introduced LoadEmojiFont method to merge emoji fonts with main fonts, ensuring proper display of emojis. Updated FontHelper to manage emoji-specific glyph ranges separately, improving clarity and avoiding conflicts with main font symbols. Updated ImGuiAppDemo to showcase full emoji range support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to modularize glyph range additions for Latin Extended and emoji characters. Updated ImGuiApp to utilize the new methods for improved clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix VSync to prevent resource spikes when unfocused; update .NET SDK. ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove documentation for deferred FPS/UPS update fix. ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiApp tests to use Assert.ThrowsException method ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix test paths using Path.GetFullPath for consistent texture testing ([@Cursor Agent](https://github.com/Cursor Agent))
- Add emoji support to Unicode character ranges in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive unit tests for ImGuiApp and related classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove focus checks from input event handlers ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test for preventing multiple ImGuiApp starts ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement lowest frame rate throttling with comprehensive condition evaluation ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge branch 'cursor/address-question-mark-glyphs-8940' of https://github.com/ktsu-dev/ImGuiApp into cursor/address-question-mark-glyphs-8940 ([@matt-edmondson](https://github.com/matt-edmondson))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Simplify performance update logic and remove unnecessary tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor FontHelper to simplify glyph range additions by removing unnecessary type casting to ushort. This change enhances the handling of character ranges for emoji and Latin Extended characters, improving code clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update default performance settings for better resource efficiency ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify VSync management and remove unnecessary context checks ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add window visibility throttling for ultra-low resource usage ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test coverage for ImGuiApp and related components ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync and resource management for unfocused application states ([@Cursor Agent](https://github.com/Cursor Agent))
- Auto-commit pending changes before rebase - PR synchronize ([@Cursor Agent](https://github.com/Cursor Agent))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Use PackageReleaseNotesFile to handle changelog release notes more robustly ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement sleep-based frame rate throttling and remove UPS settings ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge main into feature branch and integrate performance tab ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive test coverage for ImGuiApp components and edge cases ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance Test-IsLibraryOnlyProject function in update-winget-manifests.ps1 ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix merge conflict in performance tab text and update FPS description ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor Invoke-DotNetPack function in PSBuild script to improve handling of release notes. Updated logic to create a temporary file for truncated content exceeding NuGet's 35,000 character limit, ensuring compliance and enhancing logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix input focus detection to prevent incorrect idle state management ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Unicode and emoji support with configurable font rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- [minor] Implement PID-based frame limiting in ImGuiApp: Introduced a new PidFrameLimiter class for precise frame rate control, enhancing performance optimization. Updated documentation to reflect new features, including auto-tuning capabilities and real-time diagnostics. Adjusted rendering settings to disable VSync for improved frame limiting accuracy. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor test suite into focused, organized test classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor performance settings: remove Ups, add NotVisibleFps and flags ([@Cursor Agent](https://github.com/Cursor Agent))
- Style cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiAppDemo with new features and UI updates ([@matt-edmondson](https://github.com/matt-edmondson))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance performance throttling with lowest-rate selection logic ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font point size in FontAppearance to 14 for improved readability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiFontConfig to enhance Unicode support by consolidating glyph range additions and improving code clarity. Removed redundant comments and streamlined the builder initialization process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove debug throttling properties and simplify focus handling ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance New-Changelog function in PSBuild script to truncate release notes exceeding NuGet's 35,000 character limit. This addition ensures compliance with NuGet requirements while providing informative logging about truncation. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor font loading in ImGuiApp to utilize pre-allocated memory for both main and emoji fonts. This change improves memory management by reusing allocated handles, enhancing performance and reducing memory overhead during font loading. Updated related methods to reflect the new memory handling approach. ([@matt-edmondson](https://github.com/matt-edmondson))
- Changes from background agent bc-34f5e701-6497-49ba-b614-0b4bc857f398 ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase NotVisibleFps from 0.2 to 2.0 for better background performance ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font size check in ImGuiApp to use FontAppearance.DefaultFontPointSize for improved consistency in font handling. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Unicode and emoji font support with cross-platform detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Add real-time FPS graph with throttling state visualization ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection and add throttling debug info ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix performance rate sync and update throttling to prevent ImGui crashes ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add support for Nerd Font icon ranges in FontHelper. Introduced AddNerdFontRanges method to include various icon sets such as Font Awesome, Material Design Icons, and Weather Icons, enhancing glyph range management. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper and ImGuiApp to simplify character addition and update default font key for compatibility. Removed unnecessary type checks in FontHelper for character ranges and adjusted font index storage in ImGuiApp to dynamically reflect the default font point size. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add GitHub Actions workflow for automatic SDK updates ([@matt-edmondson](https://github.com/matt-edmondson))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Adjust not visible frame rate to 0.2 FPS for better resource conservation ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor FontHelper to streamline Unicode and emoji range handling. Removed unused methods and improved memory management for glyph ranges. Updated ImGuiApp to utilize FontHelper for extended Unicode support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove VSync throttling configuration and related code ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge remote-tracking branch 'origin/main' into cursor/increase-imguiapp-test-coverage-c9d4 ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge branch 'cursor/investigate-unfocused-app-resource-usage-045c' of https://github.com/ktsu-dev/ImGuiApp into cursor/investigate-unfocused-app-resource-usage-045c ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into cursor/address-question-mark-glyphs-d05e ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace RobotoMonoNerdFont with NerdFont in ImGuiApp configuration. Add PowerShell script for interactive Nerd Font installation and management, including backup and recovery features. Update resource files to reflect new font integration. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update CLAUDE.md with additional testing and build instructions; enhance PSBuild script to improve release notes truncation logic for compliance with NuGet character limits, including detailed logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.12 (patch)

Changes since v2.0.11:

- Update ImGuiFontConfig test to allow empty font path ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiApp tests to use Assert.ThrowsException method ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix test paths using Path.GetFullPath for consistent texture testing ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive unit tests for ImGuiApp and related classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test for preventing multiple ImGuiApp starts ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test coverage for ImGuiApp and related components ([@Cursor Agent](https://github.com/Cursor Agent))
- Auto-commit pending changes before rebase - PR synchronize ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive test coverage for ImGuiApp components and edge cases ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor test suite into focused, organized test classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor performance settings: remove Ups, add NotVisibleFps and flags ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge remote-tracking branch 'origin/main' into cursor/increase-imguiapp-test-coverage-c9d4 ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.11 (patch)

Changes since v2.0.10:

- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add NotVisibleFps setting for ultra-low frame rate when minimized ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve performance throttling with multi-condition rate selection ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement deferred performance updates to prevent mid-cycle rate changes ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve window focus detection and add debug logging for throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove blank lines ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix VSync to prevent resource spikes when unfocused; update .NET SDK. ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove documentation for deferred FPS/UPS update fix. ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove focus checks from input event handlers ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement lowest frame rate throttling with comprehensive condition evaluation ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Simplify performance update logic and remove unnecessary tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify VSync management and remove unnecessary context checks ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add window visibility throttling for ultra-low resource usage ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync and resource management for unfocused application states ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement sleep-based frame rate throttling and remove UPS settings ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection to prevent incorrect idle state management ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Style cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance performance throttling with lowest-rate selection logic ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove debug throttling properties and simplify focus handling ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase NotVisibleFps from 0.2 to 2.0 for better background performance ([@Cursor Agent](https://github.com/Cursor Agent))
- Add real-time FPS graph with throttling state visualization ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection and add throttling debug info ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix performance rate sync and update throttling to prevent ImGui crashes ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Adjust not visible frame rate to 0.2 FPS for better resource conservation ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove VSync throttling configuration and related code ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge branch 'cursor/investigate-unfocused-app-resource-usage-045c' of https://github.com/ktsu-dev/ImGuiApp into cursor/investigate-unfocused-app-resource-usage-045c ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.10 (patch)

Changes since v2.0.9:

- Use PackageReleaseNotesFile to handle changelog release notes more robustly ([@Cursor Agent](https://github.com/Cursor Agent))
## v2.0.9 (patch)

Changes since v2.0.8:

- Add Nerd Font tab to ImGuiAppDemo, showcasing various icon sets including Powerline, Font Awesome, Material Design, Weather, Devicons, Octicons, and Brand Logos. Enhanced user guidance for using Nerd Fonts effectively. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor demo app with tabbed interface and improved Unicode/emoji display ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve font memory management with custom font handle tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Add NotoEmoji font support to ImGuiApp. Introduced NotoEmoji.ttf as a resource for emoji display and updated related resource files. Enhanced PowerShell script to preserve manually placed emoji fonts during Nerd Font installation, ensuring full emoji support in the application. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enable Unicode and emoji support by default in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiAppDemo to streamline tab rendering and remove redundant performance tab code ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance FontHelper by adding support for extended Unicode and emoji glyph ranges. Introduced initialization flags and cleanup methods to manage memory more effectively. This refactor improves glyph range handling and prevents memory deallocation issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Performance tab into separate method and reorder tabs ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor FontHelper for flexible Unicode support with user-configured fonts ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance emoji font support in ImGuiApp. Introduced LoadEmojiFont method to merge emoji fonts with main fonts, ensuring proper display of emojis. Updated FontHelper to manage emoji-specific glyph ranges separately, improving clarity and avoiding conflicts with main font symbols. Updated ImGuiAppDemo to showcase full emoji range support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to modularize glyph range additions for Latin Extended and emoji characters. Updated ImGuiApp to utilize the new methods for improved clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add emoji support to Unicode character ranges in ImGuiApp ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge branch 'cursor/address-question-mark-glyphs-8940' of https://github.com/ktsu-dev/ImGuiApp into cursor/address-question-mark-glyphs-8940 ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to simplify glyph range additions by removing unnecessary type casting to ushort. This change enhances the handling of character ranges for emoji and Latin Extended characters, improving code clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix merge conflict in performance tab text and update FPS description ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Unicode and emoji support with configurable font rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font point size in FontAppearance to 14 for improved readability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiFontConfig to enhance Unicode support by consolidating glyph range additions and improving code clarity. Removed redundant comments and streamlined the builder initialization process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor font loading in ImGuiApp to utilize pre-allocated memory for both main and emoji fonts. This change improves memory management by reusing allocated handles, enhancing performance and reducing memory overhead during font loading. Updated related methods to reflect the new memory handling approach. ([@matt-edmondson](https://github.com/matt-edmondson))
- Changes from background agent bc-34f5e701-6497-49ba-b614-0b4bc857f398 ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font size check in ImGuiApp to use FontAppearance.DefaultFontPointSize for improved consistency in font handling. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Unicode and emoji font support with cross-platform detection ([@Cursor Agent](https://github.com/Cursor Agent))
- Add support for Nerd Font icon ranges in FontHelper. Introduced AddNerdFontRanges method to include various icon sets such as Font Awesome, Material Design Icons, and Weather Icons, enhancing glyph range management. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper and ImGuiApp to simplify character addition and update default font key for compatibility. Removed unnecessary type checks in FontHelper for character ranges and adjusted font index storage in ImGuiApp to dynamically reflect the default font point size. ([@matt-edmondson](https://github.com/matt-edmondson))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor FontHelper to streamline Unicode and emoji range handling. Removed unused methods and improved memory management for glyph ranges. Updated ImGuiApp to utilize FontHelper for extended Unicode support. ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into cursor/address-question-mark-glyphs-d05e ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace RobotoMonoNerdFont with NerdFont in ImGuiApp configuration. Add PowerShell script for interactive Nerd Font installation and management, including backup and recovery features. Update resource files to reflect new font integration. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.8 (patch)

Changes since v2.0.7:

- Improve VSync handling during frame rate throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default performance settings for better resource efficiency ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge main into feature branch and integrate performance tab ([@Cursor Agent](https://github.com/Cursor Agent))
- Add Reset method tests and reset performance-related state fields ([@Cursor Agent](https://github.com/Cursor Agent))
- Add performance throttling with configurable rendering and idle detection ([@Cursor Agent](https://github.com/Cursor Agent))
## v2.0.7 (patch)

Changes since v2.0.6:

- Fix scissor rectangle calculations in ImGuiController to ensure non-negative dimensions, preventing potential rendering issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve rendering precision and pixel-perfect techniques in ImGui rendering ([@Cursor Agent](https://github.com/Cursor Agent))
- Enhance ImGuiApp configuration with debugging options ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiAppDemo with new features and UI updates ([@matt-edmondson](https://github.com/matt-edmondson))
- Add launch settings for ImGuiAppDemo with native debugging enabled ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiController for improved code clarity ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.7-pre.1 (prerelease)

Incremental prerelease update.
## v2.0.6 (patch)

Changes since v2.0.5:

- Add GitHub Actions workflow for automatic SDK updates ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.5 (patch)

Changes since v2.0.4:

- Update CLAUDE.md with additional testing and build instructions; enhance PSBuild script to improve release notes truncation logic for compliance with NuGet character limits, including detailed logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.4 (patch)

Changes since v2.0.3:

- Refactor Invoke-DotNetPack function in PSBuild script to improve handling of release notes. Updated logic to create a temporary file for truncated content exceeding NuGet's 35,000 character limit, ensuring compliance and enhancing logging for better traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.3 (patch)

Changes since v2.0.2:

- Enhance Invoke-DotNetPack function in PSBuild script to handle release notes exceeding NuGet's 35,000 character limit. Added logic to truncate long release notes and create a temporary file for compliance, with appropriate logging and cleanup of temporary files after packaging. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.2 (patch)

Changes since v2.0.1:

- Enhance Test-IsLibraryOnlyProject function in update-winget-manifests.ps1 ([@matt-edmondson](https://gith... (truncated due to NuGet length limits)