Files
kaizen/docs/FAQ.md
irisz64 17c41323d9 Squashed 'external/imgui/' changes from f4d935909..3f0699cf0
3f0699cf0 Backends: Vulkan: Fix failing assertion for platforms where viewports are not supported (#8734)
adfa5364c Merge branch 'master' into docking
673eb7de9 Version 1.92.0
da3c86925 Demo: added TextLinkOpenURL() call in Widgets section.
2819ab32f Layout: commented out legacy ErrorCheckUsingSetCursorPosToExtendParentBoundaries() fallback. (#5548, #4510, #3355, #1760, #1490, #4152, #150)
6f21bed66 Fonts: removing assert from legacy PushFont() to mirror new PushFont(). for consistency.
719a3fe98 Additional comments on ErrorCheckUsingSetCursorPosToExtendParentBoundaries(). (#5548)
5bc70c68e Fonts: fix PushFont(NULL) to work as advertised.
dcf14505e Backends: SDLGPU: fixes call to SDL_MapGPUTransferBuffer(). Fixes artifacts on OSX/Metal. (#8465, #8703)
d8c695371 Fonts: comments.
e4bba0b53 Merge branch 'master' into docking
89b5a2c3d (Breaking) Fonts: removed ImFontFlags_DefaultToLegacySize.
97e0d5961 (Breaking) Fonts: removed PushFontSize(), PopFontSize().
ca72eb059 (Breaking) Fonts: obsolete PushFont() default parameter.
04a5b9c2c Backends: SDL3: fixed pulling SDL_PROP_WINDOW_COCOA_WINDOW_POINTER into viewport->PlatformHandleRaw. (#8725, #8726)
776897d3c Fonts: fixed PVS Studio false positive "expression 'cmd_count != draw_list->CmdBuffer.Size' is always false." (#8720, #8465)
7cd567202 Merge branch 'master' into docking
0218ddd57 Fonts: moved GetFont(), GetFontSize(), GetFontBaked() to higher section.
6722d789e (Breaking) Fonts: Removed support for PushFont(NULL) which was a shortcut for "default font".
6e846c56b Demo: fixed ID conflicts. (#8723)
608dd96de Fonts: fixed RenderText() asserting when crossing VtxOffset change boundaries. (#8720, #8465)
a49ddaac8 Fonts: add comments and examples for GlyphExcludeRanges[].
613a6a964 Fonts: AddFontDefault() adds to GlyphOffset.y instead of overriding it.
0dc2885f3 InputText: fix for InsertChars() to work on read-only buffer. (#8714, #8689, #8242)
efe2b21a5 Backends: GLFW: Fixed not installing WndProc hook in all GLFW version, so AddMouseSourceEvent() logic was missing for some viewports.
e132b444a Backends: GLFW: Fixed crash when using GLFW 3.3 (#8713, #8676, #8239, #8069)
4fde473f3 Backends: warning fixes (for docking branch).
afe20dc9b Backends: warning fix.
b580c1130 Merge branch 'master' into docking
e97e55adb Backends: Fixed various warnings discovered when using MinGW GCC 15/Clang on latest backends.
2f9c518ca Textures: ImTextureData::GetPixels() returns void* for clarity.
9a50c0917 Bsckends: SDL2, GLFW: fixed ImGui_ImplXXXX_GetContentScaleXXX functions never using SDL 2.0.4 & GLFW 3.3 path in master.
3a964d18e Comments on ImGuiMod_XXXX and ImGuiKey_GamepadXXXX values.
8d6e66d38 Backends: DX10, DX11, DX12, OpenGL3, Vulkan, WGPU: Assert when CreateDeviceObjects() calls return false.
f7dabede8 Backends: Allegro5: Fixed missing invisible mouse cursor, broken by ee8941e0d.
725d185a3 Backends: DirectX12: fixed build on MinGW. (#8702, #4594)
2a8c75f3e Backends: GLFW: amend for multi-context support with multi-viewport. (#8676, #8239, #8069)
c2c38beec Merge branch 'master' into docking
f633a6058 Backends: GLFW: Added support for multiple Dear ImGui contexts. (#8676, #8239, #8069)
d290e583c Backends: GLFW: fixed WndProc relying on current context. (#8676, #8239, #8069)
c56e8b496 imgui_freetype: fixed NULL that creeped in instead of nullptr.
344d5ff4b Merge branch 'master' into docking
b2c73596a InputText: fixed a buffer overrun that could happen when using dynamically resizing buffers. (#8689)
12626b85c InputText: minor changes to match for both insert chars paths to look more similar.
08bb34814 Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358)
041abe852 Revert "Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) [@radjkarl]"
39a90ac4d Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) [@radjkarl]
f2e4e8039 Windows: BeginChild(): fixed being unable to combine manual resize on one axis and automatic resize on the other axis. (#8690)
fe048efea DrawList, Fonts: fixed PushFont()/AddImage() not restoring correct atlas texture id when using multiple atlas (#8694)
24f7328e5 DrawList, Fonts: fixed ImFontAtlasTextureRepack() overwriting draw list shared data UV's etc. even when not bound. (#8694, #8465)
842837e35 imgui_freetype: fix conversion null -> bool in FontBakedLoadGlyph (#8696)
6b3cbb10a Backends: Vulkan: correct minimum pool size assertion (#8691)
d896eab16 Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing our viewports. Amend 7ac99a4 for docking. (#8644)
4cf85ee54 Merge branch 'master' into docking
cfa43e721 Windows: clicking on a window close button doesn't claim focus and bring to front. (#8683)
d8da97f75 Fonts: UpdateCurrentFontSize() early out doesn't need to clear FontBaked.
ca3169310 Fonts: fixed FontBaked=NULL in initial call to SetCurrentWindow() in Begin() using previous frame value of SkipItems. (#8465)
1ec1510ef Fonts: clarify assert. (#8680)
7ac99a436 Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing our view. (#8644)
b7f13df13 Docs: reformat Changelog.
571dae966 Backends: WGPU: added ImGuiBackendFlags_RendererHasTextures support. (#8465)
b178fd428 Backends: WebGPU: moved sampler creation out of ImGui_ImplWGPU_CreateFontsTexture().
115a8e74c Fonts: update misc comments, docs.
41f4acfb4 Fonts: add has_textures parameters to ImFontAtlasUpdateNewFrame().
7b8e00013 Fixed duplicate symbols in some compile-time configurations.
1ce75e2bc Fixed duplicate symbols in some compile-time configurations.
e8f831dea Merge branch 'master' into docking
f6fc16658 TreeNode: fixed runtime asan warning (#2920)
a0b3eceec Fixed using IMGUI_DISABLE_DEMO_WINDOWS without IMGUI_DISABLE_DEBUG_TOOLS and without linking with imgui_demo.cpp
7d70c0ff9 Merge branch 'master' into docking
7a42233d4 imgui_freetype: fixed using legacy names.
895bff652 Removed unneeded check in RenderText() loop + disable static analyzer false-positive warnings.
e43fd7537 Merge branch 'master' into docking
df068ce11 Various/misc fixes following back-and-forth dynamic_fonts->master->docking merges. Added missing API BREAKING CHANGES section.
e4055e763 Fonts: Misc merge fixes.
1e130e045 Examples: set ConfigDpiScaleFonts / ConfigDpiScaleViewports in all examples already setup for scaling.
65857236c Backends: GLFW, SDL2, SDL3, update for docking to use helpers.
6af6cec23 Merge branch 'master_fonts' into docking
96be95731 Docs: update Changelog, FAQ, Fonts docs.
4acce8565 Fonts: tweaks demo and exposure to sliders, etc.
cc3d4cab2 (Breaking) renamed ImFontConfig::FontBuilderFlags -> FontLoaderFlags. ImFontAtlas::FontBuilderFlags -> FontLoaderFlags. ImGuiFreeTypeBuilderFlags -> ImGuiFreeTypeLoaderFlags.
e1481a731 Fonts: fixed NewFrame() when atlas builder has been created but fonts not added. Fixed GetCustomRect() after atlas clear.
29fbf3c1e Fonts: demote ImFont::GetFontBaked() as slighty internal.
0e769c541 Fonts: amend UpdateCurentFontSize() early out optimization.
573f08135 Fonts: fixed PopFont() broken recovery.
2e67bd4de Fonts: rename to ImFontAtlasBuildLegacyPreloadAllGlyphRanges().
c18301f35 Examples: remove explicit font sizes from AddFontXXX() calls. Add commented out style.FontSizeBase assignment.
02f58b320 Fonts: AddFont() functions now allow size_pixels==0.0f (only required when using certain functions)
bc394410a Examples: Win32+DX9/DX10/DX11/DX12, SDL2+DX11/OpenGL2/OpenGL3/SDLRenderer/Vulkan, SDL3+OpenGL/SDLGPU/SDLRenderer/Vulkan: made example DPI aware by default. (master + docking: partial support for multi-dpi by scaling fonts + viewports but not style)
b98e92839 Backends: SDL2, SDL3, GLFW: Backport small part of c90ea13 from docking.
8269924c3 Backends: GLFW: added ImGui_ImplGlfw_GetContentScaleForMonitor(), ImGui_ImplGlfw_GetContentScaleForWindow() helpers.
9da3e6696 Backends: SDL2: added ImGui_ImplSDL2_GetDpiScaleForDisplay(), ImGui_ImplSDL2_GetContentScaleForWindow() helpers.
d72e66cde Examples: remove comments/references about baking and GetGlyphRangesJapanese().
2d2b1cee6 Fonts: internals: renamed g.FontSizeBeforeScaling to g.FontSizeBase for consistency.
3c27c643a Fonts: internals: renamed g.FontScale to g.FontBakedScale for clarity. Comments.
d85e22d20 Added style.FontScaleDpi which is the field overwritten by ImGuiConfigFlags_DpiEnableScaleFonts.
8766efcba (Breaking) Renamed io.FontGlobalScale to style.FontScaleMain.
80c08f228 (Breaking) Fonts: obsoleting SetWindowFontScale().
59a11363a Fonts: ground work for allowing SizePixels to be optional.
402db2ef3 Fonts: fixed passing negative sizes to stb_truetype loader.
1e118ab89 Fonts: added ImGuiStyle::FontSizeBase. Ensuring PushFontSize() works before main loop and across NewFrame().
b029be6b6 Fonts: avoid calling GetFontBaked() during SetFontSize(). Also fixes loading extraneous baked on atlas that will be locked
033cdc413 Fonts: comments and slight packing of ImFontConfig fields.
69547bd4b Fonts: ImFont::DefaultSize -> ImFont::LegacySize. ImFontFlags_UseDefaultSize -> ImFontFlags_DefaultToLegacySize.
e3860aa6a (Breaking) Fonts: removing obsolete ImFont::Scale.
25f9c318e Fonts: added "Input Glyphs Overlap Detection Tool". Added "Clear bakes", "Clear unused" buttons. Move code.
5926c877a Fonts: detect if ImFontAtlasUpdateNewFrame() is not being called.
9f8b4bdaf Fonts: fixed edge case calling RenderText() without priming with CalcTextSize().
b2343d624 Fonts: fallback to default default rasterizer density + pick one from existing viewports at the time of calling AddUpdateViewport().
83aad8127 Fonts: comments + made IMGUI_DEBUG_LOG_FONT() work without an ImGui context.
f3780c735 Fonts: adding GetFontBaked() in public API.
92ff15376 Fonts: added notes/comments and dummy type about renaming ImFontBuilderIO::GetBuilderForFreeType() to ImFontLoader::GetFontLoader().
3d848a886 Fonts: fixed support for IMGUI_STB_NAMESPACE.
822903e56 Fonts: fixed ImFontAtlas::RemoveFont() with multiple sources.
5ee984555 Fonts: automatically set current rasterizer density to viewport density. Effectively should fix most things on macOS.
ea756ede1 Fonts: reorder ImFontFlags according likelihood of being useful.
1b51a88bb Fonts: moved compare operators to internal. Removed commented out ones aimed legacy backends: not needed anymore since we didn't rename ImTextureID.
39f6c793b Fonts: proof of concept support for user textures.
91ed6e67b Fonts: fixed support for multiple atlases.
fad5280d4 Fonts: fixed broken support for legacy backend due to a mismatch with initial pre-build baked id.
65e603997 Fonts: remove unnecessary ImDrawListSharedData::FontAtlas which is actually getting in the way of using multiple atlases.
46fa9e8ef Fonts: Debug display status. Fixed truncated raw texture id. Fixed FormatTextureIDForDebugDisplay(). Comments.
f6735c223 Fonts: remove ImFontHooks in favor of a AddRemapChar() implementation.
89e880dfd Fonts: adding ImFontHooks for codepoint remapping.
8523cbdf5 Fonts: rework ImFontLoader::FontBakedLoadGlyph() interface
4dec946ae Fonts: don't pretend to half recover from OOM for now + debug log filename on load failure.
b32ef3c05 Fonts: make RasterizerDensity a dynamic field. (temporarily exposed as SetFontRasterizerDensity()).
8140a9d8a Fonts: comments on ImTextureData fields.
42e7bb80b imgui_freetype: removed anonymous namespace + extracting two functions outside of ImGui_ImplFreeType_FontSrcData.
6a455e128 imgui_freetype: moving data out of ImGui_ImplFreeType_FontSrcData.
5310f5fba Fonts: rework toward reducing reliance on ImFontConfig::DstFont since we ought to separate them.
2b0d49a90 Fonts: make ImFont::Sources a vector.
e7efe94fd Fonts: shallow rework of ImFontAtlasBakedAddFontGlyph() to facilitate upcoming change.
890fff92f Fonts: rename many internal functions for consistency. No other changes.
c4fa9bb61 Fonts: add ImFontGlyph::SourceIdx. Extract code out of DebugNodeFont() into DebugNodeFontGlyphesForSrcMask().
bcd1a94b8 Fonts: Extract ImFontAtlasBuildGetFontBaked() out of ImFont::GetFontBaked() mostly for consistency with upcoming changes + tweak locals in AddFont().
7840e453b Fonts: ImFontAtlasBuildInit() is always called with atlas->Builder == NULL.
eb650c468 Fonts: fixed unused variable warning.
c43b138a6 Fonts: no need to load current baked on SkipItems window? + removed unused field.
cdfa537ad Fonts: packing of shared basic/line/cursor data uses more public API.
ed2bb2cff Fonts: encode additional data in ImFontAtlasRectId to detect invalid id + added Rects debug browser.
0436fba13 Fonts: fixed compaction gc-ing baked fonts used in the current frame + rename.
e8035b94e Fonts: misc tidying up.
d789263e0 Fonts: internal rendering uses higher level functions.
12599da53 Fonts: do not mark whole ImTextureData struct as IMGUI_API to fix warning when used in ImVector<> (8559)
fb5c53708 Fonts: changing loader/backend or loader flags may be done without losing custom rects. Sharing more code.
526a5d0f8 Fonts: tidying up.
1ea9ff367 Fonts: add optional out parameter to AddCustomRect()
074bf39e4 Fonts: GC Compact All exposed in Metrics->Memory Allocations includes compacting texture data.
23dc46c4f Fonts: added RemoveCustomRect().
e9cf3de58 Fonts: moved ImFontAtlasRectId back to public API.
69d28f867 Fonts: added ImFontAtlasRectId_Invalid == -1
db30e1b5b (Breaking) Fonts: rework GetCustomRect() api. Reintroduce ImFontAtlasRect.
f40274702 (Breaking) Fonts: renamed AddCustomRectRegular() -> AddCustomRect().
253dff765 Fonts: Comments.
fc8708113 Fonts: fixed GetCustomRectUV().
9324961cd Fonts: fixed calling AddFontXXX not invalidating texture for legacy backends.
44498825c (Breaking) Fonts: PushFont() default to preserve current font size.
168b97c29 Fonts: removed size rounding in AddFont() which breaks relative sizing of merged fonts (8502)
2de15dc64 Fonts: fixed legacy backend path preloading all sources sizes erroneously + failing to use ellipsis.
5460903f9 Fonts: awkwardly alias old TexID name to TexRef using an union (may backtrack and just keep old name)
cb4c03756 Fonts: detect if backend assign to texture on creation but doesn't update Status.
a548cd993 Fonts: avoid both ImTextureRef fields being set simultaneously.
0fff7ceda Fonts: comments, tweaks, minor amends.
e41bf16ff Fonts: fixed ImTextureID() being zero-cleared instead of using ImTextureUserID_Invalid. .
8bd1fc4f0 Textures: Added ImTextureRef::GetTexID() mostly for consistency.
cc65015e4 Fonts: fixed crashing password fields.
41517bca0 (Breaking) Fonts: renamed CalcCustomRectUV() to GetCustomRectUV() for simplicity.
4048494aa Fonts: rename ImFontAtlasBuildClearTexture() to ImFontAtlasBuildClear().
f816b861f (Breaking) Fonts: rename GetCustomRectByIndex() to GetCustomRect(). Made return struct const.
85d050758 Fonts: narrowed invalid value for ImFontAtlasRectId to -1 a we will change implementation.
b12c42e75 Fonts: change uses of ImFontAtlasRect to ImTextureRect for simplicity.
e76cfe5aa Fonts: fixed implicit init when calling AddCustomRectRegular(). LoaderShutdown match BuildDestroy.
7ac1bff48 Fonts: fixed an issue calling legacy ImFontAtlas::Clear().
144f44421 Fonts: fixed memory leaks, shutting down font loader, and on AddFont() failure in FreeType backend.
52a686377 Textures: ImTextureData pixels are not immediately destroyed on setting ImTextureStatus_WantDestroy.
8ea0ae454 Fonts: fixed a bug using size specified by secondary font sources.
735d31e54 Demo: Exposed some basic UI in demo for sanity.
41a0e991f Fonts: Added UI to edit FreeType loader flags. Added ImFontAtlasBuildReloadAll() / ImFontAtlasBuildReloadFont()
40f988ce2 Fonts: in ShowFontAtlas() preserve open-state for latest texture. Improve debug display.
c98e3c0ef Fonts: ImFontConfig::GlyphExcludeRanges is owner and copied.
da51485e1 Fonts: Obsolete GetGlyphRangesXXX() functions. Update font documentation.
93410c47e Fonts: Fixed various small warnings / build issues.
dec8d3863 Fonts: Added a ImFontFlags_NoLoadError flag to let user code try file paths. (3611)
131f5c57a Textures: Detect when using a texture that's about to be destroyed.
0b7133912 Demo: Add a "Fonts" section for visibility.
161e22232 Fonts: GetFontBaked() default to searching for closest size font.
e98a314e0 Textures: Added ImTextureData::UsedRect.
2bf6879da Fonts: tidying up font scale logic.
ef6beaeff Fonts: removed LockSingleSrcConfigIdx which isn't needed anymore since we don't load glyphs in ImFontAtlasBuildAddFont().
d8a612f73 Fonts: Fallback glyph is now lazily loaded on demand (yay!). Moving ImFontBaked:: functions outside of class.
78a17038c imgui_freetype: no need to store metrics locally.
18c8a93cc Fonts: Rework ImFontLoader signatures.
c06a7585a Fonts: A font source can specify its own loader/backend.
1cfc0de31 Fonts: Core allocates per-baked-per-src backend buffers, to allow having custom backend per font source. Backend BakedInit/Destroy/AddGlyph process a single source.
d59f10d7f Fonts: reinstated ImFontAtlasBuildSetupFontCreateEllipsisFromDot() compatible with baked system, lazily baked.
76b252f80 Fonts: Added ImFontAtlasBakedSetFontGlyphBitmap().
92993e68c Fonts: Baked system, fix subsequent sources overriding shared font metrics.
dc1320df6 Fonts: ImFontFlags: ImFontFlags_NoLoadGlyphs + add ImFontFlags_LockBakedSizes
8a8d8a7b3 Fonts: Exposed CompactCache(). Hide ClearCache().
eb79e3ab3 Fonts: Restore a functional AddCustomRectFontGlyph().
815553c4b Fonts: ImFontConfig: added GlyphExcludeRanges[].
96786a183 Fonts: Create a fallback glyph if none is available (fix crash on fonts with no fallback)
066b24d74 Fonts: Fixed _OnChangedTextureID() asserting when calling on e.g. finalized drawlists.
82b81fce6 Fonts: PushFontSize() with -1 uses sources[0]'s size for now (backward compat design)
658059022 Fonts: Allow PushFont/NewFrame/PopFont idioms to function.
842c313db Fonts: Reordered ImFont fields.
99f6b305c Fonts: Baked system, v12: support GlyphOffset / GlyphMinAdvanceX / GlyphMaxAdvanceX by scaling from ref value.
df694c89b Fonts: Baked system, v11.
57d345ff8 Textures: Comments around ImTextureID type.
3ce753c48 Fonts: Debug dump to disk, debug log.
be151977c Fonts: Texture resizing favor growing height, halve pack nodes.
daaf0e4ef Fonts: Added PushFontSize(), PopFontSize() api. Added font_size param to PushFont() as well.
80404fae3 Fonts: clarify ClearTexData() as not supported with dynamic atlases.
093d01269 Fonts: Baked system, with auto-bind, v10.
7aba8da55 (Breaking) Fonts: CalcWordWrapPositionA() -> CalcWordWrapPosition(), takes size instead of scale as this will be needed.
a2371ef90 Internals: added ImStableVector<> helper.
fb69a09d6 Fonts: Fixed leak due to indirectly recursing ImFontAtlasPackInit().
c5653d5f3 Fonts: stb_truetype loader: Reworked scale handling to suggest this is not required caching.
b203ac1e0 Fonts: Reduced reliance on ImFontConfig::DstFont.
722f6013f Fonts: Added a bit of user facing tooling.
bd19bc508 Fonts: Removed BuildClearGlyphs(), conflated with ClearOutputData()
2bf6552f2 Fonts: Fixed/improved support for legacy backend. SetTexID() writes into our ImTextureData to keep the indirection, clear TexIsBuilt.
ba62becb7 (Breaking) Fonts: remove ImFontAtlasCustomRect which is now the same as ImTextureRect
a509790a1 Fonts: Added back support for AddCustomRectFontGlyph()
953ce90d2 Fonts: ImFontAtlasBuildInit() uses the occasion to sync HasTexUpdates from imgui context, narrowing the scope where it isn't set.
288055180 Fonts: Comments, remove ImFontAtlas facing BuildGrowTexture(), BuildCompactTexture(). Make IsBuilt() obsolete.
8ed4e2dde Fonts: Basic heuristic to repack instead of growing. Moved rects count/surface to internals.
2137b3448 Textures: Added atlas's TexMinWidth/TexMinHeight/TexMaxWidth/TexMaxHeight.
14614f561 Textures: Ensure UpdateBox is set on texture _WantCreate state too.
b06f3c6d1 Fonts: turn public facing BuildRegisterGlyph() into ImFontAtlasBuildAddFontGlyph() thats sets up UV.
4ff1631b3 Fonts: Rasterizing ellipsis character from dot as one glyph + avoid preloading if it not needed.
a2bc3d81c Fonts: Fixed support for multiple contexts.
cec3e945f Fonts: added ImFontAtlas::RemoveFont(), fixed various leaks.
df8450d92 Fonts: marked ImFontAtlas::Build() as obsolete
4399599de Fonts: ClearCache(), ImFontAtlasBuildGetTextureSizeEstimate(), tweak clearing functions.
ef1521b47 Fonts: fix for password fields
a51a26e2a Fonts: use a structure for post-processing - easier to pass things around and iterate on.
553b1c301 Fonts: repack without full reload, discard rectangle, fixed CustomRect api with stable id, remove public BuildInit().
a6c780192 Fonts: Measured and tweaked CalcTextSize() computation to minimize cost in our stress tests.
076a1ab85 Fonts: Misc amends, remove _PackNodesFactor, comments.
ac13683c2 Fonts: ImFontAtlas accept DrawListSharedData not being set.
43cc3fc8b Fonts: optimization bake FallbackAdvanceX into IndexAdvanceX[].
4f27792ff (Breaking) Removed atlas->TexDesiredWidth now unnecessary (github 327)
b670f799d Fonts: use TexGlyphPadding. Fixed packing issues. Removed old code.
0f553c57b Fonts: AddFont() actually does the work, so we can handle errors & return an accurate return value.
1269467fa imgui_freetype: Removing old code.
08e1e7681 imgui_freetype: Added Freetype implementation for new architecture.
26c017d5e Backends: Metal: added ImGuiBackendFlags_RendererHasTextures support.
ee8941e0d Backends: Allegro5: added ImGuiBackendFlags_RendererHasTextures support.
16fe666e3 Backends: SDLGPU3: added ImGuiBackendFlags_RendererHasTextures support.
e538883a2 Backends: SDL_Renderer3: added ImGuiBackendFlags_RendererHasTextures support.
9fa65cd19 Backends: SDL_Renderer2: added ImGuiBackendFlags_RendererHasTextures support.
abe294bfd Backends: Vulkan: added ImGuiBackendFlags_RendererHasTextures support.
0430c55b8 Backends: OpenGL2: added ImGuiBackendFlags_RendererHasTextures support.
dbb91a574 Backends: OpenGL3: added ImGuiBackendFlags_RendererHasTextures support.
eefe5d5aa Backends: DirectX12: added ImGuiBackendFlags_RendererHasTextures support.
2d2b1bc1c Backends: DirectX10: added ImGuiBackendFlags_RendererHasTextures support.
75efba7ec Backends: DirectX9: added ImGuiBackendFlags_RendererHasTextures support
372fd27e7 Backends: DirectX11: added ImGuiBackendFlags_RendererHasTextures support.
c20e160e0 Textures: added texture list pointer in ImDrawData.
208705368 Textures: Adding a RefCount to textures so backend can avoid destroying them on shutdown if atlas is shared.
a21a2e855 Textures: Single Textures[] array allows backend to not have to care about atlases.
ee357aadd Textures: Add ImTextureUserID_Invalid + introducing SetTexID().
2cde9125d Fonts: Selecting font config source list done by shared code.
0f0473bf1 Fonts, Textures: main code for ImGuiBackendFlags_RendererHasTextures feature.
191a728ec (Breaking) added ImTextureRef struct. Changed ImDrawCmd::TextureId to TexRef.
e55415bfe (Breaking) renamed/moved ImGuiConfigFlags_DpiEnableScaleFonts -> ioConfigDpiScaleFonts, ImGuiConfigFlags_DpiEnableScaleViewports -> io.ConfigDpiScaleViewports
b2f39318c Adding .cache to ignore list. (#8674)
201899b61 Backends: OpenGL3: Fixed using non-existing features on GLES 3.20 which would push a GL error. (#8664)
eaac68ca2 Merge branch 'master' into docking
c3d7ada9d Demo: add indentation to simplify upcoming merges.
91f72bbe1 Demo: omit ImGui:: prefix from ShowStyleEditor(), ShowUserGuide() code.
9485aeb5c Demo: changed default framed item width to use Min(GetFontSize() * 12, GetContentRegionAvail().x * 0.40f).
e877f78b0 TreeNode: minor amend to b7ab2b7. (#2920)
ef503ab0c TreeNode: fixed out of bound access in ImGuiTreeNodeFlags_DrawLinesXXX feature. (#2920)
b7ab2b752 TreeNode: fixed an issue where tree lines are not drawn on node opening frame. (#2920)
a92b53df7 Backends: Win32: Viewports: handle WM_DPICHANGED in backend when ImGuiConfigFlags_DpiEnableScaleViewports flag is enabled.
ac6b84a7d Viewports: fixed handling of simultaneous move + resize (e.g. toggling maximized) when ImGuiConfigFlags_DpiEnableScaleViewports is enabled.
5e17c0801 Merge branch 'master' into docking
69e1fb50c Docs: fixed missing commit credit. (#8656)
e6913f58b imgui_freetype: Update lunasvg API to support v3.0+ (#8656, #6842, #6591)
c3a3a39e9 Nav: fixed abnormal clipping disable over large ranges, could lead to stall. (#3841, #1725)
19289d587 Nav: fixed scroll fallback (when there are no interactive widgets to jump to) not being enabled on windows with menu or title bar.
c53c9a864 Clipper: further mitigation/improvements for abnormally large contents ranges (larger than e.g. 2^31). (#3609, #8215)
87a6443c5 Scroll: fixed contents size, scrollbar visibility and scrolling reet issue with abnormally large contents ranges. (#3609, #8215)
2bf57bbad Refactor: move SetCurrentFont(), PushFont(), PopFont() to a section.
77f1d3b31 Refactor: move SetCurrentFont(), PushFont(), PopFont() to a section.
407a0b972 (Breaking) Fonts: CalcWordWrapPositionA() -> CalcWordWrapPosition(), takes size instead of scale.
346f5c681 Platform IME: Fixed multi-viewports IME support, affecting SDL backends. (#8648, #8584, #7492, #6341)
5f0acadf7 RenderTextEllipsis() added breaking comments.
143924bbf Image(), ImageWithBg(): added extra comments. (#8131, #8238)
1ffa7a40a TextLinkOpenURL(): added bool return value on click. (#8645, #8451, #7660)
e11ad6b77 Merge branch 'master' into docking
415dddf0f Tooltips: tooltips have a maximum size corresponding to host display/monitor size.
10a0eb3e1 Alter windows min/max size logic to prioritize enforcing size_max bounds rather than size_min.
cdb5cbe6f (Breaking) Commented out ImGuiListClipper::ForceDisplayRangeByIndices() which was obsoleted in 1.89.6.
d93d918ec (Breaking) Commented out PushAllowKeyboardFocus()/PopAllowKeyboardFocus() which was obsoleted in 1.89.4. (#3092)
6d939fced (Breaking) TreeNode: renamed ImGuiTreeNodeFlags_NavLeftJumpsBackHere to ImGuiTreeNodeFlags_NavLeftJumpsToParent for clarity. (#1079, #8639)
9361c3517 Backends: SDL2, SDL3: maximum room for sanitizer to not be zealous.
c008c7d49 Merge remote-tracking branch 'origin/master' into docking
c90ea1315 Viewports: added per-viewport FramebufferScale, Platform_GetWindowFramebufferScale() + Backends: GLFW, SDL2, SDL3, Apple: added support. (#1065, #1542, #1676, #1786, #2826, #3757, #5081, #5580, #5592, #6465, #7273, #7779 etc.) )
63554bcee Backends: OSX: rename internal struct for consistency with other backends.
b5a73033a Examples: Apple: Amend build scripts and gitignore, fix misc OSX warnings. (#8637)
2df9e9b10 Examples: Apple: add Makefile for example_apple_metal, example_apple_opengl2. (#8637)
2fd474132 Update pull_request_template.md
4e487cfa9 stb_textedit: subsequent comments to match ocornut/stb branch. (#8635, #7925)
1387d356a stb_textedit: subsequent fixes for next/prev word impl (not used by imgui) + PageUp/Home/End (no side effect but more correct) (#8635, #7925)
5c3ac9333 stb_textedit: minor edits to match PR submitted upstream.
61242e2e6 InputText: fixed cursor positioning issue using up/down keys on non-ASCII text. (#8635, #7925)
08689c51a Backends: GLFW, SDL2, SDL3: include GLFW/SDL version number in io.BackendPlatformName.
4a6ba9539 Backends: SDL3: Comments (#6146)
e33069ce5 Viewports: fallback DpiScale pulled from fallback Monitor for consistency.
b9ac32a0d Backends: DirectX12: Make sure texture sampling in the dx12 backend is not limited to the highest mip. (#8631)
f484af34c Font: rename ImFont::AddRemapChar() parameters for clarity. (#609)
ba513ba80 Backends: DX10, DX11, DX12: honor FramebufferScale. (#8412)
0a222a3e2 Backends: Vulkan: fixed build with VK_NO_PROTOTYPES.
bf68040dc Backends: Vulkan: fixed build with VK_NO_PROTOTYPES.
37fba4bed Backends: Vulkan: fixed validation errors during window detach in multi-viewport mode. [docking branch amend] (#8600, #8176)
1c8fad73f Merge branch 'master' into docking
bbc89b639 Backends: Vulkan: fixed validation errors during window detach in multi-viewport mode. (#8600, #8176)
64a5e2748 Docs: bad merge error.
d1dc2a329 Backends: Vulkan: Load dynamic rendering functions using vkGetDeviceProcAddr() + try both non-KHR and KHR versions. (#8600, #8326, #8365)
46235e91f Examples: SDL3: specify SDL_WINDOW_HIGH_PIXEL_DENSITY and make centering consistent + call SDL_RenderScale().
afd3a36f6 Demo: added basic Fonts section under main demo (same as Metrics one) for visibility.
c5e2bb7cd Backends: SDLGPU3: Fixed creating atlas texture earlier than other backends.
ef62aa733 Backends: SDL3: macOS: Fixed secondary-viewports not appearing on a different monitor than the main viewport.
e3bfaab3f Examples: update xcode projects.
c0dfd65d6 Backends: Win32: Fixed an issue where externally losing mouse capture (due to e.g. focus loss) would fail to claim it again the next subsequent click. (#8594)
20066a896 Examples: DirectX12+Win32: also test for IsIconic() for sleeping since we don't seem to get a DXGI_STATUS_OCCLUDED signal when minimized. (#8603)
3f8033324 Demo: Dual List Box: fix sorting function, in theory should return 0 when equal. (#8601)
75ddd9a6c Backends: SDLGPU3: added support for ImDrawCallback_ResetRenderState. (#8599)
b3c96bde8 Demo: use IM_ARRAYSIZE more consistently InputText calls in demo window (#8596)
cbb8edb0b Tables: fixed an assert when combining Tables, Frozen Rows, Clipper and BeginMultiSelect() in a certain order. (#8595, #8250)
fcdaa3279 Backends: GLFW: Disable multi-viewports under Wayland. (#8587)
fe298cf98 Revert "Backends: SDL2, SDL3: viewports created with ImGuiViewportFlags_NoInputs are passing SDL_WINDOW_TOOLTIP to SDL_CreateWindow(). (#8576)"
75964a986 CI: run on ubuntu-latest.
b81991ac0 Backends: SDLGPU3: clear ImGuiBackendFlags_RendererHasViewports flag on shutdown.
2a000ee09 Backends: SDL2, SDL3: viewports created with ImGuiViewportFlags_NoInputs are passing SDL_WINDOW_TOOLTIP to SDL_CreateWindow(). (#8576)
f53de38e1 Viewports, Backends: Debug logging.
3563f4db3 Rework TextAligned() api to fix issues with baseline alignment + use standard CalcItemSize(). (#7024)
f2ba3a937 Rework TextAligned() api to take size input. (#7024)
0fc4967eb Rework TextAligned() api to fix issues with baseline alignment + use standard CalcItemSize(). (#7024)
aed1bcc12 Rework TextAligned() api to take size input. (#7024)
839e3274e Merge branch 'master' into docking
6a42d6b33 Added wp TextAligned() TextAlignedV(), TextAlignedExV() to internal API. (#7024)
dcf0d8cab Tables: fixed TableHeader() eager vertical clipping of text. (#6236)
7c6ce12fa Platform IME: minor amend to bf0f586 (#8584)
bf0f586b6 Platform IME: added ImGuiPlatformImeData::WantTextInput, ViewportId. Backends: SDL3: honor WantTextInput. (#8584, #7492, #6341)
facf671ec Demo: rename DockingSplitterSize slider label to DockingSeparatorSize for consistency. (#8579)
af987eb11 Backends: DX12: build fix for Clang. (#8582)
87f12e56f Backends: SDL_GPU: Added multi-viewport support. Amends + update example. (#8573, #8163, #7998, #7988)
baffc4e8b Backends: SDL_GPU: Added multi-viewport support. (#8573, #8163, #7998, #7988)
0ddc36f54 RenderTextEllipsis()): pixel align every dot for consistent display.
88d2df24b Merge branch 'master' into docking
69d572bb1 Fonts: reworked text ellipsis logic to ensure a "..." is always displayed instead of a single character. (#7024)
97d85338e Tabs: adjust handling of ellipsis now that Close Button visibility changed. (#8387) Internals: remove extra parameter to RenderTextEllipsis().
e4a865177 ImFont: added cpu clip fine option for ImFont::RenderChar() (which is technically internal).
faea19380 Internals: minor refactor of TabItemLabelAndCloseButton(), should be no-op.
7ab4728a3 Error Handling: added better error report and recovery when calling EndFrame() or Render() without NewFrame().
b23a216ec Examples: added SDL2+Vulkan, SDL3+Vulkan, GLFW+Vulkan makefiles. Amend ignore list. (#2480)
d3bb3336f Backends: OSX: remove duplicate variable. (#8565)
3ab50c334 TreeNode, Style: added style.TreeLinesRounding support. (#2920)

git-subtree-dir: external/imgui
git-subtree-split: 3f0699cf02b07c8312edbcd937f1881e3564d1ac
2025-06-26 22:18:57 +02:00

760 lines
48 KiB
Markdown

# FAQ (Frequently Asked Questions)
You may link to this document using short form:
https://www.dearimgui.com/faq
or its real address:
https://github.com/ocornut/imgui/blob/master/docs/FAQ.md
or view this file with any Markdown viewer.
## Index
| **Q&A: Basics** |
:---------------------------------------------------------- |
| [Where is the documentation?](#q-where-is-the-documentation) |
| [What is this library called?](#q-what-is-this-library-called) |
| [Which version should I get?](#q-which-version-should-i-get) |
| **Q&A: Integration** |
| **[How to get started?](#q-how-to-get-started)** |
| **[How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?](#q-how-can-i-tell-whether-to-dispatch-mousekeyboard-to-dear-imgui-or-my-application)** |
| [How can I enable keyboard or gamepad controls?](#q-how-can-i-enable-keyboard-or-gamepad-controls) |
| [How can I use this on a machine without mouse, keyboard or screen? (input share, remote display)](#q-how-can-i-use-this-on-a-machine-without-mouse-keyboard-or-screen-input-share-remote-display) |
| [I integrated Dear ImGui in my engine and little squares are showing instead of text...](#q-i-integrated-dear-imgui-in-my-engine-and-little-squares-are-showing-instead-of-text) |
| [I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-clipping-or-disappearing-when-i-move-windows-around) |
| [I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...](#q-i-integrated-dear-imgui-in-my-engine-and-some-elements-are-displaying-outside-their-expected-windows-boundaries) |
| **Q&A: Usage** |
| **[About the ID Stack system..<br>Why is my widget not reacting when I click on it?<br>Why is the wrong widget reacting when I click on one?<br>How can I have widgets with an empty label?<br>How can I have multiple widgets with the same label?<br>How can I have multiple windows with the same label?](#q-about-the-id-stack-system)** |
| [How can I display an image?](#q-how-can-i-display-an-image)<br>[What are ImTextureID/ImTextureRef?](#q-what-are-imtextureidimtextureref)|
| [How can I use maths operators with ImVec2?](#q-how-can-i-use-maths-operators-with-imvec2) |
| [How can I use my own maths types instead of ImVec2/ImVec4?](#q-how-can-i-use-my-own-maths-types-instead-of-imvec2imvec4) |
| [How can I interact with standard C++ types (such as std::string and std::vector)?](#q-how-can-i-interact-with-standard-c-types-such-as-stdstring-and-stdvector) |
| [How can I display custom shapes? (using low-level ImDrawList API)](#q-how-can-i-display-custom-shapes-using-low-level-imdrawlist-api) |
| **Q&A: Fonts, Text** |
| [How should I handle DPI in my application?](#q-how-should-i-handle-dpi-in-my-application) |
| [How can I load a different font than the default?](#q-how-can-i-load-a-different-font-than-the-default) |
| [How can I easily use icons in my application?](#q-how-can-i-easily-use-icons-in-my-application) |
| [How can I load multiple fonts?](#q-how-can-i-load-multiple-fonts) |
| [How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?](#q-how-can-i-display-and-input-non-latin-characters-such-as-chinese-japanese-korean-cyrillic) |
| **Q&A: Concerns** |
| [Who uses Dear ImGui?](#q-who-uses-dear-imgui) |
| [Can you create elaborate/serious tools with Dear ImGui?](#q-can-you-create-elaborateserious-tools-with-dear-imgui) |
| [Can you reskin the look of Dear ImGui?](#q-can-you-reskin-the-look-of-dear-imgui) |
| [Why using C++ (as opposed to C)?](#q-why-using-c-as-opposed-to-c) |
| **Q&A: Community** |
| [How can I help?](#q-how-can-i-help) |
# Q&A: Basics
### Q: Where is the documentation?
**This library is poorly documented at the moment and expects the user to be acquainted with C/C++.**
- The [Wiki](https://github.com/ocornut/imgui/wiki) is a hub to many resources and links.
- Handy [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide to integrate Dear ImGui in an existing application.
- 20+ standalone example applications using e.g. OpenGL/DirectX are provided in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder to explain how to integrate Dear ImGui with your own engine/application. You can run those applications and explore them.
- See demo code in [imgui_demo.cpp](https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp) and particularly the `ImGui::ShowDemoWindow()` function. The demo covers most features of Dear ImGui, so you can read the code and see its output.
- See documentation: [Backends](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md), [Examples](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md), [Fonts](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
- See documentation and comments at the top of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp) + general API comments in [imgui.h](https://github.com/ocornut/imgui/blob/master/imgui.h).
- The [Glossary](https://github.com/ocornut/imgui/wiki/Glossary) page may be useful.
- The [Issues](https://github.com/ocornut/imgui/issues) and [Discussions](https://github.com/ocornut/imgui/discussions) sections can be searched for past questions and issues.
- Your programming IDE is your friend, find the type or function declaration to find comments associated with it.
- The `ImGui::ShowMetricsWindow()` function exposes lots of internal information and tools. Although it is primarily designed as a debugging tool, having access to that information tends to help understands concepts.
##### [Return to Index](#index)
---
### Q. What is this library called?
**This library is called Dear ImGui**. Please refer to it as Dear ImGui (not ImGui, not IMGUI).
(The library misleadingly started its life in 2014 as "ImGui" due to the fact that I didn't give it a proper name when I released 1.0, and had no particular expectation that it would take off. However, the term IMGUI (immediate-mode graphical user interface) was coined before and is being used in variety of other situations e.g. Unity uses it own implementation of the IMGUI paradigm. To reduce the ambiguity without affecting existing code bases, I have decided in December 2015 a fully qualified name "Dear ImGui" for this library.
##### [Return to Index](#index)
---
### Q: Which version should I get?
I occasionally tag [Releases](https://github.com/ocornut/imgui/releases) but it is generally safe and recommended to sync to master/latest. The library is fairly stable and regressions tend to be fixed fast when reported.
You may use the ['docking'](https://github.com/ocornut/imgui/tree/docking) branch which includes:
- [Docking features](https://github.com/ocornut/imgui/wiki/Docking)
- [Multi-viewport features](https://github.com/ocornut/imgui/wiki/Multi-Viewports)
Many projects are using this branch and it is kept in sync with master regularly.
##### [Return to Index](#index)
----
# Q&A: Integration
### Q: How to get started?
Read [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started). <BR>
Read [EXAMPLES.md](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md). <BR>
Read [BACKENDS.md](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md). <BR>
Read `PROGRAMMER GUIDE` section of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp). <BR>
The [Wiki](https://github.com/ocornut/imgui/wiki) is a hub to many resources and links.
For first-time users having issues compiling/linking/running or issues loading fonts, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions).
##### [Return to Index](#index)
---
### Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?
You can read the `io.WantCaptureMouse`, `io.WantCaptureKeyboard` and `io.WantTextInput` flags from the ImGuiIO structure.
- When `io.WantCaptureMouse` is set, you need to discard/hide the mouse inputs from your underlying application.
- When `io.WantCaptureKeyboard` is set, you need to discard/hide the keyboard inputs from your underlying application.
- When `io.WantTextInput` is set, you can notify your OS/engine to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
Important: you should always pass your mouse/keyboard inputs to Dear ImGui, regardless of the value `io.WantCaptureMouse`/`io.WantCaptureKeyboard`. This is because e.g. we need to detect that you clicked in the void to unfocus its own windows, and other reasons.
```cpp
void MyLowLevelMouseButtonHandler(int button, bool down)
{
// (1) ALWAYS forward mouse data to ImGui! This is automatic with default backends. With your own backend:
ImGuiIO& io = ImGui::GetIO();
io.AddMouseButtonEvent(button, down);
// (2) ONLY forward mouse data to your underlying app/game.
if (!io.WantCaptureMouse)
my_game->HandleMouseData(...);
}
```
**Note:** The `io.WantCaptureMouse` is more correct that any manual attempt to "check if the mouse is hovering a window" (don't do that!). It handles mouse dragging correctly (both dragging that started over your application or over a Dear ImGui window) and handle e.g. popup and modal windows blocking inputs.
**Note:** Text input widget releases focus on the "KeyDown" event of the Return key, so the subsequent "KeyUp" event that your application receive will typically have `io.WantCaptureKeyboard == false`. Depending on your application logic it may or not be inconvenient to receive that KeyUp event. You might want to track which key-downs were targeted for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.)
##### [Return to Index](#index)
---
### Q: How can I enable keyboard or gamepad controls?
- The gamepad/keyboard navigation is fairly functional and keeps being improved. The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. Gamepad support is particularly useful to use Dear ImGui on a game console (e.g. PS4, Switch, XB1) without a mouse connected!
- Keyboard: set `io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard` to enable.
- Gamepad: set `io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad` to enable (with a supporting backend).
- See [Control Sheets for Gamepads](https://www.dearimgui.com/controls_sheets) (reference PNG/PSD for PS4, XB1, Switch gamepads).
- See `USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS` section of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp) for more details.
##### [Return to Index](#index)
---
### Q: How can I use this on a machine without mouse, keyboard or screen? (input share, remote display)
- You can share your computer mouse seamlessly with your console/tablet/phone using solutions such as [Synergy](https://symless.com/synergy)
This is the preferred solution for developer productivity.
In particular, the [micro-synergy-client repository](https://github.com/symless/micro-synergy-client) has simple
and portable source code (uSynergy.c/.h) for a small embeddable client that you can use on any platform to connect
to your host computer, based on the Synergy 1.x protocol. Make sure you download the Synergy 1 server on your computer.
Console SDK also sometimes provide equivalent tooling or wrapper for Synergy-like protocols.
- Game console users: consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback.
- You may also use a third party solution such as [netImgui](https://github.com/sammyfreg/netImgui), [Remote ImGui](https://github.com/JordiRos/remoteimgui) or [imgui-ws](https://github.com/ggerganov/imgui-ws) which sends the vertices to render over the local network, allowing you to use Dear ImGui even on a screen-less machine. See [Wiki](https://github.com/ocornut/imgui/wiki) index for most details.
- For touch inputs, you can increase the hit box of widgets (via the `style.TouchPadding` setting) to accommodate for the lack of precision of touch inputs, but it is recommended you use a mouse or gamepad to allow optimizing for screen real-estate and precision.
##### [Return to Index](#index)
---
### Q: I integrated Dear ImGui in my engine and little squares are showing instead of text...
Your renderer backend is not using the font texture correctly or it hasn't been uploaded to the GPU.
- If this happens using standard backends (before 1.92): A) have you modified the font atlas after `ImGui_ImplXXX_NewFrame()`? B) maybe the texture failed to upload, which **can if your texture atlas is too big**. Also see [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
- If this happens using standard backends (after 1.92): please report.
- If this happens with a custom backend: make sure you have uploaded the font texture to the GPU, that all shaders are rendering states are setup properly (e.g. texture is bound). Compare your code to existing backends and use a graphics debugger such as [RenderDoc](https://renderdoc.org) to debug your rendering states.
##### [Return to Index](#index)
---
### Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...
### Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...
You are probably mishandling the clipping rectangles in your render function.
Each draw command needs the triangle rendered using the clipping rectangle provided in the ImDrawCmd structure (`ImDrawCmd->CllipRect`).
Rectangles provided by Dear ImGui are defined as
`(x1=left,y1=top,x2=right,y2=bottom)`
and **NOT** as
`(x1,y1,width,height)`.
Refer to rendering backends in the [backends/](https://github.com/ocornut/imgui/tree/master/backends) folder for references of how to handle the `ClipRect` field.
For example, the [DirectX11 backend](https://github.com/ocornut/imgui/blob/master/backends/imgui_impl_dx11.cpp) does this:
```cpp
// Project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = draw_data->DisplayPos;
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;
// Apply scissor/clipping rectangle
const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
ctx->RSSetScissorRects(1, &r);
```
##### [Return to Index](#index)
---
# Q&A: Usage
### Q: About the ID Stack system...
### Q: Why is my widget not reacting when I click on it?
### Q: Why is the wrong widget reacting when I click on one?
### Q: How can I have widgets with an empty label?
### Q: How can I have multiple widgets with the same label?
### Q: How can I have multiple windows with the same label?
**USING THE SAME LABEL+ID IS THE MOST COMMON USER MISTAKE!**
<br>**USING AN EMPTY LABEL IS THE SAME AS USING THE SAME LABEL AS YOUR PARENT WIDGET!**
<table>
<tr>
<td><img src="https://github.com/user-attachments/assets/776a8315-1164-4178-9a8c-df52e0ff28aa"></td>
<td>
<pre lang="cpp">
ImGui::Begin("Incorrect!");
ImGui::DragFloat2("My value", &objects[0]->pos.x);
ImGui::DragFloat2("My value", &objects[1]->pos.x);
ImGui::DragFloat2("My value", &objects[2]->pos.x);
ImGui::End();
&nbsp;
ImGui::Begin("Correct!");
ImGui::DragFloat2("My value", &objects[0]->pos.x);
ImGui::DragFloat2("My value##2", &objects[1]->pos.x);
ImGui::DragFloat2("My value##3", &objects[2]->pos.x);
ImGui::End();
&nbsp;
ImGui::Begin("Also Correct!");
for (int n = 0; n < 3; n++)
{
ImGui::PushID(n);
ImGui::DragFloat2("My value", &objects[n]->pos.x);
ImGui::PopID();
}
ImGui::End();
</pre>
</td>
</tr>
</table>
A primer on labels and the ID Stack...
Dear ImGui internally needs to uniquely identify UI elements.
Elements that are typically not clickable (such as calls to the Text functions) don't need an ID.
Interactive widgets (such as calls to Button buttons) need a unique ID.
**Unique IDs are used internally to track active widgets and occasionally associate state to widgets.<BR>
Unique IDs are implicitly built from the hash of multiple elements that identify the "path" to the UI element.**
Since Dear ImGui 1.85, you can use `Demo>Tools>ID Stack Tool` or call `ImGui::ShowIDStackToolWindow()`. The tool display intermediate values leading to the creation of a unique ID, making things easier to debug and understand.
![Stack tool](https://user-images.githubusercontent.com/8225057/136235657-a0ea5665-dcd1-423f-9be6-dc3f8ced8f12.png)
- Unique ID are often derived from a string label and at minimum scoped within their host window:
```cpp
Begin("MyWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "OK")
Button("Cancel"); // Label = "Cancel", ID = hash of ("MyWindow", "Cancel")
End();
```
- Other elements such as tree nodes, etc. also pushes to the ID stack:
```cpp
Begin("MyWindow");
if (TreeNode("MyTreeNode"))
{
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "MyTreeNode", "OK")
TreePop();
}
End();
```
- Two items labeled "OK" in different windows or different tree locations won't collide:
```cpp
Begin("MyFirstWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyFirstWindow", "OK")
End();
Begin("MyOtherWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyOtherWindow", "OK")
End();
```
- If you have a same ID twice in the same location, you'll have a conflict:
```cpp
Begin("MyWindow");
Button("OK");
Button("OK"); // ERROR: ID collision with the first button! Interacting with either button will trigger the first one.
Button(""); // ERROR: ID collision with Begin("MyWindow")!
End();
```
Fear not! This is easy to solve and there are many ways to solve it!
- Solving ID conflict in a simple/local context:
When passing a label you can optionally specify extra ID information within the string itself.
Use "##" to pass a complement to the ID that won't be visible to the end-user.
This helps solve the simple collision cases when you know e.g. at compilation time which items
are going to be created:
```cpp
Begin("MyWindow");
Button("Play"); // Label = "Play", ID = hash of ("MyWindow", "Play")
Button("Play##foo1"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo1") // Different from other buttons
Button("Play##foo2"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo2") // Different from other buttons
Button("##foo"); // Label = "", ID = hash of ("MyWindow", "##foo") // Different from window
End();
```
- If you want to completely hide the label, but still need an ID:
```cpp
Checkbox("##On", &b); // Label = "", ID = hash of (..., "##On") // No visible label, just a checkbox!
```
- Occasionally/rarely you might want to change a label while preserving a constant ID. This allows
you to animate labels. For example, you may want to include varying information in a window title bar,
but windows are uniquely identified by their ID. Use "###" to pass a label that isn't part of ID:
```cpp
Button("Hello###ID"); // Label = "Hello", ID = hash of (..., "###ID")
Button("World###ID"); // Label = "World", ID = hash of (..., "###ID") // Same ID, different label
sprintf(buf, "My game (%f FPS)###MyGame", fps);
Begin(buf); // Variable title, ID = hash of "MyGame"
```
- Solving ID conflict in a more general manner:
Use `PushID()` / `PopID()` to create scopes and manipulate the ID stack, as to avoid ID conflicts
within the same window. This is the most convenient way of distinguishing ID when iterating and
creating many UI elements programmatically.
You can push a pointer, a string, or an integer value into the ID stack.
Remember that IDs are formed from the concatenation of _everything_ pushed into the ID stack.
At each level of the stack, we store the seed used for items at this level of the ID stack.
```cpp
Begin("Window");
for (int i = 0; i < 100; i++)
{
PushID(i); // Push i to the id tack
Button("Click"); // Label = "Click", ID = hash of ("Window", i, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj pointer, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj->Name);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj->Name, "Click")
PopID();
}
End();
```
- You can stack multiple prefixes into the ID stack:
```cpp
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
PushID("node");
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
PushID(my_ptr);
Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click")
PopID();
PopID();
```
- Tree nodes implicitly create a scope for you by calling `PushID()`:
```cpp
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
if (TreeNode("node")) // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag)
{
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
TreePop();
}
```
When working with trees, IDs are used to preserve the open/close state of each tree node.
Depending on your use cases you may want to use strings, indices, or pointers as ID.
- e.g. when following a single pointer that may change over time, using a static string as ID
will preserve your node open/closed state when the targeted object change.
- e.g. when displaying a list of objects, using indices or pointers as ID will preserve the
node open/closed state differently. See what makes more sense in your situation!
##### [Return to Index](#index)
---
### Q: How can I display an image?
### Q: What are ImTextureID/ImTextureRef?
**Short explanation:**
- Refer to [Image Loading and Displaying Examples](https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples) on the [Wiki](https://github.com/ocornut/imgui/wiki).
- You may use functions such as `ImGui::Image()`, `ImGui::ImageButton()` or lower-level `ImDrawList::AddImage()` to emit draw calls that will use your own textures.
- Actual textures are identified in a way that is up to the user/engine. Those identifiers are stored and passed as an opaque ImTextureID value.
- By default ImTextureID can store up to 64-bits. You may `#define` it to a custom type/structure if you need.
- Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason), but the examples linked above may be useful references.
**Details:**
1.92 introduced `ImTextureRef` in June 2025.
- Most drawing functions using ImTextureID were changed to use ImTextureRef.
- We intentionally do not provide an implicit ImTextureRef -> ImTextureID cast operator because it is technically lossy to convert ImTextureRef to ImTextureID before rendering.
**ImTextureID = backend specific, low-level identifier for a texture uploaded in GPU/graphics system.**
- When a Rendered Backend creates a texture, it store its native identifier into a ImTextureID value (e.g. Used by DX11 backend to a `ID3D11ShaderResourceView*`; Used by OpenGL backends to store `GLuint`; Used by SDLGPU backend to store a `SDL_GPUTextureSamplerBinding*`, etc.).
- User may submit their own textures to e.g. ImGui::Image() function by passing the same type.
- During the rendering loop, the Renderer Backend retrieve the ImTextureID, which stored inside a ImTextureRef, which is stored inside ImDrawCmd.
- Compile-time type configuration:
- To use something other than a 64-bit value: add '#define ImTextureID MyTextureType*' in your imconfig.h file.
- This can be whatever to you want it to be! read the FAQ entry about textures for details.
- You may decide to store a higher-level structure containing texture, sampler, shader etc. with various constructors if you like. You will need to implement ==/!= operators.
**ImTextureRef = higher-level identifier for a texture.**
- The identifier is valid even before the texture has been uploaded to the GPU/graphics system.
- This is what gets passed to functions such as `ImGui::Image()`, `ImDrawList::AddImage()`.
- This is what gets stored in draw commands (`ImDrawCmd`) to identify a texture during rendering.
- When a texture is created by user code (e.g. custom images), we directly stores the low-level `ImTextureID`.
- When a texture is created by the backend, we stores a `ImTextureData*` which becomes an indirection to extract the `ImTextureID` value during rendering, after texture upload has happened.
- There is no constructor to create a `ImTextureID` from a `ImTextureData*` as we don't expect this to be useful to the end-user, and it would be erroneously called by many legacy code.
- If you want to bind the current atlas when using custom rectangle, you can use `io.Fonts->TexRef`.
- Binding generators for languages such as C (which don't have constructors), should provide a helper, e.g. `inline ImTextureRef ImTextureRefFromID(ImTextureID tex_id) { ImTextureRef tex_ref = { ._TexData = NULL, .TexID = tex_id }; return tex_ref; }`
**Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward.**
Long explanation:
- Dear ImGui's job is to create "meshes", defined in a renderer-agnostic format made of draw commands and vertices. At the end of the frame, those meshes (ImDrawList) will be displayed by your rendering function. They are made up of textured polygons and the code to render them is generally fairly short (a few dozen lines). In the examples/ folder, we provide functions for popular graphics APIs (OpenGL, DirectX, etc.).
- Each rendering function decides on a data type to represent "textures". The concept of what is a "texture" is entirely tied to your underlying engine/graphics API.
We carry the information to identify a "texture" in the ImTextureID type, which itself tends to be stored inside a ImTextureRef.
ImTextureID default to ImU64 aka 8 bytes worth of data: just enough to store one pointer or integer of your choice.
Dear ImGui doesn't know or understand what you are storing in ImTextureID, it merely passes values until they reach your rendering function.
- In the [examples/](https://github.com/ocornut/imgui/tree/master/examples) backends, for each graphics API we decided on a type that is likely to be a good representation for specifying an image from the end-user perspective. This is what the _examples_ rendering functions are using:
```cpp
OpenGL:
- ImTextureID should contains 'GLuint' (GL texture identifier).
- See ImGui_ImplOpenGL3_RenderDrawData() function in imgui_impl_opengl3.cpp
```
```cpp
DirectX9:
- ImTextureID should contain a 'LPDIRECT3DTEXTURE9' (pointer).
- See ImGui_ImplDX9_RenderDrawData() function in imgui_impl_dx9.cpp
```
```cpp
DirectX11:
- ImTextureID should contain a 'ID3D11ShaderResourceView*' (pointer)
- See ImGui_ImplDX11_RenderDrawData() function in imgui_impl_dx11.cpp
```
```cpp
DirectX12:
- ImTextureID should contain a 'D3D12_GPU_DESCRIPTOR_HANDLE' (always 64-bits)
- See ImGui_ImplDX12_RenderDrawData() function in imgui_impl_dx12.cpp
```
For example, in the OpenGL example backend we store raw OpenGL texture identifier (GLuint) inside ImTextureID.
Whereas in the DirectX11 example backend we store a pointer to ID3D11ShaderResourceView inside ImTextureID, which is a higher-level structure tying together both the texture and information about its format and how to read it.
- If you have a custom engine built over e.g. OpenGL, instead of passing GLuint around you may decide to use a high-level data type to carry information about the texture as well as how to display it (shaders, etc.). The decision of what to use as ImTextureID can always be made better by knowing how your codebase is designed. If your engine has high-level data types for "textures" and "material" then you may want to use them.
If you are starting with OpenGL or DirectX or Vulkan and haven't built much of a rendering engine over them, keeping the default ImTextureID representation suggested by the example backends is probably the best choice.
(Advanced users may also decide to keep a low-level type in ImTextureID, use ImDrawList callback and pass information to their renderer)
User code may do:
```cpp
// Cast our texture type to ImTextureID
MyTexture* texture = g_CoffeeTableTexture;
ImGui::Image((ImTextureID)(intptr_t)texture, ImVec2(texture->Width, texture->Height));
```
The renderer function called after ImGui::Render() will receive that same value that the user code passed:
```cpp
// Cast ImTextureID stored in the draw command as our texture type
MyTexture* texture = (MyTexture*)(intptr_t)pcmd->GetTexID();
MyEngineBindTexture2D(texture);
```
Once you understand this design, you will understand that loading image files and turning them into displayable textures is not within the scope of Dear ImGui.
This is by design and is a good thing because it means your code has full control over your data types and how you display them.
If you want to display an image file (e.g. PNG file) on the screen, please refer to documentation and tutorials for the graphics API you are using.
Refer to [Image Loading and Displaying Examples](https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples) on the [Wiki](https://github.com/ocornut/imgui/wiki) to find simplified examples for loading textures with OpenGL, DirectX9 and DirectX11.
C/C++ tip: a u64 is 8 bytes. You may safely store any pointer or integer into it by casting your value to ImTextureID, and vice-versa.
Because both end-points (user code and rendering function) are under your control, you know exactly what is stored inside the ImTextureID.
Here are some examples:
```cpp
GLuint my_tex = XXX;
ImTextureID my_imtexid;
my_imtexid = (ImTextureID)(intptr_t)my_tex; // cast a GLuint into a ImTextureID (we don't take its address! we just copy the address)
my_tex = (GLuint)(intptr_t)my_imtexid; // cast a ImTextureID into a GLuint
ID3D11ShaderResourceView* my_dx11_srv = XXX;
ImTextureID my_imtexid;
my_imtexid = (ImTextureID)(intptr_t)my_dx11_srv; // cast a ID3D11ShaderResourceView* into an opaque ImTextureID
my_dx11_srv = (ID3D11ShaderResourceView*)(intptr_t)_my_imtexid; // cast a ImTextureID into a ID3D11ShaderResourceView*
```
Finally, you may call `ImGui::ShowMetricsWindow()` to explore/visualize/understand how the ImDrawList are generated.
##### [Return to Index](#index)
---
### Q: How can I use maths operators with ImVec2?
We do not export maths operators by default in imgui.h in order to not conflict with the use of your own maths types and maths operators. As a convenience, you may use `#define IMGUI_DEFINE_MATH_OPERATORS` + `#include "imgui.h"` to access our basic maths operators.
##### [Return to Index](#index)
---
### Q: How can I use my own maths types instead of ImVec2/ImVec4?
You can setup your [imconfig.h](https://github.com/ocornut/imgui/blob/master/imconfig.h) file with `IM_VEC2_CLASS_EXTRA`/`IM_VEC4_CLASS_EXTRA` macros to add implicit type conversions to our own maths types.
This way you will be able to use your own types everywhere, e.g. passing `MyVector2` or `glm::vec2` to ImGui functions instead of `ImVec2`.
##### [Return to Index](#index)
---
### Q: How can I interact with standard C++ types (such as std::string and std::vector)?
- Being highly portable (backends/bindings for several languages, frameworks, programming styles, obscure or older platforms/compilers), and aiming for compatibility & performance suitable for every modern real-time game engine, Dear ImGui does not use any of std C++ types. We use raw types (e.g. char* instead of std::string) because they adapt to more use cases.
- To use ImGui::InputText() with a std::string or any resizable string class, see [misc/cpp/imgui_stdlib.h](https://github.com/ocornut/imgui/blob/master/misc/cpp/imgui_stdlib.h).
- To use combo boxes and list boxes with `std::vector` or any other data structure: the `BeginCombo()/EndCombo()` API
lets you iterate and submit items yourself, so does the `ListBoxHeader()/ListBoxFooter()` API.
Prefer using them over the old and awkward `Combo()/ListBox()` api.
- Generally for most high-level types you should be able to access the underlying data type.
You may write your own one-liner wrappers to facilitate user code (tip: add new functions in ImGui:: namespace from your code).
- Dear ImGui applications often need to make intensive use of strings. It is expected that many of the strings you will pass
to the API are raw literals (free in C/C++) or allocated in a manner that won't incur a large cost on your application.
Please bear in mind that using `std::string` on applications with a large amount of UI may incur unsatisfactory performances.
Modern implementations of `std::string` often include small-string optimization (which is often a local buffer) but those
are not configurable and not the same across implementations.
- If you are finding your UI traversal cost to be too large, make sure your string usage is not leading to an excessive amount
of heap allocations. Consider using literals, statically sized buffers, and your own helper functions. A common pattern
is that you will need to build lots of strings on the fly, and their maximum length can be easily scoped ahead.
One possible implementation of a helper to facilitate printf-style building of strings: https://github.com/ocornut/Str
This is a small helper where you can instance strings with configurable local buffers length. Many game engines will
provide similar or better string helpers.
##### [Return to Index](#index)
---
### Q: How can I display custom shapes? (using low-level ImDrawList API)
- You can use the low-level `ImDrawList` api to render shapes within a window.
```cpp
ImGui::Begin("My shapes");
ImDrawList* draw_list = ImGui::GetWindowDrawList();
// Get the current ImGui cursor position
ImVec2 p = ImGui::GetCursorScreenPos();
// Draw a red circle
draw_list->AddCircleFilled(ImVec2(p.x + 50, p.y + 50), 30.0f, IM_COL32(255, 0, 0, 255));
// Draw a 3 pixel thick yellow line
draw_list->AddLine(ImVec2(p.x, p.y), ImVec2(p.x + 100.0f, p.y + 100.0f), IM_COL32(255, 255, 0, 255), 3.0f);
// Advance the ImGui cursor to claim space in the window (otherwise the window will appear small and needs to be resized)
ImGui::Dummy(ImVec2(200, 200));
ImGui::End();
```
![ImDrawList usage](https://raw.githubusercontent.com/wiki/ocornut/imgui/tutorials/CustomRendering01.png)
- Refer to "Demo > Examples > Custom Rendering" in the demo window and read the code of `ShowExampleAppCustomRendering()` in `imgui_demo.cpp` from more examples.
- To generate colors: you can use the macro `IM_COL32(255,255,255,255)` to generate them at compile time, or use `ImGui::GetColorU32(IM_COL32(255,255,255,255))` or `ImGui::GetColorU32(ImVec4(1.0f,1.0f,1.0f,1.0f))` to generate a color that is multiplied by the current value of `style.Alpha`.
- Math operators: if you have setup `IM_VEC2_CLASS_EXTRA` in `imconfig.h` to bind your own math types, you can use your own math types and their natural operators instead of ImVec2. ImVec2 by default doesn't export any math operators in the public API. You may use `#define IMGUI_DEFINE_MATH_OPERATORS` `#include "imgui.h"` to use our math operators, but instead prefer using your own math library and set it up in `imconfig.h`.
- You can use `ImGui::GetBackgroundDrawList()` or `ImGui::GetForegroundDrawList()` to access draw lists which will be displayed behind and over every other Dear ImGui window (one bg/fg drawlist per viewport). This is very convenient if you need to quickly display something on the screen that is not associated with a Dear ImGui window.
- You can also create your own empty window and draw inside it. Call Begin() with the NoBackground | NoDecoration | NoSavedSettings | NoInputs flags (The `ImGuiWindowFlags_NoDecoration` flag itself is a shortcut for NoTitleBar | NoResize | NoScrollbar | NoCollapse). Then you can retrieve the ImDrawList* via `GetWindowDrawList()` and draw to it in any way you like.
- You can create your own ImDrawList instance. You'll need to initialize them with `ImGui::GetDrawListSharedData()`, or create your own instancing `ImDrawListSharedData`, and then call your renderer function with your own ImDrawList or ImDrawData data.
- Looking for fun? The [ImDrawList coding party 2020](https://github.com/ocornut/imgui/issues/3606) thread is full of "don't do this at home" extreme uses of the ImDrawList API.
##### [Return to Index](#index)
---
# Q&A: Fonts, Text
### Q: How should I handle DPI in my application?
Since 1.92 (June 2025) fonts may be dynamically used at any size.
**Scaling fonts**
To change font size:
```cpp
ImGui::PushFont(NULL, 42.0f);
```
To change font and font size:
```cpp
ImGui::PushFont(new_font, 42.0f);
```
To scale all fonts:
```cpp
style.FontScaleDpi = 2.0f;
```
In `docking` branch or with multi-viewports:
```cpp
io.ConfigDpiScaleFonts = true; // [Experimental] Automatically overwrite style.FontScaleDpi in Begin() when Monitor DPI changes. This will scale fonts but _NOT_ scale sizes/padding for now.
io.ConfigDpiScaleViewports = true; // [Experimental] Scale Dear ImGui and Platform Windows when Monitor DPI changes.
```
**Scaling style** (paddings, spacings, thicknesses)
This is still massively work in progress, expect turbulence.
Style values are currently not easily scalable dynamically.
For single viewport application you can call once:
```cpp
style.ScaleAllSizes(factor); // call once!
```
If you need to change the scaling factor, it is currently most practical to reset the style and call this again with a new value.
Your UI code should avoid using hardcoded constants for size and positioning. Prefer to express values as multiple of reference values such as `ImGui::GetFontSize()` or `ImGui::GetFrameHeight()`. So e.g. instead of seeing a hardcoded height of 500 for a given item/window, you may want to use `30*ImGui::GetFontSize()` instead.
Down the line Dear ImGui will provide a variety of standardized reference values to facilitate using this. This is expected to happen during subsequent 1.92.x releases.
Applications in the `examples/` folder are partly DPI aware but they are unable to load a custom font from the file-system, so they look ugly (may change that in the future).
The reason DPI is not auto-magically solved in stock examples is that we don't yet have a satisfying solution for the "multi-dpi" problem (using the `docking` branch: when multiple viewport windows are over multiple monitors using different DPI scales) specifically for the `ImGuiStyle` structure. Fonts are however now perfectly scalable.
**On Windows, you need to inform Windows that your application is DPI aware!**
If this is not done, Windows will scale the application window and the UI text will be blurry. Potential solutions to indicate DPI awareness on Windows are:
- For SDL2: the flag `SDL_WINDOW_ALLOW_HIGHDPI` needs to be passed to `SDL_CreateWindow()` + call `::SetProcessDPIAware()`.
- For SDL3: the flag `SDL_WINDOW_HIGH_PIXEL_DENSITY` needs to be passed to `SDL_CreateWindow()`.
- For GLFW: this is done automatically.
- For other Windows projects with other backends, or wrapper projects:
- We provide a `ImGui_ImplWin32_EnableDpiAwareness()` helper method in the Win32 backend.
- Use an [application manifest file](https://learn.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process) to set the `<dpiAware>` property.
### Q: How can I load a different font than the default?
Use the font atlas to load the TTF/OTF file you want:
```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
```
Default is ProggyClean.ttf, monospace, rendered at size 13, embedded in dear imgui's source code.
(Tip: monospace fonts are convenient because they allow to facilitate horizontal alignment directly at the string level.)
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about font loading.)
New programmers: remember that in C/C++ and most programming languages if you want to use a
backslash \ within a string literal, you need to write it double backslash "\\":
```cpp
io.Fonts->AddFontFromFileTTF("MyFolder\MyFont.ttf", size); // WRONG (you are escaping the M here!)
io.Fonts->AddFontFromFileTTF("MyFolder\\MyFont.ttf", size); // CORRECT (Windows only)
io.Fonts->AddFontFromFileTTF("MyFolder/MyFont.ttf", size); // ALSO CORRECT
```
##### [Return to Index](#index)
---
### Q: How can I easily use icons in my application?
The most convenient and practical way is to merge an icon font such as FontAwesome inside your
main font. Then you can refer to icons within your strings.
Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about icons font loading.
##### [Return to Index](#index)
---
### Q: How can I load multiple fonts?
Use the font atlas to pack them into a single texture. Read [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) for more details.
##### [Return to Index](#index)
---
### Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
Since 1.92 (June 2025) and with an updated backend, it is not necessary to specify glyph ranges at all.
Before 1.92, when loading a font, pass custom Unicode ranges to specify the glyphs to load.
```cpp
// [BEFORE 1.92]
// Add default Japanese ranges
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, nullptr, io.Fonts->GetGlyphRangesJapanese());
// Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)
ImVector<ImWchar> ranges;
ImFontGlyphRangesBuilder builder;
builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
builder.AddChar(0x7262); // Add a specific character
builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted)
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", 16.0f, nullptr, ranges.Data);
```
All your strings need to use UTF-8 encoding.
You need to tell your compiler to use UTF-8, or in C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax.
Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!
See [About UTF-8 Encoding](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md#about-utf-8-encoding) section
of [FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) for details about UTF-8 Encoding.
Text input: it is up to your application to pass the right character code by calling `io.AddInputCharacter()`.
The applications in examples/ are doing that.
Windows: you can use the WM_CHAR or WM_UNICHAR or WM_IME_CHAR message (depending if your app is built using Unicode or MultiByte mode).
You may also use `MultiByteToWideChar()` or `ToUnicode()` to retrieve Unicode codepoints from MultiByte characters or keyboard state.
Windows: if your language is relying on an Input Method Editor (IME), you can write your HWND to `ImGui::GetMainViewport()->PlatformHandleRaw`
for the default implementation of `GetPlatformIO().Platform_SetImeDataFn()` to set your Microsoft IME position correctly.
##### [Return to Index](#index)
---
# Q&A: Concerns
### Q: Who uses Dear ImGui?
You may take a look at:
- [Quotes](https://github.com/ocornut/imgui/wiki/Quotes)
- [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui)
- [Funding & Sponsors](https://github.com/ocornut/imgui/wiki/Funding)
- [Gallery](https://github.com/ocornut/imgui/issues?q=label%3Agallery)
##### [Return to Index](#index)
---
### Q: Can you create elaborate/serious tools with Dear ImGui?
Yes. People have written game editors, data browsers, debuggers, profilers, and all sorts of non-trivial tools with the library. In my experience, the simplicity of the API is very empowering. Your UI runs close to your live data. Make the tools always-on and everybody in the team will be inclined to create new tools (as opposed to more "offline" UI toolkits where only a fraction of your team effectively creates tools). The list of sponsors below is also an indicator that serious game teams have been using the library.
Dear ImGui is very programmer-centric and the immediate-mode GUI paradigm might require you to readjust some habits before you can realize its full potential. Dear ImGui is about making things that are simple, efficient, and powerful.
Dear ImGui is built to be efficient and scalable toward the needs for AAA-quality applications running all day. The IMGUI paradigm offers different opportunities for optimization than the more typical RMGUI paradigm.
##### [Return to Index](#index)
---
### Q: Can you reskin the look of Dear ImGui?
Somewhat. You can alter the look of the interface to some degree: changing colors, sizes, padding, rounding, and fonts. However, as Dear ImGui is designed and optimized to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface. Dear ImGui is NOT designed to create a user interface for games, although with ingenious use of the low-level API you can do it.
A reasonably skinned application may look like (screenshot from [#2529](https://github.com/ocornut/imgui/issues/2529#issuecomment-524281119)):
![minipars](https://user-images.githubusercontent.com/314805/63589441-d9794f00-c5b1-11e9-8d96-cfc1b93702f7.png)
##### [Return to Index](#index)
---
### Q: Why using C++ (as opposed to C)?
Dear ImGui takes advantage of a few C++ language features for convenience but nothing anywhere Boost insanity/quagmire. Dear ImGui doesn't use any C++ header file. Dear ImGui uses a very small subset of C++11 features. In particular, function overloading and default parameters are used to make the API easier to use and code terser. Doing so I believe the API is sitting on a sweet spot and giving up on those features would make the API more cumbersome. Other features such as namespace, constructors, and templates (in the case of the ImVector<> class) are also relied on as a convenience.
There is an auto-generated [c-api for Dear ImGui (cimgui)](https://github.com/cimgui/cimgui) by Sonoro1234 and Stephan Dilly. It is designed for creating bindings to other languages. If possible, I would suggest using your target language functionalities to try replicating the function overloading and default parameters used in C++ else the API may be harder to use. Also see [Bindings](https://github.com/ocornut/imgui/wiki/Bindings) for various third-party bindings.
##### [Return to Index](#index)
---
# Q&A: Community
### Q: How can I help?
- Businesses: please reach out to `omar AT dearimgui.com` if you work in a place using Dear ImGui! We can discuss ways for your company to fund development via invoiced technical support, maintenance, or sponsoring contacts. This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people to work on this project. Please see [Funding](https://github.com/ocornut/imgui/wiki/Funding) page.
- Individuals: you can support continued maintenance and development via PayPal donations. See [README](https://github.com/ocornut/imgui/blob/master/docs/README.md).
- If you are experienced with Dear ImGui and C++, look at [GitHub Issues](https://github.com/ocornut/imgui/issues), [GitHub Discussions](https://github.com/ocornut/imgui/discussions), the [Wiki](https://github.com/ocornut/imgui/wiki), read [docs/TODO.txt](https://github.com/ocornut/imgui/blob/master/docs/TODO.txt), and see how you want to help and can help!
- Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere, etc.
You may post screenshots or links in the [gallery threads](https://github.com/ocornut/imgui/issues?q=label%3Agallery). Visuals are ideal as they inspire other programmers. Disclosing your use of Dear ImGui helps the library grow credibility, and helps other teams and programmers with taking decisions.
- If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues or sometimes incomplete PR.
##### [Return to Index](#index)