Revision a8009d0e
Added by david.sorber 8 months ago
| external/imgui/LICENSE.txt | ||
|---|---|---|
|
The MIT License (MIT)
|
||
|
|
||
|
Copyright (c) 2014-2024 Omar Cornut
|
||
|
Copyright (c) 2014-2025 Omar Cornut
|
||
|
|
||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
of this software and associated documentation files (the "Software"), to deal
|
||
| external/imgui/backend/imgui_impl_sdl2.cpp | ||
|---|---|---|
|
// [X] Platform: Clipboard support.
|
||
|
// [X] Platform: Mouse support. Can discriminate Mouse/TouchScreen.
|
||
|
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values are obsolete since 1.87 and not supported since 1.91.5]
|
||
|
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||
|
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
||
|
// [X] Platform: Gamepad support.
|
||
|
// [X] Platform: Mouse cursor shape and visibility (ImGuiBackendFlags_HasMouseCursors). Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
||
|
// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!.
|
||
|
|
||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||
| ... | ... | |
|
|
||
|
// CHANGELOG
|
||
|
// (minor and older changes stripped away, please see git history for details)
|
||
|
// 2025-09-24: Skip using the SDL_GetGlobalMouseState() state when one of our window is hovered, as the SDL_MOUSEMOTION data is reliable. Fix macOS notch mouse coordinates issue in fullscreen mode + better perf on X11. (#7919, #7786)
|
||
|
// 2025-09-18: Call platform_io.ClearPlatformHandlers() on shutdown.
|
||
|
// 2025-09-15: Content Scales are always reported as 1.0 on Wayland. (#8921)
|
||
|
// 2025-07-08: Made ImGui_ImplSDL2_GetContentScaleForWindow(), ImGui_ImplSDL2_GetContentScaleForDisplay() helpers return 1.0f on Emscripten and Android platforms, matching macOS logic. (#8742, #8733)
|
||
|
// 2025-06-11: Added ImGui_ImplSDL2_GetContentScaleForWindow(SDL_Window* window) and ImGui_ImplSDL2_GetContentScaleForDisplay(int display_index) helper to facilitate making DPI-aware apps.
|
||
|
// 2025-04-09: Don't attempt to call SDL_CaptureMouse() on drivers where we don't call SDL_GetGlobalMouseState(). (#8561)
|
||
|
// 2025-03-21: Fill gamepad inputs and set ImGuiBackendFlags_HasGamepad regardless of ImGuiConfigFlags_NavEnableGamepad being set.
|
||
|
// 2025-03-10: When dealing with OEM keys, use scancodes instead of translated keycodes to choose ImGuiKey values. (#7136, #7201, #7206, #7306, #7670, #7672, #8468)
|
||
|
// 2025-02-26: Only start SDL_CaptureMouse() when mouse is being dragged, to mitigate issues with e.g.Linux debuggers not claiming capture back. (#6410, #3650)
|
||
|
// 2025-02-24: Avoid calling SDL_GetGlobalMouseState() when mouse is in relative mode.
|
||
|
// 2025-02-18: Added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress mouse cursor support.
|
||
|
// 2025-02-10: Using SDL_OpenURL() in platform_io.Platform_OpenInShellFn handler.
|
||
|
// 2025-01-20: Made ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode_Manual) accept an empty array.
|
||
|
// 2024-10-24: Emscripten: from SDL 2.30.9, SDL_EVENT_MOUSE_WHEEL event doesn't require dividing by 100.0f.
|
||
|
// 2024-09-09: use SDL_Vulkan_GetDrawableSize() when available. (#7967, #3190)
|
||
|
// 2024-08-22: moved some OS/backend related function pointers from ImGuiIO to ImGuiPlatformIO:
|
||
| ... | ... | |
|
// Clang warnings with -Weverything
|
||
|
#if defined(__clang__)
|
||
|
#pragma clang diagnostic push
|
||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
|
||
|
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
|
||
|
#endif
|
||
|
|
||
|
// SDL
|
||
|
#include <SDL.h>
|
||
|
#include <SDL_syswm.h>
|
||
|
#include <stdio.h> // for snprintf()
|
||
|
#ifdef __APPLE__
|
||
|
#include <TargetConditionals.h>
|
||
|
#endif
|
||
|
#ifdef __EMSCRIPTEN__
|
||
|
#include <emscripten/em_js.h>
|
||
|
#endif
|
||
|
#undef Status // X11 headers are leaking this.
|
||
|
|
||
|
#if SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__)
|
||
|
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1
|
||
|
#else
|
||
|
#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 0
|
||
|
#endif
|
||
|
#define SDL_HAS_PER_MONITOR_DPI SDL_VERSION_ATLEAST(2,0,4)
|
||
|
#define SDL_HAS_VULKAN SDL_VERSION_ATLEAST(2,0,6)
|
||
|
#define SDL_HAS_OPEN_URL SDL_VERSION_ATLEAST(2,0,14)
|
||
|
#if SDL_HAS_VULKAN
|
||
|
#include <SDL_vulkan.h>
|
||
|
#endif
|
||
| ... | ... | |
|
SDL_Renderer* Renderer;
|
||
|
Uint64 Time;
|
||
|
char* ClipboardTextData;
|
||
|
char BackendPlatformName[48];
|
||
|
|
||
|
// Mouse handling
|
||
|
Uint32 MouseWindowID;
|
||
| ... | ... | |
|
SDL_Cursor* MouseLastCursor;
|
||
|
int MouseLastLeaveFrame;
|
||
|
bool MouseCanUseGlobalState;
|
||
|
bool MouseCanUseCapture;
|
||
|
|
||
|
// Gamepad handling
|
||
|
ImVector<SDL_GameController*> Gamepads;
|
||
| ... | ... | |
|
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode);
|
||
|
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
|
||
|
{
|
||
|
IM_UNUSED(scancode);
|
||
|
switch (keycode)
|
||
|
{
|
||
|
case SDLK_TAB: return ImGuiKey_Tab;
|
||
| ... | ... | |
|
case SDLK_SPACE: return ImGuiKey_Space;
|
||
|
case SDLK_RETURN: return ImGuiKey_Enter;
|
||
|
case SDLK_ESCAPE: return ImGuiKey_Escape;
|
||
|
case SDLK_QUOTE: return ImGuiKey_Apostrophe;
|
||
|
//case SDLK_QUOTE: return ImGuiKey_Apostrophe;
|
||
|
case SDLK_COMMA: return ImGuiKey_Comma;
|
||
|
case SDLK_MINUS: return ImGuiKey_Minus;
|
||
|
//case SDLK_MINUS: return ImGuiKey_Minus;
|
||
|
case SDLK_PERIOD: return ImGuiKey_Period;
|
||
|
case SDLK_SLASH: return ImGuiKey_Slash;
|
||
|
//case SDLK_SLASH: return ImGuiKey_Slash;
|
||
|
case SDLK_SEMICOLON: return ImGuiKey_Semicolon;
|
||
|
case SDLK_EQUALS: return ImGuiKey_Equal;
|
||
|
case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket;
|
||
|
case SDLK_BACKSLASH: return ImGuiKey_Backslash;
|
||
|
case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket;
|
||
|
case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent;
|
||
|
//case SDLK_EQUALS: return ImGuiKey_Equal;
|
||
|
//case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket;
|
||
|
//case SDLK_BACKSLASH: return ImGuiKey_Backslash;
|
||
|
//case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket;
|
||
|
//case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent;
|
||
|
case SDLK_CAPSLOCK: return ImGuiKey_CapsLock;
|
||
|
case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock;
|
||
|
case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock;
|
||
| ... | ... | |
|
case SDLK_AC_FORWARD: return ImGuiKey_AppForward;
|
||
|
default: break;
|
||
|
}
|
||
|
|
||
|
// Fallback to scancode
|
||
|
switch (scancode)
|
||
|
{
|
||
|
case SDL_SCANCODE_GRAVE: return ImGuiKey_GraveAccent;
|
||
|
case SDL_SCANCODE_MINUS: return ImGuiKey_Minus;
|
||
|
case SDL_SCANCODE_EQUALS: return ImGuiKey_Equal;
|
||
|
case SDL_SCANCODE_LEFTBRACKET: return ImGuiKey_LeftBracket;
|
||
|
case SDL_SCANCODE_RIGHTBRACKET: return ImGuiKey_RightBracket;
|
||
|
case SDL_SCANCODE_NONUSBACKSLASH: return ImGuiKey_Oem102;
|
||
|
case SDL_SCANCODE_BACKSLASH: return ImGuiKey_Backslash;
|
||
|
case SDL_SCANCODE_SEMICOLON: return ImGuiKey_Semicolon;
|
||
|
case SDL_SCANCODE_APOSTROPHE: return ImGuiKey_Apostrophe;
|
||
|
case SDL_SCANCODE_COMMA: return ImGuiKey_Comma;
|
||
|
case SDL_SCANCODE_PERIOD: return ImGuiKey_Period;
|
||
|
case SDL_SCANCODE_SLASH: return ImGuiKey_Slash;
|
||
|
default: break;
|
||
|
}
|
||
|
return ImGuiKey_None;
|
||
|
}
|
||
|
|
||
| ... | ... | |
|
static ImGuiViewport* ImGui_ImplSDL2_GetViewportForWindowID(Uint32 window_id)
|
||
|
{
|
||
|
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
|
||
|
return (window_id == bd->WindowID) ? ImGui::GetMainViewport() : NULL;
|
||
|
return (window_id == bd->WindowID) ? ImGui::GetMainViewport() : nullptr;
|
||
|
}
|
||
|
|
||
|
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
|
||
| ... | ... | |
|
{
|
||
|
case SDL_MOUSEMOTION:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->motion.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->motion.windowID) == nullptr)
|
||
|
return false;
|
||
|
ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
|
||
|
io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
|
||
| ... | ... | |
|
}
|
||
|
case SDL_MOUSEWHEEL:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->wheel.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->wheel.windowID) == nullptr)
|
||
|
return false;
|
||
|
//IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY);
|
||
|
#if SDL_VERSION_ATLEAST(2,0,18) // If this fails to compile on Emscripten: update to latest Emscripten!
|
||
| ... | ... | |
|
case SDL_MOUSEBUTTONDOWN:
|
||
|
case SDL_MOUSEBUTTONUP:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->button.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->button.windowID) == nullptr)
|
||
|
return false;
|
||
|
int mouse_button = -1;
|
||
|
if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
|
||
| ... | ... | |
|
}
|
||
|
case SDL_TEXTINPUT:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->text.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->text.windowID) == nullptr)
|
||
|
return false;
|
||
|
io.AddInputCharactersUTF8(event->text.text);
|
||
|
return true;
|
||
| ... | ... | |
|
case SDL_KEYDOWN:
|
||
|
case SDL_KEYUP:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->key.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->key.windowID) == nullptr)
|
||
|
return false;
|
||
|
ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod);
|
||
|
//IMGUI_DEBUG_LOG("SDL_KEY_%s : key=%d ('%s'), scancode=%d ('%s'), mod=%X\n",
|
||
|
// (event->type == SDL_KEYDOWN) ? "DOWN" : "UP ", event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym), event->key.keysym.scancode, SDL_GetScancodeName(event->key.keysym.scancode), event->key.keysym.mod);
|
||
|
ImGuiKey key = ImGui_ImplSDL2_KeyEventToImGuiKey(event->key.keysym.sym, event->key.keysym.scancode);
|
||
|
io.AddKeyEvent(key, (event->type == SDL_KEYDOWN));
|
||
|
io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
|
||
|
io.SetKeyEventNativeData(key, (int)event->key.keysym.sym, (int)event->key.keysym.scancode, (int)event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
|
||
|
return true;
|
||
|
}
|
||
|
case SDL_WINDOWEVENT:
|
||
|
{
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->window.windowID) == NULL)
|
||
|
if (ImGui_ImplSDL2_GetViewportForWindowID(event->window.windowID) == nullptr)
|
||
|
return false;
|
||
|
// - When capturing mouse, SDL will send a bunch of conflicting LEAVE/ENTER event on every mouse move, but the final ENTER tends to be right.
|
||
|
// - However we won't get a correct LEAVE event for a captured window.
|
||
| ... | ... | |
|
bd->WantUpdateGamepadsList = true;
|
||
|
return true;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
| ... | ... | |
|
IMGUI_CHECKVERSION();
|
||
|
IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
|
||
|
|
||
|
// Check and store if we are on a SDL backend that supports global mouse position
|
||
|
// ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list)
|
||
|
bool mouse_can_use_global_state = false;
|
||
|
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
|
||
|
const char* sdl_backend = SDL_GetCurrentVideoDriver();
|
||
|
const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" };
|
||
|
for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++)
|
||
|
if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0)
|
||
|
mouse_can_use_global_state = true;
|
||
|
#endif
|
||
|
// Obtain compiled and runtime versions
|
||
|
SDL_version ver_compiled;
|
||
|
SDL_version ver_runtime;
|
||
|
SDL_VERSION(&ver_compiled);
|
||
|
SDL_GetVersion(&ver_runtime);
|
||
|
|
||
|
// Setup backend capabilities flags
|
||
|
ImGui_ImplSDL2_Data* bd = IM_NEW(ImGui_ImplSDL2_Data)();
|
||
|
snprintf(bd->BackendPlatformName, sizeof(bd->BackendPlatformName), "imgui_impl_sdl2 (%u.%u.%u, %u.%u.%u)",
|
||
|
ver_compiled.major, ver_compiled.minor, ver_compiled.patch, ver_runtime.major, ver_runtime.minor, ver_runtime.patch);
|
||
|
io.BackendPlatformUserData = (void*)bd;
|
||
|
io.BackendPlatformName = "imgui_impl_sdl2";
|
||
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
|
||
|
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
|
||
|
io.BackendPlatformName = bd->BackendPlatformName;
|
||
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
|
||
|
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
|
||
|
|
||
|
bd->Window = window;
|
||
|
bd->WindowID = SDL_GetWindowID(window);
|
||
|
bd->Renderer = renderer;
|
||
|
bd->MouseCanUseGlobalState = mouse_can_use_global_state;
|
||
|
|
||
|
// Check and store if we are on a SDL backend that supports SDL_GetGlobalMouseState() and SDL_CaptureMouse()
|
||
|
// ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list)
|
||
|
bd->MouseCanUseGlobalState = false;
|
||
|
bd->MouseCanUseCapture = false;
|
||
|
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
|
||
|
const char* sdl_backend = SDL_GetCurrentVideoDriver();
|
||
|
const char* capture_and_global_state_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" };
|
||
|
for (const char* item : capture_and_global_state_whitelist)
|
||
|
if (strncmp(sdl_backend, item, strlen(item)) == 0)
|
||
|
bd->MouseCanUseGlobalState = bd->MouseCanUseCapture = true;
|
||
|
#endif
|
||
|
|
||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||
|
platform_io.Platform_SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText;
|
||
| ... | ... | |
|
platform_io.Platform_SetImeDataFn = ImGui_ImplSDL2_PlatformSetImeData;
|
||
|
#ifdef __EMSCRIPTEN__
|
||
|
platform_io.Platform_OpenInShellFn = [](ImGuiContext*, const char* url) { ImGui_ImplSDL2_EmscriptenOpenURL(url); return true; };
|
||
|
#elif SDL_HAS_OPEN_URL
|
||
|
platform_io.Platform_OpenInShellFn = [](ImGuiContext*, const char* url) { return SDL_OpenURL(url) == 0; };
|
||
|
#endif
|
||
|
|
||
|
// Gamepad handling
|
||
| ... | ... | |
|
bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW);
|
||
|
bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE);
|
||
|
bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND);
|
||
|
bd->MouseCursors[ImGuiMouseCursor_Wait] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAIT);
|
||
|
bd->MouseCursors[ImGuiMouseCursor_Progress] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAITARROW);
|
||
|
bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
|
||
|
|
||
|
// Set platform dependent data in viewport
|
||
| ... | ... | |
|
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
|
||
|
IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?");
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||
|
|
||
|
if (bd->ClipboardTextData)
|
||
|
SDL_free(bd->ClipboardTextData);
|
||
| ... | ... | |
|
io.BackendPlatformName = nullptr;
|
||
|
io.BackendPlatformUserData = nullptr;
|
||
|
io.BackendFlags &= ~(ImGuiBackendFlags_HasMouseCursors | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_HasGamepad);
|
||
|
platform_io.ClearPlatformHandlers();
|
||
|
IM_DELETE(bd);
|
||
|
}
|
||
|
|
||
| ... | ... | |
|
|
||
|
// We forward mouse input when hovered or captured (via SDL_MOUSEMOTION) or when focused (below)
|
||
|
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
|
||
|
// SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside
|
||
|
SDL_CaptureMouse((bd->MouseButtonsDown != 0) ? SDL_TRUE : SDL_FALSE);
|
||
|
// - SDL_CaptureMouse() let the OS know e.g. that our drags can extend outside of parent boundaries (we want updated position) and shouldn't trigger other operations outside.
|
||
|
// - Debuggers under Linux tends to leave captured mouse on break, which may be very inconvenient, so to mitigate the issue we wait until mouse has moved to begin capture.
|
||
|
if (bd->MouseCanUseCapture)
|
||
|
{
|
||
|
bool want_capture = false;
|
||
|
for (int button_n = 0; button_n < ImGuiMouseButton_COUNT && !want_capture; button_n++)
|
||
|
if (ImGui::IsMouseDragging(button_n, 1.0f))
|
||
|
want_capture = true;
|
||
|
SDL_CaptureMouse(want_capture ? SDL_TRUE : SDL_FALSE);
|
||
|
}
|
||
|
|
||
|
SDL_Window* focused_window = SDL_GetKeyboardFocus();
|
||
|
const bool is_app_focused = (bd->Window == focused_window);
|
||
|
#else
|
||
|
SDL_Window* focused_window = bd->Window;
|
||
|
const bool is_app_focused = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) != 0; // SDL 2.0.3 and non-windowed systems: single-viewport only
|
||
|
#endif
|
||
|
if (is_app_focused)
|
||
| ... | ... | |
|
if (io.WantSetMousePos)
|
||
|
SDL_WarpMouseInWindow(bd->Window, (int)io.MousePos.x, (int)io.MousePos.y);
|
||
|
|
||
|
// (Optional) Fallback to provide mouse position when focused (SDL_MOUSEMOTION already provides this when hovered or captured)
|
||
|
if (bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0)
|
||
|
// (Optional) Fallback to provide unclamped mouse position when focused but not hovered (SDL_MOUSEMOTION already provides this when hovered or captured)
|
||
|
// Note that SDL_GetGlobalMouseState() is in theory slow on X11, but this only runs on rather specific cases. If a problem we may provide a way to opt-out this feature.
|
||
|
SDL_Window* hovered_window = SDL_GetMouseFocus();
|
||
|
const bool is_relative_mouse_mode = SDL_GetRelativeMouseMode() != 0;
|
||
|
if (hovered_window == NULL && bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0 && !is_relative_mouse_mode)
|
||
|
{
|
||
|
int window_x, window_y, mouse_x_global, mouse_y_global;
|
||
|
SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global);
|
||
|
SDL_GetWindowPosition(bd->Window, &window_x, &window_y);
|
||
|
io.AddMousePosEvent((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y));
|
||
|
// Single-viewport mode: mouse position in client window coordinates (io.MousePos is (0,0) when the mouse is on the upper-left corner of the app window)
|
||
|
int mouse_x, mouse_y;
|
||
|
int window_x, window_y;
|
||
|
SDL_GetGlobalMouseState(&mouse_x, &mouse_y);
|
||
|
SDL_GetWindowPosition(focused_window, &window_x, &window_y);
|
||
|
mouse_x -= window_x;
|
||
|
mouse_y -= window_y;
|
||
|
io.AddMousePosEvent((float)mouse_x, (float)mouse_y);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
|
||
|
// - On Windows the process needs to be marked DPI-aware!! SDL2 doesn't do it by default. You can call ::SetProcessDPIAware() or call ImGui_ImplWin32_EnableDpiAwareness() from Win32 backend.
|
||
|
// - Apple platforms use FramebufferScale so we always return 1.0f.
|
||
|
// - Some accessibility applications are declaring virtual monitors with a DPI of 0.0f, see #7902. We preserve this value for caller to handle.
|
||
|
float ImGui_ImplSDL2_GetContentScaleForWindow(SDL_Window* window)
|
||
|
{
|
||
|
return ImGui_ImplSDL2_GetContentScaleForDisplay(SDL_GetWindowDisplayIndex(window));
|
||
|
}
|
||
|
|
||
|
float ImGui_ImplSDL2_GetContentScaleForDisplay(int display_index)
|
||
|
{
|
||
|
const char* sdl_driver = SDL_GetCurrentVideoDriver();
|
||
|
if (sdl_driver && strcmp(sdl_driver, "wayland") == 0)
|
||
|
return 1.0f;
|
||
|
#if SDL_HAS_PER_MONITOR_DPI
|
||
|
#if !defined(__APPLE__) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__)
|
||
|
float dpi = 0.0f;
|
||
|
if (SDL_GetDisplayDPI(display_index, &dpi, nullptr, nullptr) == 0)
|
||
|
return dpi / 96.0f;
|
||
|
#endif
|
||
|
#endif
|
||
|
IM_UNUSED(display_index);
|
||
|
return 1.0f;
|
||
|
}
|
||
|
|
||
|
static void ImGui_ImplSDL2_CloseGamepads()
|
||
|
{
|
||
|
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
|
||
| ... | ... | |
|
ImGui_ImplSDL2_CloseGamepads();
|
||
|
if (mode == ImGui_ImplSDL2_GamepadMode_Manual)
|
||
|
{
|
||
|
IM_ASSERT(manual_gamepads_array != nullptr && manual_gamepads_count > 0);
|
||
|
IM_ASSERT(manual_gamepads_array != nullptr || manual_gamepads_count <= 0);
|
||
|
for (int n = 0; n < manual_gamepads_count; n++)
|
||
|
bd->Gamepads.push_back(manual_gamepads_array[n]);
|
||
|
}
|
||
| ... | ... | |
|
bd->WantUpdateGamepadsList = false;
|
||
|
}
|
||
|
|
||
|
// FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs.
|
||
|
if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
|
||
|
return;
|
||
|
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
|
||
|
if (bd->Gamepads.Size == 0)
|
||
|
return;
|
||
| ... | ... | |
|
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumb_dead_zone, +32767);
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDL2_NewFrame()
|
||
|
static void ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(SDL_Window* window, SDL_Renderer* renderer, ImVec2* out_size, ImVec2* out_framebuffer_scale)
|
||
|
{
|
||
|
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
|
||
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL2_Init()?");
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
|
||
|
// Setup display size (every frame to accommodate for window resizing)
|
||
|
int w, h;
|
||
|
int display_w, display_h;
|
||
|
SDL_GetWindowSize(bd->Window, &w, &h);
|
||
|
if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED)
|
||
|
SDL_GetWindowSize(window, &w, &h);
|
||
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
||
|
w = h = 0;
|
||
|
if (bd->Renderer != nullptr)
|
||
|
SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h);
|
||
|
if (renderer != nullptr)
|
||
|
SDL_GetRendererOutputSize(renderer, &display_w, &display_h);
|
||
|
#if SDL_HAS_VULKAN
|
||
|
else if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_VULKAN)
|
||
|
SDL_Vulkan_GetDrawableSize(bd->Window, &display_w, &display_h);
|
||
|
else if (SDL_GetWindowFlags(window) & SDL_WINDOW_VULKAN)
|
||
|
SDL_Vulkan_GetDrawableSize(window, &display_w, &display_h);
|
||
|
#endif
|
||
|
else
|
||
|
SDL_GL_GetDrawableSize(bd->Window, &display_w, &display_h);
|
||
|
io.DisplaySize = ImVec2((float)w, (float)h);
|
||
|
if (w > 0 && h > 0)
|
||
|
io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h);
|
||
|
SDL_GL_GetDrawableSize(window, &display_w, &display_h);
|
||
|
if (out_size != nullptr)
|
||
|
*out_size = ImVec2((float)w, (float)h);
|
||
|
if (out_framebuffer_scale != nullptr)
|
||
|
*out_framebuffer_scale = (w > 0 && h > 0) ? ImVec2((float)display_w / w, (float)display_h / h) : ImVec2(1.0f, 1.0f);
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDL2_NewFrame()
|
||
|
{
|
||
|
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
|
||
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL2_Init()?");
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
|
||
|
// Setup main viewport size (every frame to accommodate for window resizing)
|
||
|
ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(bd->Window, bd->Renderer, &io.DisplaySize, &io.DisplayFramebufferScale);
|
||
|
|
||
|
// Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution)
|
||
|
// (Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. Happens in VMs and Emscripten, see #6189, #6114, #3644)
|
||
| external/imgui/backend/imgui_impl_sdl2.h | ||
|---|---|---|
|
// [X] Platform: Clipboard support.
|
||
|
// [X] Platform: Mouse support. Can discriminate Mouse/TouchScreen.
|
||
|
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values are obsolete since 1.87 and not supported since 1.91.5]
|
||
|
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||
|
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
||
|
// [X] Platform: Gamepad support.
|
||
|
// [X] Platform: Mouse cursor shape and visibility (ImGuiBackendFlags_HasMouseCursors). Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
||
|
// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!.
|
||
|
|
||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||
| ... | ... | |
|
IMGUI_IMPL_API void ImGui_ImplSDL2_NewFrame();
|
||
|
IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event);
|
||
|
|
||
|
// DPI-related helpers (optional)
|
||
|
IMGUI_IMPL_API float ImGui_ImplSDL2_GetContentScaleForWindow(SDL_Window* window);
|
||
|
IMGUI_IMPL_API float ImGui_ImplSDL2_GetContentScaleForDisplay(int display_index);
|
||
|
|
||
|
// Gamepad selection automatically starts in AutoFirst mode, picking first available SDL_Gamepad. You may override this.
|
||
|
// When using manual mode, caller is responsible for opening/closing gamepad.
|
||
|
enum ImGui_ImplSDL2_GamepadMode { ImGui_ImplSDL2_GamepadMode_AutoFirst, ImGui_ImplSDL2_GamepadMode_AutoAll, ImGui_ImplSDL2_GamepadMode_Manual };
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode mode, struct _SDL_GameController** manual_gamepads_array = NULL, int manual_gamepads_count = -1);
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode mode, struct _SDL_GameController** manual_gamepads_array = nullptr, int manual_gamepads_count = -1);
|
||
|
|
||
|
#endif // #ifndef IMGUI_DISABLE
|
||
| external/imgui/backend/imgui_impl_sdlrenderer2.cpp | ||
|---|---|---|
|
// dear imgui: Renderer Backend for SDL_Renderer for SDL2
|
||
|
// (Requires: SDL 2.0.17+)
|
||
|
|
||
|
// Note how SDL_Renderer is an _optional_ component of SDL2.
|
||
|
// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX.
|
||
|
// If your application will want to render any non trivial amount of graphics other than UI,
|
||
|
// please be aware that SDL_Renderer currently offers a limited graphic API to the end-user and
|
||
|
// it might be difficult to step out of those boundaries.
|
||
|
// Note that SDL_Renderer is an _optional_ component of SDL2, which IMHO is now largely obsolete.
|
||
|
// For a multi-platform app consider using other technologies:
|
||
|
// - SDL3+SDL_GPU: SDL_GPU is SDL3 new graphics abstraction API. You will need to update to SDL3.
|
||
|
// - SDL2+DirectX, SDL2+OpenGL, SDL2+Vulkan: combine SDL with dedicated renderers.
|
||
|
// If your application wants to render any non trivial amount of graphics other than UI,
|
||
|
// please be aware that SDL_Renderer currently offers a limited graphic API to the end-user
|
||
|
// and it might be difficult to step out of those boundaries.
|
||
|
|
||
|
// Implemented features:
|
||
|
// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID!
|
||
|
// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices.
|
||
|
// [X] Renderer: User texture binding. Use 'SDL_Texture*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
|
||
|
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
|
||
|
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
|
||
|
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
|
||
|
|
||
|
// You can copy and use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||
| ... | ... | |
|
// - Introduction, links and more at the top of imgui.cpp
|
||
|
|
||
|
// CHANGELOG
|
||
|
// 2025-09-18: Call platform_io.ClearRendererHandlers() on shutdown.
|
||
|
// 2025-06-11: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas. Removed ImGui_ImplSDLRenderer2_CreateFontsTexture() and ImGui_ImplSDLRenderer2_DestroyFontsTexture().
|
||
|
// 2025-01-18: Use endian-dependent RGBA32 texture format, to match SDL_Color.
|
||
|
// 2024-10-09: Expose selected render state in ImGui_ImplSDLRenderer2_RenderState, which you can access in 'void* platform_io.Renderer_RenderState' during draw callbacks.
|
||
|
// 2024-05-14: *BREAKING CHANGE* ImGui_ImplSDLRenderer3_RenderDrawData() requires SDL_Renderer* passed as parameter.
|
||
|
// 2023-05-30: Renamed imgui_impl_sdlrenderer.h/.cpp to imgui_impl_sdlrenderer2.h/.cpp to accommodate for upcoming SDL3.
|
||
| ... | ... | |
|
#if defined(__clang__)
|
||
|
#pragma clang diagnostic push
|
||
|
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
|
||
|
#elif defined(__GNUC__)
|
||
|
#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
|
||
|
#endif
|
||
|
|
||
|
// SDL
|
||
| ... | ... | |
|
struct ImGui_ImplSDLRenderer2_Data
|
||
|
{
|
||
|
SDL_Renderer* Renderer; // Main viewport's renderer
|
||
|
SDL_Texture* FontTexture;
|
||
|
|
||
|
ImGui_ImplSDLRenderer2_Data() { memset((void*)this, 0, sizeof(*this)); }
|
||
|
};
|
||
|
|
||
| ... | ... | |
|
io.BackendRendererUserData = (void*)bd;
|
||
|
io.BackendRendererName = "imgui_impl_sdlrenderer2";
|
||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
|
||
|
|
||
|
bd->Renderer = renderer;
|
||
|
|
||
| ... | ... | |
|
ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
|
||
|
IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?");
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||
|
|
||
|
ImGui_ImplSDLRenderer2_DestroyDeviceObjects();
|
||
|
|
||
|
io.BackendRendererName = nullptr;
|
||
|
io.BackendRendererUserData = nullptr;
|
||
|
io.BackendFlags &= ~ImGuiBackendFlags_RendererHasVtxOffset;
|
||
|
io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures);
|
||
|
platform_io.ClearRendererHandlers();
|
||
|
IM_DELETE(bd);
|
||
|
}
|
||
|
|
||
|
static void ImGui_ImplSDLRenderer2_SetupRenderState(SDL_Renderer* renderer)
|
||
|
{
|
||
|
// Clear out any viewports and cliprect set by the user
|
||
|
// Clear out any viewports and cliprect set by the user
|
||
|
// FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
|
||
|
SDL_RenderSetViewport(renderer, nullptr);
|
||
|
SDL_RenderSetClipRect(renderer, nullptr);
|
||
|
SDL_RenderSetViewport(renderer, nullptr);
|
||
|
SDL_RenderSetClipRect(renderer, nullptr);
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDLRenderer2_NewFrame()
|
||
|
{
|
||
|
ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
|
||
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDLRenderer2_Init()?");
|
||
|
|
||
|
if (!bd->FontTexture)
|
||
|
ImGui_ImplSDLRenderer2_CreateDeviceObjects();
|
||
|
IM_UNUSED(bd);
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer)
|
||
|
{
|
||
|
// If there's a scale factor set by the user, use that instead
|
||
|
// If there's a scale factor set by the user, use that instead
|
||
|
// If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
|
||
|
// to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
|
||
|
float rsx = 1.0f;
|
||
|
float rsy = 1.0f;
|
||
|
SDL_RenderGetScale(renderer, &rsx, &rsy);
|
||
|
float rsy = 1.0f;
|
||
|
SDL_RenderGetScale(renderer, &rsx, &rsy);
|
||
|
ImVec2 render_scale;
|
||
|
render_scale.x = (rsx == 1.0f) ? draw_data->FramebufferScale.x : 1.0f;
|
||
|
render_scale.y = (rsy == 1.0f) ? draw_data->FramebufferScale.y : 1.0f;
|
||
|
|
||
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||
|
int fb_width = (int)(draw_data->DisplaySize.x * render_scale.x);
|
||
|
int fb_height = (int)(draw_data->DisplaySize.y * render_scale.y);
|
||
|
if (fb_width == 0 || fb_height == 0)
|
||
|
return;
|
||
|
render_scale.x = (rsx == 1.0f) ? draw_data->FramebufferScale.x : 1.0f;
|
||
|
render_scale.y = (rsy == 1.0f) ? draw_data->FramebufferScale.y : 1.0f;
|
||
|
|
||
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||
|
int fb_width = (int)(draw_data->DisplaySize.x * render_scale.x);
|
||
|
int fb_height = (int)(draw_data->DisplaySize.y * render_scale.y);
|
||
|
if (fb_width == 0 || fb_height == 0)
|
||
|
return;
|
||
|
|
||
|
// Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
|
||
|
// (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
|
||
|
if (draw_data->Textures != nullptr)
|
||
|
for (ImTextureData* tex : *draw_data->Textures)
|
||
|
if (tex->Status != ImTextureStatus_OK)
|
||
|
ImGui_ImplSDLRenderer2_UpdateTexture(tex);
|
||
|
|
||
|
// Backup SDL_Renderer state that will be modified to restore it afterwards
|
||
|
struct BackupSDLRendererState
|
||
| ... | ... | |
|
render_state.Renderer = renderer;
|
||
|
platform_io.Renderer_RenderState = &render_state;
|
||
|
|
||
|
// Will project scissor/clipping rectangles into framebuffer space
|
||
|
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
||
|
ImVec2 clip_scale = render_scale;
|
||
|
// Will project scissor/clipping rectangles into framebuffer space
|
||
|
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
||
|
ImVec2 clip_scale = render_scale;
|
||
|
|
||
|
// Render command lists
|
||
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||
|
for (const ImDrawList* draw_list : draw_data->CmdLists)
|
||
|
{
|
||
|
const ImDrawList* draw_list = draw_data->CmdLists[n];
|
||
|
const ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data;
|
||
|
const ImDrawIdx* idx_buffer = draw_list->IdxBuffer.Data;
|
||
|
|
||
| ... | ... | |
|
#endif
|
||
|
|
||
|
// Bind texture, Draw
|
||
|
SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID();
|
||
|
SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID();
|
||
|
SDL_RenderGeometryRaw(renderer, tex,
|
||
|
xy, (int)sizeof(ImDrawVert),
|
||
|
color, (int)sizeof(ImDrawVert),
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
}
|
||
|
platform_io.Renderer_RenderState = NULL;
|
||
|
platform_io.Renderer_RenderState = nullptr;
|
||
|
|
||
|
// Restore modified SDL_Renderer state
|
||
|
SDL_RenderSetViewport(renderer, &old.Viewport);
|
||
|
SDL_RenderSetClipRect(renderer, old.ClipEnabled ? &old.ClipRect : nullptr);
|
||
|
}
|
||
|
|
||
|
// Called by Init/NewFrame/Shutdown
|
||
|
bool ImGui_ImplSDLRenderer2_CreateFontsTexture()
|
||
|
void ImGui_ImplSDLRenderer2_UpdateTexture(ImTextureData* tex)
|
||
|
{
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
|
||
|
|
||
|
// Build texture atlas
|
||
|
unsigned char* pixels;
|
||
|
int width, height;
|
||
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
|
||
|
|
||
|
// Upload texture to graphics system
|
||
|
// (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
|
||
|
bd->FontTexture = SDL_CreateTexture(bd->Renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height);
|
||
|
if (bd->FontTexture == nullptr)
|
||
|
if (tex->Status == ImTextureStatus_WantCreate)
|
||
|
{
|
||
|
SDL_Log("error creating texture");
|
||
|
return false;
|
||
|
// Create and upload new texture to graphics system
|
||
|
//IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
|
||
|
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
|
||
|
IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
|
||
|
|
||
|
// Create texture
|
||
|
// (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
|
||
|
SDL_Texture* sdl_texture = SDL_CreateTexture(bd->Renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, tex->Width, tex->Height);
|
||
|
IM_ASSERT(sdl_texture != nullptr && "Backend failed to create texture!");
|
||
|
SDL_UpdateTexture(sdl_texture, nullptr, tex->GetPixels(), tex->GetPitch());
|
||
|
SDL_SetTextureBlendMode(sdl_texture, SDL_BLENDMODE_BLEND);
|
||
|
SDL_SetTextureScaleMode(sdl_texture, SDL_ScaleModeLinear);
|
||
|
|
||
|
// Store identifiers
|
||
|
tex->SetTexID((ImTextureID)(intptr_t)sdl_texture);
|
||
|
tex->SetStatus(ImTextureStatus_OK);
|
||
|
}
|
||
|
SDL_UpdateTexture(bd->FontTexture, nullptr, pixels, 4 * width);
|
||
|
SDL_SetTextureBlendMode(bd->FontTexture, SDL_BLENDMODE_BLEND);
|
||
|
SDL_SetTextureScaleMode(bd->FontTexture, SDL_ScaleModeLinear);
|
||
|
|
||
|
// Store our identifier
|
||
|
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDLRenderer2_DestroyFontsTexture()
|
||
|
{
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
|
||
|
if (bd->FontTexture)
|
||
|
else if (tex->Status == ImTextureStatus_WantUpdates)
|
||
|
{
|
||
|
// Update selected blocks. We only ever write to textures regions which have never been used before!
|
||
|
// This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
|
||
|
SDL_Texture* sdl_texture = (SDL_Texture*)(intptr_t)tex->TexID;
|
||
|
for (ImTextureRect& r : tex->Updates)
|
||
|
{
|
||
|
SDL_Rect sdl_r = { r.x, r.y, r.w, r.h };
|
||
|
SDL_UpdateTexture(sdl_texture, &sdl_r, tex->GetPixelsAt(r.x, r.y), tex->GetPitch());
|
||
|
}
|
||
|
tex->SetStatus(ImTextureStatus_OK);
|
||
|
}
|
||
|
else if (tex->Status == ImTextureStatus_WantDestroy)
|
||
|
{
|
||
|
io.Fonts->SetTexID(0);
|
||
|
SDL_DestroyTexture(bd->FontTexture);
|
||
|
bd->FontTexture = nullptr;
|
||
|
if (SDL_Texture* sdl_texture = (SDL_Texture*)(intptr_t)tex->TexID)
|
||
|
SDL_DestroyTexture(sdl_texture);
|
||
|
|
||
|
// Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
|
||
|
tex->SetTexID(ImTextureID_Invalid);
|
||
|
tex->SetStatus(ImTextureStatus_Destroyed);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool ImGui_ImplSDLRenderer2_CreateDeviceObjects()
|
||
|
void ImGui_ImplSDLRenderer2_CreateDeviceObjects()
|
||
|
{
|
||
|
return ImGui_ImplSDLRenderer2_CreateFontsTexture();
|
||
|
}
|
||
|
|
||
|
void ImGui_ImplSDLRenderer2_DestroyDeviceObjects()
|
||
|
{
|
||
|
ImGui_ImplSDLRenderer2_DestroyFontsTexture();
|
||
|
// Destroy all textures
|
||
|
for (ImTextureData* tex : ImGui::GetPlatformIO().Textures)
|
||
|
if (tex->RefCount == 1)
|
||
|
{
|
||
|
tex->SetStatus(ImTextureStatus_WantDestroy);
|
||
|
ImGui_ImplSDLRenderer2_UpdateTexture(tex);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
| external/imgui/backend/imgui_impl_sdlrenderer2.h | ||
|---|---|---|
|
// dear imgui: Renderer Backend for SDL_Renderer for SDL2
|
||
|
// (Requires: SDL 2.0.17+)
|
||
|
|
||
|
// Note how SDL_Renderer is an _optional_ component of SDL2.
|
||
|
// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX.
|
||
|
// If your application will want to render any non trivial amount of graphics other than UI,
|
||
|
// please be aware that SDL_Renderer currently offers a limited graphic API to the end-user and
|
||
|
// it might be difficult to step out of those boundaries.
|
||
|
// Note that SDL_Renderer is an _optional_ component of SDL2, which IMHO is now largely obsolete.
|
||
|
// For a multi-platform app consider using other technologies:
|
||
|
// - SDL3+SDL_GPU: SDL_GPU is SDL3 new graphics abstraction API. You will need to update to SDL3.
|
||
|
// - SDL2+DirectX, SDL2+OpenGL, SDL2+Vulkan: combine SDL with dedicated renderers.
|
||
|
// If your application wants to render any non trivial amount of graphics other than UI,
|
||
|
// please be aware that SDL_Renderer currently offers a limited graphic API to the end-user
|
||
|
// and it might be difficult to step out of those boundaries.
|
||
|
|
||
|
// Implemented features:
|
||
|
// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID!
|
||
|
// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices.
|
||
|
// [X] Renderer: User texture binding. Use 'SDL_Texture*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
|
||
|
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
|
||
|
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
|
||
|
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
|
||
|
|
||
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||
| ... | ... | |
|
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer);
|
||
|
|
||
|
// Called by Init/NewFrame/Shutdown
|
||
|
IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_CreateFontsTexture();
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_DestroyFontsTexture();
|
||
|
IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_CreateDeviceObjects();
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_CreateDeviceObjects();
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_DestroyDeviceObjects();
|
||
|
|
||
|
// (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = NULL to handle this manually.
|
||
|
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_UpdateTexture(ImTextureData* tex);
|
||
|
|
||
|
// [BETA] Selected render state data shared with callbacks.
|
||
|
// This is temporarily stored in GetPlatformIO().Renderer_RenderState during the ImGui_ImplSDLRenderer2_RenderDrawData() call.
|
||
|
// (Please open an issue if you feel you need access to more data)
|
||
| external/imgui/imconfig.h | ||
|---|---|---|
|
#pragma once
|
||
|
|
||
|
//---- Define assertion handler. Defaults to calling assert().
|
||
|
// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
|
||
|
// - If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
|
||
|
// - Compiling with NDEBUG will usually strip out assert() to nothing, which is NOT recommended because we use asserts to notify of programmer mistakes.
|
||
|
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
|
||
|
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
|
||
|
|
||
| ... | ... | |
|
//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
|
||
|
//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
|
||
|
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
|
||
|
//#define IMGUI_DISABLE_DEFAULT_FONT // Disable default embedded font (ProggyClean.ttf), remove ~9.5 KB from output binary. AddFontDefault() will assert.
|
||
|
//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
|
||
|
|
||
|
//---- Enable Test Engine / Automation features.
|
||
| ... | ... | |
|
//#define IMGUI_INCLUDE_IMGUI_USER_H
|
||
|
//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h"
|
||
|
|
||
|
//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another)
|
||
|
//---- Pack vertex colors as BGRA8 instead of RGBA8 (to avoid converting from one to another). Need dedicated backend support.
|
||
|
//#define IMGUI_USE_BGRA_PACKED_COLOR
|
||
|
|
||
|
//---- Use legacy CRC32-adler tables (used before 1.91.6), in order to preserve old .ini data that you cannot afford to invalidate.
|
||
|
//#define IMGUI_USE_LEGACY_CRC32_ADLER
|
||
|
|
||
|
//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
|
||
|
//#define IMGUI_USE_WCHAR32
|
||
|
|
||
| ... | ... | |
|
|
||
|
//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
|
||
|
// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
|
||
|
// Note that imgui_freetype.cpp may be used _without_ this define, if you manually call ImFontAtlas::SetFontLoader(). The define is simply a convenience.
|
||
|
// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
|
||
|
//#define IMGUI_ENABLE_FREETYPE
|
||
|
|
||
|
//---- Use FreeType + plutosvg or lunasvg to render OpenType SVG fonts (SVGinOT)
|
||
|
// Only works in combination with IMGUI_ENABLE_FREETYPE.
|
||
|
// - lunasvg is currently easier to acquire/install, as e.g. it is part of vcpkg.
|
||
|
// - plutosvg will support more fonts and may load them faster. It currently requires to be built manually but it is fairly easy. See misc/freetype/README for instructions.
|
||
|
// - plutosvg is currently easier to install, as e.g. it is part of vcpkg. It will support more fonts and may load them faster. See misc/freetype/README for instructions.
|
||
|
// - Both require headers to be available in the include path + program to be linked with the library code (not provided).
|
||
|
// - (note: lunasvg implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement)
|
||
|
//#define IMGUI_ENABLE_FREETYPE_PLUTOSVG
|
||
| ... | ... | |
|
//#define IM_DEBUG_BREAK IM_ASSERT(0)
|
||
|
//#define IM_DEBUG_BREAK __debugbreak()
|
||
|
|
||
|
//---- Debug Tools: Enable highlight ID conflicts _before_ hovering items. When io.ConfigDebugHighlightIdConflicts is set.
|
||
|
// (THIS WILL SLOW DOWN DEAR IMGUI. Only use occasionally and disable after use)
|
||
|
//#define IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS
|
||
|
|
||
|
//---- Debug Tools: Enable slower asserts
|
||
|
//#define IMGUI_DEBUG_PARANOID
|
||
|
|
||
| external/imgui/imgui.cpp | ||
|---|---|---|
|
// dear imgui, v1.91.5
|
||
|
// dear imgui, v1.92.5
|
||
|
// (main code and documentation)
|
||
|
|
||
|
// Help:
|
||
|
// - See links below.
|
||
|
// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that.
|
||
|
// - Read top of imgui.cpp for more details, links and comments.
|
||
|
// - Add '#define IMGUI_DEFINE_MATH_OPERATORS' before including imgui.h (or in imconfig.h) to access courtesy maths operators for ImVec2 and ImVec4.
|
||
|
|
||
|
// Resources:
|
||
|
// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md)
|
||
|
// - Homepage ................... https://github.com/ocornut/imgui
|
||
|
// - Releases & changelog ....... https://github.com/ocornut/imgui/releases
|
||
|
// - Releases & Changelog ....... https://github.com/ocornut/imgui/releases
|
||
|
// - Gallery .................... https://github.com/ocornut/imgui/issues?q=label%3Agallery (please post your screenshots/video there!)
|
||
|
// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there)
|
||
|
// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code)
|
||
|
// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more)
|
||
|
// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines)
|
||
|
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
||
|
// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings + backends for various tech/engines)
|
||
|
// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools
|
||
|
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
||
|
// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui
|
||
|
// - Issues & support ........... https://github.com/ocornut/imgui/issues
|
||
|
// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps)
|
||
|
// - Web version of the Demo .... https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html (w/ source code browser)
|
||
|
|
||
|
// For first-time users having issues compiling/linking/running/loading fonts:
|
||
|
// For FIRST-TIME users having issues compiling/linking/running:
|
||
|
// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
|
||
|
// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there.
|
||
|
// Since 1.92, we encourage font loading questions to also be posted in 'Issues'.
|
||
|
|
||
|
// Copyright (c) 2014-2024 Omar Cornut
|
||
|
// Copyright (c) 2014-2025 Omar Cornut
|
||
|
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
|
||
|
// See LICENSE.txt for copyright and licensing details (standard MIT License).
|
||
|
// This library is free but needs your support to sustain development and maintenance.
|
||
| ... | ... | |
|
- HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
|
||
|
- GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
|
||
|
- HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
||
|
- HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
||
|
- USING CUSTOM BACKEND / CUSTOM ENGINE
|
||
|
- API BREAKING CHANGES (read me when you update!)
|
||
|
- FREQUENTLY ASKED QUESTIONS (FAQ)
|
||
|
- Read all answers online: https://www.dearimgui.com/faq, or in docs/FAQ.md (with a Markdown viewer)
|
||
| ... | ... | |
|
// [SECTION] RENDER HELPERS
|
||
|
// [SECTION] INITIALIZATION, SHUTDOWN
|
||
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
||
|
// [SECTION] FONTS, TEXTURES
|
||
|
// [SECTION] ID STACK
|
||
|
// [SECTION] INPUTS
|
||
|
// [SECTION] ERROR CHECKING, STATE RECOVERY
|
||
| ... | ... | |
|
// [SECTION] SCROLLING
|
||
|
// [SECTION] TOOLTIPS
|
||
|
// [SECTION] POPUPS
|
||
|
// [SECTION] WINDOW FOCUS
|
||
|
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
|
||
|
// [SECTION] DRAG AND DROP
|
||
|
// [SECTION] LOGGING/CAPTURING
|
||
| ... | ... | |
|
Designed primarily for developers and content-creators, not the typical end-user!
|
||
|
Some of the current weaknesses (which we aim to address in the future) includes:
|
||
|
|
||
|
- Doesn't look fancy.
|
||
|
- Doesn't look fancy by default.
|
||
|
- Limited layout features, intricate layouts are typically crafted in code.
|
||
|
|
||
|
|
||
| ... | ... | |
|
|
||
|
- MOUSE CONTROLS
|
||
|
- Mouse wheel: Scroll vertically.
|
||
|
- SHIFT+Mouse wheel: Scroll horizontally.
|
||
|
- Shift+Mouse wheel: Scroll horizontally.
|
||
|
- Click [X]: Close a window, available when 'bool* p_open' is passed to ImGui::Begin().
|
||
|
- Click ^, Double-Click title: Collapse window.
|
||
|
- Drag on corner/border: Resize window (double-click to auto fit window to its contents).
|
||
| ... | ... | |
|
- Left-click outside popup: Close popup stack (right-click over underlying popup: Partially close popup stack).
|
||
|
|
||
|
- TEXT EDITOR
|
||
|
- Hold SHIFT or Drag Mouse: Select text.
|
||
|
- CTRL+Left/Right: Word jump.
|
||
|
- CTRL+Shift+Left/Right: Select words.
|
||
|
- CTRL+A or Double-Click: Select All.
|
||
|
- CTRL+X, CTRL+C, CTRL+V: Use OS clipboard.
|
||
|
- CTRL+Z, CTRL+Y: Undo, Redo.
|
||
|
- Hold Shift or Drag Mouse: Select text.
|
||
|
- Ctrl+Left/Right: Word jump.
|
||
|
- Ctrl+Shift+Left/Right: Select words.
|
||
|
- Ctrl+A or Double-Click: Select All.
|
||
|
- Ctrl+X, Ctrl+C, Ctrl+V: Use OS clipboard.
|
||
|
- Ctrl+Z Undo.
|
||
|
- Ctrl+Y or Ctrl+Shift+Z: Redo.
|
||
|
- ESCAPE: Revert text to its original value.
|
||
|
- On OSX, controls are automatically adjusted to match standard OSX text editing 2ts and behaviors.
|
||
|
- On macOS, controls are automatically adjusted to match standard macOS text editing and behaviors.
|
||
|
(for 99% of shortcuts, Ctrl is replaced by Cmd on macOS).
|
||
|
|
||
|
- KEYBOARD CONTROLS
|
||
|
- Basic:
|
||
|
- Tab, SHIFT+Tab Cycle through text editable fields.
|
||
|
- CTRL+Tab, CTRL+Shift+Tab Cycle through windows.
|
||
|
- CTRL+Click Input text into a Slider or Drag widget.
|
||
|
- Tab, Shift+Tab Cycle through text editable fields.
|
||
|
- Ctrl+Tab, Ctrl+Shift+Tab Cycle through windows.
|
||
|
- Ctrl+Click Input text into a Slider or Drag widget.
|
||
|
- Extended features with `io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard`:
|
||
|
- Tab, SHIFT+Tab: Cycle through every items.
|
||
|
- Tab, Shift+Tab: Cycle through every items.
|
||
|
- Arrow keys Move through items using directional navigation. Tweak value.
|
||
|
- Arrow keys + Alt, Shift Tweak slower, tweak faster (when using arrow keys).
|
||
|
- Enter Activate item (prefer text input when possible).
|
||
| ... | ... | |
|
- Page Up, Page Down Previous page, next page.
|
||
|
- Home, End Scroll to top, scroll to bottom.
|
||
|
- Alt Toggle between scrolling layer and menu layer.
|
||
|
- CTRL+Tab then Ctrl+Arrows Move window. Hold SHIFT to resize instead of moving.
|
||
|
- Ctrl+Tab then Ctrl+Arrows Move window. Hold Shift to resize instead of moving.
|
||
|
- Output when ImGuiConfigFlags_NavEnableKeyboard set,
|
||
|
- io.WantCaptureKeyboard flag is set when keyboard is claimed.
|
||
|
- io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set.
|
||
| ... | ... | |
|
|
||
|
READ FIRST
|
||
|
----------
|
||
|
- Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki)
|
||
|
- Remember to check the wonderful Wiki: https://github.com/ocornut/imgui/wiki
|
||
|
- Your code creates the UI every frame of your application loop, if your code doesn't run the UI is gone!
|
||
|
The UI can be highly dynamic, there are no construction or destruction steps, less superfluous
|
||
|
data retention on your side, less state duplication, less state synchronization, fewer bugs.
|
||
| ... | ... | |
|
|
||
|
HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
||
|
--------------------------------------
|
||
|
EXHIBIT 1: USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder).
|
||
|
|
||
|
USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder).
|
||
|
The sub-folders in examples/ contain examples applications following this structure.
|
||
|
|
||
|
// Application init: create a dear imgui context, setup some options, load fonts
|
||
| ... | ... | |
|
// Any application code here
|
||
|
ImGui::Text("Hello, world!");
|
||
|
|
||
|
// Render dear imgui into screen
|
||
|
// Render dear imgui into framebuffer
|
||
|
ImGui::Render();
|
||
|
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
||
|
g_pSwapChain->Present(1, 0);
|
||
| ... | ... | |
|
ImGui_ImplWin32_Shutdown();
|
||
|
ImGui::DestroyContext();
|
||
|
|
||
|
EXHIBIT 2: IMPLEMENTING CUSTOM BACKEND / CUSTOM ENGINE
|
||
|
To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application,
|
||
|
you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
|
||
|
Please read the FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" about this.
|
||
|
|
||
|
|
||
|
// Application init: create a dear imgui context, setup some options, load fonts
|
||
|
USING CUSTOM BACKEND / CUSTOM ENGINE
|
||
|
------------------------------------
|
||
|
|
||
|
IMPLEMENTING YOUR PLATFORM BACKEND:
|
||
|
-> see https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md for basic instructions.
|
||
|
-> the Platform backends in impl_impl_XXX.cpp files contain many implementations.
|
||
|
|
||
|
IMPLEMENTING YOUR RenderDrawData() function:
|
||
|
-> see https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md
|
||
|
-> the Renderer Backends in impl_impl_XXX.cpp files contain many implementations of a ImGui_ImplXXXX_RenderDrawData() function.
|
||
|
|
||
|
IMPLEMENTING SUPPORT for ImGuiBackendFlags_RendererHasTextures:
|
||
|
-> see https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md
|
||
|
-> the Renderer Backends in impl_impl_XXX.cpp files contain many implementations of a ImGui_ImplXXXX_UpdateTexture() function.
|
||
|
|
||
|
Basic application/backend skeleton:
|
||
|
|
||
|
// Application init: create a Dear ImGui context, setup some options, load fonts
|
||
|
ImGui::CreateContext();
|
||
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
// TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls.
|
||
|
// TODO: Fill optional fields of the io structure later.
|
||
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
||
|
// TODO: set io.ConfigXXX values, e.g.
|
||
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable keyboard controls
|
||
|
|
||
|
// Build and load the texture atlas into a texture
|
||
|
// (In the examples/ app this is usually done within the ImGui_ImplXXX_Init() function from one of the demo Renderer)
|
||
|
int width, height;
|
||
|
unsigned char* pixels = nullptr;
|
||
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
|
||
|
|
||
|
// At this point you've got the texture data and you need to upload that to your graphic system:
|
||
|
// After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'.
|
||
|
// This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID.
|
||
|
MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32)
|
||
|
io.Fonts->SetTexID((void*)texture);
|
||
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
||
|
io.Fonts->AddFontFromFileTTF("NotoSans.ttf");
|
||
|
|
||
|
// Application main loop
|
||
|
while (true)
|
||
| ... | ... | |
|
MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End();
|
||
|
MyGameRender(); // may use any Dear ImGui functions as well!
|
||
|
|
||
|
// Render dear imgui, swap buffers
|
||
|
// End the dear imgui frame
|
||
|
// (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code)
|
||
|
ImGui::EndFrame();
|
||
|
ImGui::EndFrame(); // this is automatically called by Render(), but available
|
||
|
ImGui::Render();
|
||
|
|
||
|
// Update textures
|
||
|
ImDrawData* draw_data = ImGui::GetDrawData();
|
||
|
MyImGuiRenderFunction(draw_data);
|
||
|
for (ImTextureData* tex : *draw_data->Textures)
|
||
|
if (tex->Status != ImTextureStatus_OK)
|
||
|
MyImGuiBackend_UpdateTexture(tex);
|
||
|
|
||
|
// Render dear imgui contents, swap buffers
|
||
|
MyImGuiBackend_RenderDrawData(draw_data);
|
||
|
SwapBuffers();
|
||
|
}
|
||
|
|
||
|
// Shutdown
|
||
|
ImGui::DestroyContext();
|
||
|
|
||
|
To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application,
|
||
|
you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
|
||
|
Please read the FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" about this.
|
||
|
|
||
|
|
||
|
HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
||
|
---------------------------------------------
|
||
|
The backends in impl_impl_XXX.cpp files contain many working implementations of a rendering function.
|
||
|
|
||
|
void MyImGuiRenderFunction(ImDrawData* draw_data)
|
||
|
{
|
||
|
// TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
|
||
|
// TODO: Setup texture sampling state: sample with bilinear filtering (NOT point/nearest filtering). Use 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines;' to allow point/nearest filtering.
|
||
|
// TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
|
||
|
// TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
|
||
|
// TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color.
|
||
|
ImVec2 clip_off = draw_data->DisplayPos;
|
||
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||
|
{
|
||
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||
|
const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui
|
||
|
const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui
|
||
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
||
|
{
|
||
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
||
|
if (pcmd->UserCallback)
|
||
|
{
|
||
|
pcmd->UserCallback(cmd_list, pcmd);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Project scissor/clipping rectangles into framebuffer space
|
||
|
ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y);
|
||
|
ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y);
|
||
|
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
|
||
|
continue;
|
||
|
|
||
|
// We are using scissoring to clip some objects. All low-level graphics API should support it.
|
||
|
// - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches
|
||
|
// (some elements visible outside their bounds) but you can fix that once everything else works!
|
||
|
// - Clipping coordinates are provided in imgui coordinates space:
|
||
|
// - For a given viewport, draw_data->DisplayPos == viewport->Pos and draw_data->DisplaySize == viewport->Size
|
||
|
// - In a single viewport application, draw_data->DisplayPos == (0,0) and draw_data->DisplaySize == io.DisplaySize, but always use GetMainViewport()->Pos/Size instead of hardcoding those values.
|
||
|
// - In the interest of supporting multi-viewport applications (see 'docking' branch on github),
|
||
|
// always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space.
|
||
|
// - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min)
|
||
|
MyEngineSetScissor(clip_min.x, clip_min.y, clip_max.x, clip_max.y);
|
||
|
|
||
|
// The texture for the draw call is specified by pcmd->GetTexID().
|
||
|
// The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization.
|
||
|
MyEngineBindTexture((MyTexture*)pcmd->GetTexID());
|
||
|
|
||
|
// Render 'pcmd->ElemCount/3' indexed triangles.
|
||
|
// By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices.
|
||
|
MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset, vtx_buffer, pcmd->VtxOffset);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
API BREAKING CHANGES
|
||
| ... | ... | |
|
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
||
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
||
|
|
||
|
- 2025/11/06 (1.92.5) - BeginChild: commented out some legacy names which were obsoleted in 1.90.0 (Nov 2023), 1.90.9 (July 2024), 1.91.1 (August 2024):
|
||
|
- ImGuiChildFlags_Border --> ImGuiChildFlags_Borders
|
||
|
- ImGuiWindowFlags_NavFlattened --> ImGuiChildFlags_NavFlattened (moved to ImGuiChildFlags). BeginChild(name, size, 0, ImGuiWindowFlags_NavFlattened) --> BeginChild(name, size, ImGuiChildFlags_NavFlattened, 0)
|
||
|
- ImGuiWindowFlags_AlwaysUseWindowPadding --> ImGuiChildFlags_AlwaysUseWindowPadding (moved to ImGuiChildFlags). BeginChild(name, size, 0, ImGuiWindowFlags_AlwaysUseWindowPadding) --> BeginChild(name, size, ImGuiChildFlags_AlwaysUseWindowPadding, 0)
|
||
|
- 2025/11/06 (1.92.5) - Keys: commented out legacy names which were obsoleted in 1.89.0 (August 2022):
|
||
|
- ImGuiKey_ModCtrl --> ImGuiMod_Ctrl
|
||
|
- ImGuiKey_ModShift --> ImGuiMod_Shift
|
||
|
- ImGuiKey_ModAlt --> ImGuiMod_Alt
|
||
|
- ImGuiKey_ModSuper --> ImGuiMod_Super
|
||
|
- 2025/11/06 (1.92.5) - IO: commented out legacy io.ClearInputCharacters() obsoleted in 1.89.8 (Aug 2023). Calling io.ClearInputKeys() is enough.
|
||
|
- 2025/11/06 (1.92.5) - Commented out legacy SetItemAllowOverlap() obsoleted in 1.89.7: this never worked right. Use SetNextItemAllowOverlap() _before_ item instead.
|
||
|
- 2025/10/14 (1.92.4) - TreeNode, Selectable, Clipper: commented out legacy names which were obsoleted in 1.89.7 (July 2023) and 1.89.9 (Sept 2023);
|
||
|
- ImGuiTreeNodeFlags_AllowItemOverlap --> ImGuiTreeNodeFlags_AllowOverlap
|
||
|
- ImGuiSelectableFlags_AllowItemOverlap --> ImGuiSelectableFlags_AllowOverlap
|
||
|
- ImGuiListClipper::IncludeRangeByIndices() --> ImGuiListClipper::IncludeItemsByIndex()
|
||
|
- 2025/08/08 (1.92.2) - Backends: SDL_GPU3: Changed ImTextureID type from SDL_GPUTextureSamplerBinding* to SDL_GPUTexture*, which is more natural and easier for user to manage. If you need to change the current sampler, you can access the ImGui_ImplSDLGPU3_RenderState struct. (#8866, #8163, #7998, #7988)
|
||
|
- 2025/07/31 (1.92.2) - Tabs: Renamed ImGuiTabBarFlags_FittingPolicyResizeDown to ImGuiTabBarFlags_FittingPolicyShrink. Kept inline redirection enum (will obsolete).
|
||
|
- 2025/06/25 (1.92.0) - Layout: commented out legacy ErrorCheckUsingSetCursorPosToExtendParentBoundaries() fallback obsoleted in 1.89 (August 2022) which allowed a SetCursorPos()/SetCursorScreenPos() call WITHOUT AN ITEM
|
||
|
to extend parent window/cell boundaries. Replaced with assert/tooltip that would already happens if previously using IMGUI_DISABLE_OBSOLETE_FUNCTIONS. (#5548, #4510, #3355, #1760, #1490, #4152, #150)
|
||
|
- Incorrect way to make a window content size 200x200:
|
||
|
Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End();
|
||
|
- Correct ways to make a window content size 200x200:
|
||
|
Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End();
|
||
|
Begin(...) + Dummy(ImVec2(200,200)) + End();
|
||
|
- TL;DR; if the assert triggers, you can add a Dummy({0,0}) call to validate extending parent boundaries.
|
||
|
- 2025/06/11 (1.92.0) - THIS VERSION CONTAINS THE LARGEST AMOUNT OF BREAKING CHANGES SINCE 2015! I TRIED REALLY HARD TO KEEP THEM TO A MINIMUM, REDUCE THE AMOUNT OF INTERFERENCES, BUT INEVITABLY SOME USERS WILL BE AFFECTED.
|
||
|
IN ORDER TO HELP US IMPROVE THE TRANSITION PROCESS, INCL. DOCUMENTATION AND COMMENTS, PLEASE REPORT **ANY** DOUBT, CONFUSION, QUESTIONS, FEEDBACK TO: https://github.com/ocornut/imgui/issues/
|
||
|
As part of the plan to reduce impact of API breaking changes, several unfinished changes/features/refactors related to font and text systems and scaling will be part of subsequent releases (1.92.1+).
|
||
|
If you are updating from an old version, and expecting a massive or difficult update, consider first updating to 1.91.9 to reduce the amount of changes.
|
||
|
- Hard to read? Refer to 'docs/Changelog.txt' for a less compact and more complete version of this!
|
||
|
- Fonts: **IMPORTANT**: if your app was solving the OSX/iOS Retina screen specific logical vs display scale problem by setting io.DisplayFramebufferScale (e.g. to 2.0f) + setting io.FontGlobalScale (e.g. to 1.0f/2.0f) + loading fonts at scaled sizes (e.g. size X * 2.0f):
|
||
|
This WILL NOT map correctly to the new system! Because font will rasterize as requested size.
|
||
|
- With a legacy backend (< 1.92): Instead of setting io.FontGlobalScale = 1.0f/N -> set ImFontCfg::RasterizerDensity = N. This already worked before, but is now pretty much required.
|
||
|
- With a new backend (1.92+): This should be all automatic. FramebufferScale is automatically used to set current font RasterizerDensity. FramebufferScale is a per-viewport property provided by backend through the Platform_GetWindowFramebufferScale() handler in 'docking' branch.
|
||
|
- Fonts: **IMPORTANT** on Font Sizing: Before 1.92, fonts were of a single size. They can now be dynamically sized.
|
||
|
- PushFont() API now has a REQUIRED size parameter.
|
||
|
- Before 1.92: PushFont() always used font "default" size specified in AddFont() call. It is equivalent to calling PushFont(font, font->LegacySize).
|
||
|
- Since 1.92: PushFont(font, 0.0f) preserve the current font size which is a shared value.
|
||
|
- To use old behavior: use 'ImGui::PushFont(font, font->LegacySize)' at call site.
|
||
|
- Kept inline single parameter function. Will obsolete.
|
||
|
- Fonts: **IMPORTANT** on Font Merging:
|
||
|
- When searching for a glyph in multiple merged fonts: we search for the FIRST font source which contains the desired glyph.
|
||
|
Because the user doesn't need to provide glyph ranges any more, it is possible that a glyph that you expected to fetch from a secondary/merged icon font may be erroneously fetched from the primary font.
|
||
|
- When searching for a glyph in multiple merged fonts: we now search for the FIRST font source which contains the desired glyph. This is technically a different behavior than before!
|
||
|
- e.g. If you are merging fonts you may have glyphs that you expected to load from Font Source 2 which exists in Font Source 1.
|
||
|
After the update and when using a new backend, those glyphs may now loaded from Font Source 1!
|
||
|
- We added `ImFontConfig::GlyphExcludeRanges[]` to specify ranges to exclude from a given font source:
|
||
|
// Add Font Source 1 but ignore ICON_MIN_FA..ICON_MAX_FA range
|
||
|
static ImWchar exclude_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
|
||
|
ImFontConfig cfg1;
|
||
|
cfg1.GlyphExcludeRanges = exclude_ranges;
|
||
|
io.Fonts->AddFontFromFileTTF("segoeui.ttf", 0.0f, &cfg1);
|
||
|
// Add Font Source 2, which expects to use the range above
|
||
|
ImFontConfig cfg2;
|
||
|
cfg2.MergeMode = true;
|
||
|
io.Fonts->AddFontFromFileTTF("FontAwesome4.ttf", 0.0f, &cfg2);
|
||
|
- You can use `Metrics/Debugger->Fonts->Font->Input Glyphs Overlap Detection Tool` to see list of glyphs available in multiple font sources. This can facilitate understanding which font input is providing which glyph.
|
||
|
- Fonts: **IMPORTANT** on Thread Safety:
|
||
|
- A few functions such as font->CalcTextSizeA() were, by sheer luck (== accidentally) thread-safe even thou we had never provided that guarantee. They are definitively not thread-safe anymore as new glyphs may be loaded.
|
||
|
- Fonts: ImFont::FontSize was removed and does not make sense anymore. ImFont::LegacySize is the size passed to AddFont().
|
||
|
- Fonts: Removed support for PushFont(NULL) which was a shortcut for "default font".
|
||
|
- Fonts: Renamed/moved 'io.FontGlobalScale' to 'style.FontScaleMain'.
|
||
|
- Textures: all API functions taking a 'ImTextureID' parameter are now taking a 'ImTextureRef'. Affected functions are: ImGui::Image(), ImGui::ImageWithBg(), ImGui::ImageButton(), ImDrawList::AddImage(), ImDrawList::AddImageQuad(), ImDrawList::AddImageRounded().
|
||
|
- Fonts: obsoleted ImFontAtlas::GetTexDataAsRGBA32(), GetTexDataAsAlpha8(), Build(), SetTexID(), IsBuilt() functions. The new protocol for backends to handle textures doesn't need them. Kept redirection functions (will obsolete).
|
||
|
- Fonts: ImFontConfig::OversampleH/OversampleV default to automatic (== 0) since v1.91.8. It is quite important you keep it automatic until we decide if we want to provide a way to express finer policy, otherwise you will likely waste texture space when using large glyphs. Note that the imgui_freetype backend doesn't use and does not need oversampling.
|
||
|
- Fonts: specifying glyph ranges is now unnecessary. The value of ImFontConfig::GlyphRanges[] is only useful for legacy backends. All GetGlyphRangesXXXX() functions are now marked obsolete: GetGlyphRangesDefault(), GetGlyphRangesGreek(), GetGlyphRangesKorean(), GetGlyphRangesJapanese(), GetGlyphRangesChineseSimplifiedCommon(), GetGlyphRangesChineseFull(), GetGlyphRangesCyrillic(), GetGlyphRangesThai(), GetGlyphRangesVietnamese().
|
||
|
- Fonts: removed ImFontAtlas::TexDesiredWidth to enforce a texture width. (#327)
|
||
|
- Fonts: if you create and manage ImFontAtlas instances yourself (instead of relying on ImGuiContext to create one), you'll need to call ImFontAtlasUpdateNewFrame() yourself. An assert will trigger if you don't.
|
||
|
- Fonts: obsolete ImGui::SetWindowFontScale() which is not useful anymore. Prefer using 'PushFont(NULL, style.FontSizeBase * factor)' or to manipulate other scaling factors.
|
||
|
- Fonts: obsoleted ImFont::Scale which is not useful anymore.
|
||
|
- Fonts: generally reworked Internals of ImFontAtlas and ImFont. While in theory a vast majority of users shouldn't be affected, some use cases or extensions might be. Among other things:
|
||
|
- ImDrawCmd::TextureId has been changed to ImDrawCmd::TexRef.
|
||
|
- ImFontAtlas::TexID has been changed to ImFontAtlas::TexRef.
|
||
|
- ImFontAtlas::ConfigData[] has been renamed to ImFontAtlas::Sources[]
|
||
|
- ImFont::ConfigData[], ConfigDataCount has been renamed to Sources[], SourceCount.
|
||
|
- Each ImFont has a number of ImFontBaked instances corresponding to actively used sizes. ImFont::GetFontBaked(size) retrieves the one for a given size.
|
||
|
- Fields moved from ImFont to ImFontBaked: IndexAdvanceX[], Glyphs[], Ascent, Descent, FindGlyph(), FindGlyphNoFallback(), GetCharAdvance().
|
||
|
- Fields moved from ImFontAtlas to ImFontAtlas->Tex: ImFontAtlas::TexWidth => TexData->Width, ImFontAtlas::TexHeight => TexData->Height, ImFontAtlas::TexPixelsAlpha8/TexPixelsRGBA32 => TexData->GetPixels().
|
||
|
- Widget code may use ImGui::GetFontBaked() instead of ImGui::GetFont() to access font data for current font at current font size (and you may use font->GetFontBaked(size) to access it for any other size.)
|
||
|
- Fonts: (users of imgui_freetype): renamed ImFontAtlas::FontBuilderFlags to ImFontAtlas::FontLoaderFlags. Renamed ImFontConfig::FontBuilderFlags to ImFontConfig::FontLoaderFlags. Renamed ImGuiFreeTypeBuilderFlags to ImGuiFreeTypeLoaderFlags.
|
||
|
If you used runtime imgui_freetype selection rather than the default IMGUI_ENABLE_FREETYPE compile-time option: Renamed/reworked ImFontBuilderIO into ImFontLoader. Renamed ImGuiFreeType::GetBuilderForFreeType() to ImGuiFreeType::GetFontLoader().
|
||
|
- old: io.Fonts->FontBuilderIO = ImGuiFreeType::GetBuilderForFreeType()
|
||
|
- new: io.Fonts->FontLoader = ImGuiFreeType::GetFontLoader()
|
||
|
- new: io.Fonts->SetFontLoader(ImGuiFreeType::GetFontLoader()) to change dynamically at runtime [from 1.92.1]
|
||
|
- Fonts: (users of custom rectangles, see #8466): Renamed AddCustomRectRegular() to AddCustomRect(). Added GetCustomRect() as a replacement for GetCustomRectByIndex() + CalcCustomRectUV().
|
||
|
- The output type of GetCustomRect() is now ImFontAtlasRect, which include UV coordinates. X->x, Y->y, Width->w, Height->h.
|
||
|
- old:
|
||
|
const ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(custom_rect_id);
|
||
|
ImVec2 uv0, uv1;
|
||
|
atlas->GetCustomRectUV(r, &uv0, &uv1);
|
||
|
ImGui::Image(atlas->TexRef, ImVec2(r->w, r->h), uv0, uv1);
|
||
|
- new;
|
||
|
ImFontAtlasRect r;
|
||
|
atlas->GetCustomRect(custom_rect_id, &r);
|
||
|
ImGui::Image(atlas->TexRef, ImVec2(r.w, r.h), r.uv0, r.uv1);
|
||
|
- We added a redirecting typedef but haven't attempted to magically redirect the field names, as this API is rarely used and the fix is simple.
|
||
|
- Obsoleted AddCustomRectFontGlyph() as the API does not make sense for scalable fonts. Kept existing function which uses the font "default size" (Sources[0]->LegacySize). Added a helper AddCustomRectFontGlyphForSize() which is immediately marked obsolete, but can facilitate transitioning old code.
|
||
|
- Prefer adding a font source (ImFontConfig) using a custom/procedural loader.
|
||
|
- DrawList: Renamed ImDrawList::PushTextureID()/PopTextureID() to PushTexture()/PopTexture().
|
||
|
- Backends: removed ImGui_ImplXXXX_CreateFontsTexture()/ImGui_ImplXXXX_DestroyFontsTexture() for all backends that had them. They should not be necessary any more.
|
||
|
- 2025/05/23 (1.92.0) - Fonts: changed ImFont::CalcWordWrapPositionA() to ImFont::CalcWordWrapPosition()
|
||
|
- old: const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, ....);
|
||
|
- new: const char* ImFont::CalcWordWrapPosition (float size, const char* text, ....);
|
||
|
The leading 'float scale' parameters was changed to 'float size'. This was necessary as 'scale' is assuming standard font size which is a concept we aim to eliminate in an upcoming update. Kept inline redirection function.
|
||
|
- 2025/05/15 (1.92.0) - TreeNode: renamed ImGuiTreeNodeFlags_NavLeftJumpsBackHere to ImGuiTreeNodeFlags_NavLeftJumpsToParent for clarity. Kept inline redirection enum (will obsolete).
|
||
|
- 2025/05/15 (1.92.0) - Commented out PushAllowKeyboardFocus()/PopAllowKeyboardFocus() which was obsoleted in 1.89.4. Use PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop)/PopItemFlag() instead. (#3092)
|
||
|
- 2025/05/15 (1.92.0) - Commented out ImGuiListClipper::ForceDisplayRangeByIndices() which was obsoleted in 1.89.6. Use ImGuiListClipper::IncludeItemsByIndex() instead.
|
||
|
- 2025/03/05 (1.91.9) - BeginMenu(): Internals: reworked mangling of menu windows to use "###Menu_00" etc. instead of "##Menu_00", allowing them to also store the menu name before it. This shouldn't affect code unless directly accessing menu window from their mangled name.
|
||
|
- 2025/04/16 (1.91.9) - Internals: RenderTextEllipsis() function removed the 'float clip_max_x' parameter directly preceding 'float ellipsis_max_x'. Values were identical for a vast majority of users. (#8387)
|
||
|
- 2025/02/27 (1.91.9) - Image(): removed 'tint_col' and 'border_col' parameter from Image() function. Added ImageWithBg() replacement. (#8131, #8238)
|
||
|
- old: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 tint_col = (1,1,1,1), ImVec4 border_col = (0,0,0,0));
|
||
|
- new: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1));
|
||
|
- new: void ImageWithBg(ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 bg_col = (0,0,0,0), ImVec4 tint_col = (1,1,1,1));
|
||
|
- TL;DR: 'border_col' had misleading side-effect on layout, 'bg_col' was missing, parameter order couldn't be consistent with ImageButton().
|
||
|
- new behavior always use ImGuiCol_Border color + style.ImageBorderSize / ImGuiStyleVar_ImageBorderSize.
|
||
|
- old behavior altered border size (and therefore layout) based on border color's alpha, which caused variety of problems + old behavior a fixed 1.0f for border size which was not tweakable.
|
||
|
- kept legacy signature (will obsolete), which mimics the old behavior, but uses Max(1.0f, style.ImageBorderSize) when border_col is specified.
|
||
|
- added ImageWithBg() function which has both 'bg_col' (which was missing) and 'tint_col'. It was impossible to add 'bg_col' to Image() with a parameter order consistent with other functions, so we decided to remove 'tint_col' and introduce ImageWithBg().
|
||
|
- 2025/02/25 (1.91.9) - internals: fonts: ImFontAtlas::ConfigData[] has been renamed to ImFontAtlas::Sources[]. ImFont::ConfigData[], ConfigDataCount has been renamed to Sources[], SourcesCount.
|
||
|
- 2025/02/06 (1.91.9) - renamed ImFontConfig::GlyphExtraSpacing.x to ImFontConfig::GlyphExtraAdvanceX.
|
||
|
- 2025/01/22 (1.91.8) - removed ImGuiColorEditFlags_AlphaPreview (made value 0): it is now the default behavior.
|
||
|
prior to 1.91.8: alpha was made opaque in the preview by default _unless_ using ImGuiColorEditFlags_AlphaPreview. We now display the preview as transparent by default. You can use ImGuiColorEditFlags_AlphaOpaque to use old behavior.
|
||
|
the new flags (ImGuiColorEditFlags_AlphaOpaque, ImGuiColorEditFlags_AlphaNoBg + existing ImGuiColorEditFlags_AlphaPreviewHalf) may be combined better and allow finer controls:
|
||
|
- 2025/01/14 (1.91.7) - renamed ImGuiTreeNodeFlags_SpanTextWidth to ImGuiTreeNodeFlags_SpanLabelWidth for consistency with other names. Kept redirection enum (will obsolete). (#6937)
|
||
|
- 2024/11/27 (1.91.6) - changed CRC32 table from CRC32-adler to CRC32c polynomial in order to be compatible with the result of SSE 4.2 instructions.
|
||
|
As a result, old .ini data may be partially lost (docking and tables information particularly).
|
||
|
Because some users have crafted and storing .ini data as a way to workaround limitations of the docking API, we are providing a '#define IMGUI_USE_LEGACY_CRC32_ADLER' compile-time option to keep using old CRC32 tables if you cannot afford invalidating old .ini data.
|
||
|
- 2024/11/06 (1.91.5) - commented/obsoleted out pre-1.87 IO system (equivalent to using IMGUI_DISABLE_OBSOLETE_KEYIO or IMGUI_DISABLE_OBSOLETE_FUNCTIONS before)
|
||
|
- io.KeyMap[] and io.KeysDown[] are removed (obsoleted February 2022).
|
||
|
- io.NavInputs[] and ImGuiNavInput are removed (obsoleted July 2022).
|
||
| ... | ... | |
|
in doubt it is almost always better to do an intermediate intptr_t cast, since it allows casting any pointer/integer type without warning:
|
||
|
- May warn: ImGui::Image((void*)MyTextureData, ...);
|
||
|
- May warn: ImGui::Image((void*)(intptr_t)MyTextureData, ...);
|
||
|
- Won't warn: ImGui::Image((ImTextureID)(intptr_t)MyTextureData), ...);
|
||
|
- Won't warn: ImGui::Image((ImTextureID)(intptr_t)MyTextureData, ...);
|
||
|
- note that you can always define ImTextureID to be your own high-level structures (with dedicated constructors) if you like.
|
||
|
- 2024/10/03 (1.91.3) - drags: treat v_min==v_max as a valid clamping range when != 0.0f. Zero is a still special value due to legacy reasons, unless using ImGuiSliderFlags_ClampZeroRange. (#7968, #3361, #76)
|
||
|
- drags: extended behavior of ImGuiSliderFlags_AlwaysClamp to include _ClampZeroRange. It considers v_min==v_max==0.0f as a valid clamping range (aka edits not allowed).
|
||
|
although unlikely, it you wish to only clamp on text input but want v_min==v_max==0.0f to mean unclamped drags, you can use _ClampOnInput instead of _AlwaysClamp. (#7968, #3361, #76)
|
||
|
- 2024/09/10 (1.91.2) - internals: using multiple overlayed ButtonBehavior() with same ID will now have io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
|
||
|
- 2024/09/10 (1.91.2) - internals: using multiple overlaid ButtonBehavior() with same ID will now have io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
|
||
|
it was one of the rare case where using same ID is legal. workarounds: (1) use single ButtonBehavior() call with multiple _MouseButton flags, or (2) surround the calls with PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()
|
||
|
- 2024/08/23 (1.91.1) - renamed ImGuiChildFlags_Border to ImGuiChildFlags_Borders for consistency. kept inline redirection flag.
|
||
|
- 2024/08/22 (1.91.1) - moved some functions from ImGuiIO to ImGuiPlatformIO structure:
|
||
| ... | ... | |
|
- 2022/04/05 (1.88) - inputs: renamed ImGuiKeyModFlags to ImGuiModFlags. Kept inline redirection enums (will obsolete). This was never used in public API functions but technically present in imgui.h and ImGuiIO.
|
||
|
- 2022/01/20 (1.87) - inputs: reworded gamepad IO.
|
||
|
- Backend writing to io.NavInputs[] -> backend should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values.
|
||
|
- 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputing text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used).
|
||
|
- 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputting text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used).
|
||
|
- 2022/01/17 (1.87) - inputs: reworked mouse IO.
|
||
|
- Backend writing to io.MousePos -> backend should call io.AddMousePosEvent()
|
||
|
- Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent()
|
||
| ... | ... | |
|
- Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only]
|
||
|
note: for all calls to IO new functions, the Dear ImGui context should be bound/current.
|
||
|
read https://github.com/ocornut/imgui/issues/4921 for details.
|
||
|
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
||
|
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(), ImGui::IsKeyDown(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
||
|
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
||
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
||
|
- Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes).
|
||
|
- Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to still function with legacy key codes).
|
||
|
- Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiMod_XXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiMod_XXX values.*
|
||
|
- one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert.
|
||
|
- inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper.
|
||
| ... | ... | |
|
- ShowTestWindow() -> use ShowDemoWindow()
|
||
|
- IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow)
|
||
|
- IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows)
|
||
|
- SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f)
|
||
|
- SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f))
|
||
|
- GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing()
|
||
|
- ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg
|
||
|
- ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding
|
||
| ... | ... | |
|
- renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete).
|
||
|
- renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).
|
||
|
- 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.
|
||
|
- 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix.
|
||
|
- 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicitly to fix.
|
||
|
- 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type.
|
||
|
- 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely.
|
||
|
- 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete).
|
||
| ... | ... | |
|
associated with it.
|
||
|
|
||
|
Q: What is this library called?
|
||
|
Q: What is the difference between Dear ImGui and traditional UI toolkits?
|
||
|
Q: Which version should I get?
|
||
|
>> This library is called "Dear ImGui", please don't call it "ImGui" :)
|
||
|
>> See https://www.dearimgui.com/faq for details.
|
||
| ... | ... | |
|
#else
|
||
|
#include <windows.h>
|
||
|
#endif
|
||
|
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES)
|
||
|
#if defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_APP) && WINAPI_FAMILY == WINAPI_FAMILY_APP) || (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES))
|
||
|
// The UWP and GDK Win32 API subsets don't support clipboard nor IME functions
|
||
|
#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
|
||
|
#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
|
||
| ... | ... | |
|
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
|
||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
|
||
|
#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
|
||
|
#pragma clang diagnostic ignored "-Wformat" // warning: format specifies type 'int' but the argument has type 'unsigned int'
|
||
|
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
|
||
|
#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic.
|
||
|
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
|
||
|
#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is.
|
||
|
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
|
||
|
#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic.
|
||
|
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int'
|
||
|
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0
|
||
|
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
|
||
|
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
|
||
|
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
|
||
|
#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
|
||
|
#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
|
||
|
#elif defined(__GNUC__)
|
||
|
// We disable -Wpragmas because GCC doesn't provide a has_warning equivalent and some forks/patches may not follow the warning/version association.
|
||
|
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
||
|
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
||
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
|
||
|
#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*'
|
||
|
#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
|
||
|
#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'int'/'void*', but argument X has type 'unsigned int'/'ImGuiWindow*'
|
||
|
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
|
||
|
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
||
|
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
|
||
|
#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
|
||
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
||
|
#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
|
||
|
#endif
|
||
|
|
||
|
// Debug options
|
||
|
#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Hold CTRL to display for all candidates. CTRL+Arrow to change last direction.
|
||
|
#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Hold Ctrl to display for all candidates. Ctrl+Arrow to change last direction.
|
||
|
#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window
|
||
|
|
||
|
// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch.
|
||
|
// Default font size if unspecified in both style.FontSizeBase and AddFontXXX() calls.
|
||
|
static const float FONT_DEFAULT_SIZE = 20.0f;
|
||
|
|
||
|
// When using Ctrl+Tab (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch.
|
||
|
static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in
|
||
|
static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear
|
||
|
|
||
|
static const float NAV_ACTIVATE_HIGHLIGHT_TIMER = 0.10f; // Time to highlight an item activated by a shortcut.
|
||
|
|
||
|
// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend)
|
||
|
static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow().
|
||
|
static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time.
|
||
|
static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 0.70f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved.
|
||
|
|
||
| ... | ... | |
|
// Item
|
||
|
static void ItemHandleShortcut(ImGuiID id);
|
||
|
|
||
|
// Window Focus
|
||
|
static int FindWindowFocusIndex(ImGuiWindow* window);
|
||
|
static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags);
|
||
|
|
||
|
// Navigation
|
||
|
static void NavUpdate();
|
||
|
static void NavUpdateWindowing();
|
||
|
static void NavUpdateWindowingApplyFocus(ImGuiWindow* window);
|
||
|
static void NavUpdateWindowingOverlay();
|
||
|
static void NavUpdateCancelRequest();
|
||
|
static void NavUpdateCreateMoveRequest();
|
||
| ... | ... | |
|
static inline void NavUpdateAnyRequestFlag();
|
||
|
static void NavUpdateCreateWrappingRequest();
|
||
|
static void NavEndFrame();
|
||
|
static bool NavScoreItem(ImGuiNavItemData* result);
|
||
|
static bool NavScoreItem(ImGuiNavItemData* result, const ImRect& nav_bb);
|
||
|
static void NavApplyItemToResult(ImGuiNavItemData* result);
|
||
|
static void NavProcessItem();
|
||
|
static void NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flags, ImGuiNavMoveFlags move_flags);
|
||
| ... | ... | |
|
static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window);
|
||
|
static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window);
|
||
|
static void NavRestoreLayer(ImGuiNavLayer layer);
|
||
|
static int FindWindowFocusIndex(ImGuiWindow* window);
|
||
|
|
||
|
// Error Checking and Debug Tools
|
||
|
static void ErrorCheckNewFrameSanityChecks();
|
||
|
static void ErrorCheckEndFrameSanityChecks();
|
||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||
|
static void UpdateDebugToolItemPicker();
|
||
|
static void UpdateDebugToolStackQueries();
|
||
|
static void UpdateDebugToolItemPathQuery();
|
||
|
static void UpdateDebugToolFlashStyleColor();
|
||
|
#endif
|
||
|
|
||
| ... | ... | |
|
static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt);
|
||
|
|
||
|
// Misc
|
||
|
static void UpdateFontsNewFrame();
|
||
|
static void UpdateFontsEndFrame();
|
||
|
static void UpdateTexturesNewFrame();
|
||
|
static void UpdateTexturesEndFrame();
|
||
Update Dear ImGui to version 1.92.5.