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
1246 lines
61 KiB
C++
1246 lines
61 KiB
C++
// dear imgui: Platform Backend for SDL3
|
|
// This needs to be used along with a Renderer (e.g. SDL_GPU, DirectX11, OpenGL3, Vulkan..)
|
|
// (Info: SDL3 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.)
|
|
|
|
// Implemented features:
|
|
// [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.
|
|
// [X] Platform: Mouse cursor shape and visibility (ImGuiBackendFlags_HasMouseCursors). Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
|
// [x] Platform: Multi-viewport support (multiple windows). Enable with 'io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable' -> the OS animation effect when window gets created/destroyed is problematic. SDL2 backend doesn't have issue.
|
|
// Missing features or Issues:
|
|
// [ ] Platform: Multi-viewport: Minimized windows seems to break mouse wheel events (at least under Windows).
|
|
// [x] Platform: IME support. Position somehow broken in SDL3 + 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.
|
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
|
// Learn about Dear ImGui:
|
|
// - FAQ https://dearimgui.com/faq
|
|
// - Getting Started https://dearimgui.com/getting-started
|
|
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
|
|
// - Introduction, links and more at the top of imgui.cpp
|
|
|
|
// CHANGELOG
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
// 2025-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
|
// 2025-05-15: [Docking] Add Platform_GetWindowFramebufferScale() handler, to allow varying Retina display density on multiple monitors.
|
|
// 2025-05-06: [Docking] macOS: fixed secondary viewports not appearing on other monitors before of parenting.
|
|
// 2025-04-09: [Docking] Revert update monitors and work areas information every frame. Only do it on Windows. (#8415, #8558)
|
|
// 2025-04-22: IME: honor ImGuiPlatformImeData->WantTextInput as an alternative way to call SDL_StartTextInput(), without IME being necessarily visible.
|
|
// 2025-04-09: Don't attempt to call SDL_CaptureMouse() on drivers where we don't call SDL_GetGlobalMouseState(). (#8561)
|
|
// 2025-03-30: Update for SDL3 api changes: Revert SDL_GetClipboardText() memory ownership change. (#8530, #7801)
|
|
// 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-25: [Docking] Revert to use SDL_GetDisplayBounds() for WorkPos/WorkRect if SDL_GetDisplayUsableBounds() failed.
|
|
// 2025-02-24: Avoid calling SDL_GetGlobalMouseState() when mouse is in relative mode.
|
|
// 2025-02-21: [Docking] Update monitors and work areas information every frame, as the later may change regardless of monitor changes. (#8415)
|
|
// 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_ImplSDL3_SetGamepadMode(ImGui_ImplSDL3_GamepadMode_Manual) accept an empty array.
|
|
// 2024-10-24: Emscripten: SDL_EVENT_MOUSE_WHEEL event doesn't require dividing by 100.0f on Emscripten.
|
|
// 2024-09-11: (Docking) Added support for viewport->ParentViewportId field to support parenting at OS level. (#7973)
|
|
// 2024-09-03: Update for SDL3 api changes: SDL_GetGamepads() memory ownership revert. (#7918, #7898, #7807)
|
|
// 2024-08-22: moved some OS/backend related function pointers from ImGuiIO to ImGuiPlatformIO:
|
|
// - io.GetClipboardTextFn -> platform_io.Platform_GetClipboardTextFn
|
|
// - io.SetClipboardTextFn -> platform_io.Platform_SetClipboardTextFn
|
|
// - io.PlatformSetImeDataFn -> platform_io.Platform_SetImeDataFn
|
|
// 2024-08-19: Storing SDL_WindowID inside ImGuiViewport::PlatformHandle instead of SDL_Window*.
|
|
// 2024-08-19: ImGui_ImplSDL3_ProcessEvent() now ignores events intended for other SDL windows. (#7853)
|
|
// 2024-07-22: Update for SDL3 api changes: SDL_GetGamepads() memory ownership change. (#7807)
|
|
// 2024-07-18: Update for SDL3 api changes: SDL_GetClipboardText() memory ownership change. (#7801)
|
|
// 2024-07-15: Update for SDL3 api changes: SDL_GetProperty() change to SDL_GetPointerProperty(). (#7794)
|
|
// 2024-07-02: Update for SDL3 api changes: SDLK_x renames and SDLK_KP_x removals (#7761, #7762).
|
|
// 2024-07-01: Update for SDL3 api changes: SDL_SetTextInputRect() changed to SDL_SetTextInputArea().
|
|
// 2024-06-26: Update for SDL3 api changes: SDL_StartTextInput()/SDL_StopTextInput()/SDL_SetTextInputRect() functions signatures.
|
|
// 2024-06-24: Update for SDL3 api changes: SDL_EVENT_KEY_DOWN/SDL_EVENT_KEY_UP contents.
|
|
// 2024-06-03; Update for SDL3 api changes: SDL_SYSTEM_CURSOR_ renames.
|
|
// 2024-05-15: Update for SDL3 api changes: SDLK_ renames.
|
|
// 2024-04-15: Inputs: Re-enable calling SDL_StartTextInput()/SDL_StopTextInput() as SDL3 no longer enables it by default and should play nicer with IME.
|
|
// 2024-02-13: Inputs: Fixed gamepad support. Handle gamepad disconnection. Added ImGui_ImplSDL3_SetGamepadMode().
|
|
// 2023-11-13: Updated for recent SDL3 API changes.
|
|
// 2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys, app back/forward keys.
|
|
// 2023-05-04: Fixed build on Emscripten/iOS/Android. (#6391)
|
|
// 2023-04-06: Inputs: Avoid calling SDL_StartTextInput()/SDL_StopTextInput() as they don't only pertain to IME. It's unclear exactly what their relation is to IME. (#6306)
|
|
// 2023-04-04: Inputs: Added support for io.AddMouseSourceEvent() to discriminate ImGuiMouseSource_Mouse/ImGuiMouseSource_TouchScreen. (#2702)
|
|
// 2023-02-23: Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. (#6189, #6114, #3644)
|
|
// 2023-02-07: Forked "imgui_impl_sdl2" into "imgui_impl_sdl3". Removed version checks for old feature. Refer to imgui_impl_sdl2.cpp for older changelog.
|
|
|
|
#include "imgui.h"
|
|
#ifndef IMGUI_DISABLE
|
|
#include "imgui_impl_sdl3.h"
|
|
|
|
// 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 <SDL3/SDL.h>
|
|
#include <stdio.h> // for snprintf()
|
|
#if defined(__APPLE__)
|
|
#include <TargetConditionals.h>
|
|
#endif
|
|
#ifdef _WIN32
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#if !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
|
|
|
|
// FIXME-LEGACY: remove when SDL 3.1.3 preview is released.
|
|
#ifndef SDLK_APOSTROPHE
|
|
#define SDLK_APOSTROPHE SDLK_QUOTE
|
|
#endif
|
|
#ifndef SDLK_GRAVE
|
|
#define SDLK_GRAVE SDLK_BACKQUOTE
|
|
#endif
|
|
|
|
// SDL Data
|
|
struct ImGui_ImplSDL3_Data
|
|
{
|
|
SDL_Window* Window;
|
|
SDL_WindowID WindowID;
|
|
SDL_Renderer* Renderer;
|
|
Uint64 Time;
|
|
char* ClipboardTextData;
|
|
char BackendPlatformName[48];
|
|
bool UseVulkan;
|
|
bool WantUpdateMonitors;
|
|
|
|
// IME handling
|
|
SDL_Window* ImeWindow;
|
|
|
|
// Mouse handling
|
|
Uint32 MouseWindowID;
|
|
int MouseButtonsDown;
|
|
SDL_Cursor* MouseCursors[ImGuiMouseCursor_COUNT];
|
|
SDL_Cursor* MouseLastCursor;
|
|
int MousePendingLeaveFrame;
|
|
bool MouseCanUseGlobalState;
|
|
bool MouseCanUseCapture;
|
|
bool MouseCanReportHoveredViewport; // This is hard to use/unreliable on SDL so we'll set ImGuiBackendFlags_HasMouseHoveredViewport dynamically based on state.
|
|
|
|
// Gamepad handling
|
|
ImVector<SDL_Gamepad*> Gamepads;
|
|
ImGui_ImplSDL3_GamepadMode GamepadMode;
|
|
bool WantUpdateGamepadsList;
|
|
|
|
ImGui_ImplSDL3_Data() { memset((void*)this, 0, sizeof(*this)); }
|
|
};
|
|
|
|
// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
|
|
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
|
|
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
|
|
// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
|
|
static ImGui_ImplSDL3_Data* ImGui_ImplSDL3_GetBackendData()
|
|
{
|
|
return ImGui::GetCurrentContext() ? (ImGui_ImplSDL3_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr;
|
|
}
|
|
|
|
// Forward Declarations
|
|
static void ImGui_ImplSDL3_UpdateMonitors();
|
|
static void ImGui_ImplSDL3_InitMultiViewportSupport(SDL_Window* window, void* sdl_gl_context);
|
|
static void ImGui_ImplSDL3_ShutdownMultiViewportSupport();
|
|
|
|
// Functions
|
|
static const char* ImGui_ImplSDL3_GetClipboardText(ImGuiContext*)
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
if (bd->ClipboardTextData)
|
|
SDL_free(bd->ClipboardTextData);
|
|
bd->ClipboardTextData = SDL_GetClipboardText();
|
|
return bd->ClipboardTextData;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetClipboardText(ImGuiContext*, const char* text)
|
|
{
|
|
SDL_SetClipboardText(text);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_PlatformSetImeData(ImGuiContext*, ImGuiViewport* viewport, ImGuiPlatformImeData* data)
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
SDL_WindowID window_id = (SDL_WindowID)(intptr_t)viewport->PlatformHandle;
|
|
SDL_Window* window = SDL_GetWindowFromID(window_id);
|
|
if ((!(data->WantVisible || data->WantTextInput) || bd->ImeWindow != window) && bd->ImeWindow != nullptr)
|
|
{
|
|
SDL_StopTextInput(bd->ImeWindow);
|
|
bd->ImeWindow = nullptr;
|
|
}
|
|
if (data->WantVisible)
|
|
{
|
|
SDL_Rect r;
|
|
r.x = (int)(data->InputPos.x - viewport->Pos.x);
|
|
r.y = (int)(data->InputPos.y - viewport->Pos.y + data->InputLineHeight);
|
|
r.w = 1;
|
|
r.h = (int)data->InputLineHeight;
|
|
SDL_SetTextInputArea(window, &r, 0);
|
|
bd->ImeWindow = window;
|
|
}
|
|
if (data->WantVisible || data->WantTextInput)
|
|
SDL_StartTextInput(window);
|
|
}
|
|
|
|
// Not static to allow third-party code to use that if they want to (but undocumented)
|
|
ImGuiKey ImGui_ImplSDL3_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode);
|
|
ImGuiKey ImGui_ImplSDL3_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
|
|
{
|
|
// Keypad doesn't have individual key values in SDL3
|
|
switch (scancode)
|
|
{
|
|
case SDL_SCANCODE_KP_0: return ImGuiKey_Keypad0;
|
|
case SDL_SCANCODE_KP_1: return ImGuiKey_Keypad1;
|
|
case SDL_SCANCODE_KP_2: return ImGuiKey_Keypad2;
|
|
case SDL_SCANCODE_KP_3: return ImGuiKey_Keypad3;
|
|
case SDL_SCANCODE_KP_4: return ImGuiKey_Keypad4;
|
|
case SDL_SCANCODE_KP_5: return ImGuiKey_Keypad5;
|
|
case SDL_SCANCODE_KP_6: return ImGuiKey_Keypad6;
|
|
case SDL_SCANCODE_KP_7: return ImGuiKey_Keypad7;
|
|
case SDL_SCANCODE_KP_8: return ImGuiKey_Keypad8;
|
|
case SDL_SCANCODE_KP_9: return ImGuiKey_Keypad9;
|
|
case SDL_SCANCODE_KP_PERIOD: return ImGuiKey_KeypadDecimal;
|
|
case SDL_SCANCODE_KP_DIVIDE: return ImGuiKey_KeypadDivide;
|
|
case SDL_SCANCODE_KP_MULTIPLY: return ImGuiKey_KeypadMultiply;
|
|
case SDL_SCANCODE_KP_MINUS: return ImGuiKey_KeypadSubtract;
|
|
case SDL_SCANCODE_KP_PLUS: return ImGuiKey_KeypadAdd;
|
|
case SDL_SCANCODE_KP_ENTER: return ImGuiKey_KeypadEnter;
|
|
case SDL_SCANCODE_KP_EQUALS: return ImGuiKey_KeypadEqual;
|
|
default: break;
|
|
}
|
|
switch (keycode)
|
|
{
|
|
case SDLK_TAB: return ImGuiKey_Tab;
|
|
case SDLK_LEFT: return ImGuiKey_LeftArrow;
|
|
case SDLK_RIGHT: return ImGuiKey_RightArrow;
|
|
case SDLK_UP: return ImGuiKey_UpArrow;
|
|
case SDLK_DOWN: return ImGuiKey_DownArrow;
|
|
case SDLK_PAGEUP: return ImGuiKey_PageUp;
|
|
case SDLK_PAGEDOWN: return ImGuiKey_PageDown;
|
|
case SDLK_HOME: return ImGuiKey_Home;
|
|
case SDLK_END: return ImGuiKey_End;
|
|
case SDLK_INSERT: return ImGuiKey_Insert;
|
|
case SDLK_DELETE: return ImGuiKey_Delete;
|
|
case SDLK_BACKSPACE: return ImGuiKey_Backspace;
|
|
case SDLK_SPACE: return ImGuiKey_Space;
|
|
case SDLK_RETURN: return ImGuiKey_Enter;
|
|
case SDLK_ESCAPE: return ImGuiKey_Escape;
|
|
//case SDLK_APOSTROPHE: return ImGuiKey_Apostrophe;
|
|
case SDLK_COMMA: return ImGuiKey_Comma;
|
|
//case SDLK_MINUS: return ImGuiKey_Minus;
|
|
case SDLK_PERIOD: return ImGuiKey_Period;
|
|
//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_GRAVE: return ImGuiKey_GraveAccent;
|
|
case SDLK_CAPSLOCK: return ImGuiKey_CapsLock;
|
|
case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock;
|
|
case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock;
|
|
case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen;
|
|
case SDLK_PAUSE: return ImGuiKey_Pause;
|
|
case SDLK_LCTRL: return ImGuiKey_LeftCtrl;
|
|
case SDLK_LSHIFT: return ImGuiKey_LeftShift;
|
|
case SDLK_LALT: return ImGuiKey_LeftAlt;
|
|
case SDLK_LGUI: return ImGuiKey_LeftSuper;
|
|
case SDLK_RCTRL: return ImGuiKey_RightCtrl;
|
|
case SDLK_RSHIFT: return ImGuiKey_RightShift;
|
|
case SDLK_RALT: return ImGuiKey_RightAlt;
|
|
case SDLK_RGUI: return ImGuiKey_RightSuper;
|
|
case SDLK_APPLICATION: return ImGuiKey_Menu;
|
|
case SDLK_0: return ImGuiKey_0;
|
|
case SDLK_1: return ImGuiKey_1;
|
|
case SDLK_2: return ImGuiKey_2;
|
|
case SDLK_3: return ImGuiKey_3;
|
|
case SDLK_4: return ImGuiKey_4;
|
|
case SDLK_5: return ImGuiKey_5;
|
|
case SDLK_6: return ImGuiKey_6;
|
|
case SDLK_7: return ImGuiKey_7;
|
|
case SDLK_8: return ImGuiKey_8;
|
|
case SDLK_9: return ImGuiKey_9;
|
|
case SDLK_A: return ImGuiKey_A;
|
|
case SDLK_B: return ImGuiKey_B;
|
|
case SDLK_C: return ImGuiKey_C;
|
|
case SDLK_D: return ImGuiKey_D;
|
|
case SDLK_E: return ImGuiKey_E;
|
|
case SDLK_F: return ImGuiKey_F;
|
|
case SDLK_G: return ImGuiKey_G;
|
|
case SDLK_H: return ImGuiKey_H;
|
|
case SDLK_I: return ImGuiKey_I;
|
|
case SDLK_J: return ImGuiKey_J;
|
|
case SDLK_K: return ImGuiKey_K;
|
|
case SDLK_L: return ImGuiKey_L;
|
|
case SDLK_M: return ImGuiKey_M;
|
|
case SDLK_N: return ImGuiKey_N;
|
|
case SDLK_O: return ImGuiKey_O;
|
|
case SDLK_P: return ImGuiKey_P;
|
|
case SDLK_Q: return ImGuiKey_Q;
|
|
case SDLK_R: return ImGuiKey_R;
|
|
case SDLK_S: return ImGuiKey_S;
|
|
case SDLK_T: return ImGuiKey_T;
|
|
case SDLK_U: return ImGuiKey_U;
|
|
case SDLK_V: return ImGuiKey_V;
|
|
case SDLK_W: return ImGuiKey_W;
|
|
case SDLK_X: return ImGuiKey_X;
|
|
case SDLK_Y: return ImGuiKey_Y;
|
|
case SDLK_Z: return ImGuiKey_Z;
|
|
case SDLK_F1: return ImGuiKey_F1;
|
|
case SDLK_F2: return ImGuiKey_F2;
|
|
case SDLK_F3: return ImGuiKey_F3;
|
|
case SDLK_F4: return ImGuiKey_F4;
|
|
case SDLK_F5: return ImGuiKey_F5;
|
|
case SDLK_F6: return ImGuiKey_F6;
|
|
case SDLK_F7: return ImGuiKey_F7;
|
|
case SDLK_F8: return ImGuiKey_F8;
|
|
case SDLK_F9: return ImGuiKey_F9;
|
|
case SDLK_F10: return ImGuiKey_F10;
|
|
case SDLK_F11: return ImGuiKey_F11;
|
|
case SDLK_F12: return ImGuiKey_F12;
|
|
case SDLK_F13: return ImGuiKey_F13;
|
|
case SDLK_F14: return ImGuiKey_F14;
|
|
case SDLK_F15: return ImGuiKey_F15;
|
|
case SDLK_F16: return ImGuiKey_F16;
|
|
case SDLK_F17: return ImGuiKey_F17;
|
|
case SDLK_F18: return ImGuiKey_F18;
|
|
case SDLK_F19: return ImGuiKey_F19;
|
|
case SDLK_F20: return ImGuiKey_F20;
|
|
case SDLK_F21: return ImGuiKey_F21;
|
|
case SDLK_F22: return ImGuiKey_F22;
|
|
case SDLK_F23: return ImGuiKey_F23;
|
|
case SDLK_F24: return ImGuiKey_F24;
|
|
case SDLK_AC_BACK: return ImGuiKey_AppBack;
|
|
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 void ImGui_ImplSDL3_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
io.AddKeyEvent(ImGuiMod_Ctrl, (sdl_key_mods & SDL_KMOD_CTRL) != 0);
|
|
io.AddKeyEvent(ImGuiMod_Shift, (sdl_key_mods & SDL_KMOD_SHIFT) != 0);
|
|
io.AddKeyEvent(ImGuiMod_Alt, (sdl_key_mods & SDL_KMOD_ALT) != 0);
|
|
io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & SDL_KMOD_GUI) != 0);
|
|
}
|
|
|
|
static ImGuiViewport* ImGui_ImplSDL3_GetViewportForWindowID(SDL_WindowID window_id)
|
|
{
|
|
return ImGui::FindViewportByPlatformHandle((void*)(intptr_t)window_id);
|
|
}
|
|
|
|
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
|
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
|
bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL3_Init()?");
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
switch (event->type)
|
|
{
|
|
case SDL_EVENT_MOUSE_MOTION:
|
|
{
|
|
if (ImGui_ImplSDL3_GetViewportForWindowID(event->motion.windowID) == nullptr)
|
|
return false;
|
|
ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
{
|
|
int window_x, window_y;
|
|
SDL_GetWindowPosition(SDL_GetWindowFromID(event->motion.windowID), &window_x, &window_y);
|
|
mouse_pos.x += window_x;
|
|
mouse_pos.y += window_y;
|
|
}
|
|
io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
|
|
io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
|
|
return true;
|
|
}
|
|
case SDL_EVENT_MOUSE_WHEEL:
|
|
{
|
|
if (ImGui_ImplSDL3_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);
|
|
float wheel_x = -event->wheel.x;
|
|
float wheel_y = event->wheel.y;
|
|
io.AddMouseSourceEvent(event->wheel.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
|
|
io.AddMouseWheelEvent(wheel_x, wheel_y);
|
|
return true;
|
|
}
|
|
case SDL_EVENT_MOUSE_BUTTON_DOWN:
|
|
case SDL_EVENT_MOUSE_BUTTON_UP:
|
|
{
|
|
if (ImGui_ImplSDL3_GetViewportForWindowID(event->button.windowID) == nullptr)
|
|
return false;
|
|
int mouse_button = -1;
|
|
if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
|
|
if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
|
|
if (event->button.button == SDL_BUTTON_MIDDLE) { mouse_button = 2; }
|
|
if (event->button.button == SDL_BUTTON_X1) { mouse_button = 3; }
|
|
if (event->button.button == SDL_BUTTON_X2) { mouse_button = 4; }
|
|
if (mouse_button == -1)
|
|
break;
|
|
io.AddMouseSourceEvent(event->button.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
|
|
io.AddMouseButtonEvent(mouse_button, (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN));
|
|
bd->MouseButtonsDown = (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) ? (bd->MouseButtonsDown | (1 << mouse_button)) : (bd->MouseButtonsDown & ~(1 << mouse_button));
|
|
return true;
|
|
}
|
|
case SDL_EVENT_TEXT_INPUT:
|
|
{
|
|
if (ImGui_ImplSDL3_GetViewportForWindowID(event->text.windowID) == nullptr)
|
|
return false;
|
|
io.AddInputCharactersUTF8(event->text.text);
|
|
return true;
|
|
}
|
|
case SDL_EVENT_KEY_DOWN:
|
|
case SDL_EVENT_KEY_UP:
|
|
{
|
|
ImGuiViewport* viewport = ImGui_ImplSDL3_GetViewportForWindowID(event->key.windowID);
|
|
if (viewport == nullptr)
|
|
return false;
|
|
//IMGUI_DEBUG_LOG("SDL_EVENT_KEY_%s : key=0x%08X ('%s'), scancode=%d ('%s'), mod=%X, windowID=%d, viewport=%08X\n",
|
|
// (event->type == SDL_EVENT_KEY_DOWN) ? "DOWN" : "UP ", event->key.key, SDL_GetKeyName(event->key.key), event->key.scancode, SDL_GetScancodeName(event->key.scancode), event->key.mod, event->key.windowID, viewport ? viewport->ID : 0);
|
|
ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.mod);
|
|
ImGuiKey key = ImGui_ImplSDL3_KeyEventToImGuiKey(event->key.key, event->key.scancode);
|
|
io.AddKeyEvent(key, (event->type == SDL_EVENT_KEY_DOWN));
|
|
io.SetKeyEventNativeData(key, (int)event->key.key, (int)event->key.scancode, (int)event->key.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions.
|
|
return true;
|
|
}
|
|
case SDL_EVENT_DISPLAY_ORIENTATION:
|
|
case SDL_EVENT_DISPLAY_ADDED:
|
|
case SDL_EVENT_DISPLAY_REMOVED:
|
|
case SDL_EVENT_DISPLAY_MOVED:
|
|
case SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED:
|
|
{
|
|
bd->WantUpdateMonitors = true;
|
|
return true;
|
|
}
|
|
case SDL_EVENT_WINDOW_MOUSE_ENTER:
|
|
{
|
|
if (ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID) == nullptr)
|
|
return false;
|
|
bd->MouseWindowID = event->window.windowID;
|
|
bd->MousePendingLeaveFrame = 0;
|
|
return true;
|
|
}
|
|
// - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late,
|
|
// causing SDL_WINDOWEVENT_LEAVE on previous frame to interrupt drag operation by clear mouse position. This is why
|
|
// we delay process the SDL_WINDOWEVENT_LEAVE events by one frame. See issue #5012 for details.
|
|
// FIXME: Unconfirmed whether this is still needed with SDL3.
|
|
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
|
|
{
|
|
if (ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID) == nullptr)
|
|
return false;
|
|
bd->MousePendingLeaveFrame = ImGui::GetFrameCount() + 1;
|
|
return true;
|
|
}
|
|
case SDL_EVENT_WINDOW_FOCUS_GAINED:
|
|
case SDL_EVENT_WINDOW_FOCUS_LOST:
|
|
{
|
|
ImGuiViewport* viewport = ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID);
|
|
if (viewport == nullptr)
|
|
return false;
|
|
//IMGUI_DEBUG_LOG("%s: windowId %d, viewport: %08X\n", (event->type == SDL_EVENT_WINDOW_FOCUS_GAINED) ? "SDL_EVENT_WINDOW_FOCUS_GAINED" : "SDL_WINDOWEVENT_FOCUS_LOST", event->window.windowID, viewport ? viewport->ID : 0);
|
|
io.AddFocusEvent(event->type == SDL_EVENT_WINDOW_FOCUS_GAINED);
|
|
return true;
|
|
}
|
|
case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
|
|
case SDL_EVENT_WINDOW_MOVED:
|
|
case SDL_EVENT_WINDOW_RESIZED:
|
|
{
|
|
ImGuiViewport* viewport = ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID);
|
|
if (viewport == NULL)
|
|
return false;
|
|
if (event->type == SDL_EVENT_WINDOW_CLOSE_REQUESTED)
|
|
viewport->PlatformRequestClose = true;
|
|
if (event->type == SDL_EVENT_WINDOW_MOVED)
|
|
viewport->PlatformRequestMove = true;
|
|
if (event->type == SDL_EVENT_WINDOW_RESIZED)
|
|
viewport->PlatformRequestResize = true;
|
|
return true;
|
|
}
|
|
case SDL_EVENT_GAMEPAD_ADDED:
|
|
case SDL_EVENT_GAMEPAD_REMOVED:
|
|
{
|
|
bd->WantUpdateGamepadsList = true;
|
|
return true;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetupPlatformHandles(ImGuiViewport* viewport, SDL_Window* window)
|
|
{
|
|
viewport->PlatformHandle = (void*)(intptr_t)SDL_GetWindowID(window);
|
|
viewport->PlatformHandleRaw = nullptr;
|
|
#if defined(_WIN32) && !defined(__WINRT__)
|
|
viewport->PlatformHandleRaw = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr);
|
|
#elif defined(__APPLE__)
|
|
viewport->PlatformHandleRaw = SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, nullptr);
|
|
#endif
|
|
}
|
|
|
|
static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer, void* sdl_gl_context)
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
IMGUI_CHECKVERSION();
|
|
IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!");
|
|
IM_UNUSED(sdl_gl_context); // Unused in this branch
|
|
//SDL_SetHint(SDL_HINT_EVENT_LOGGING, "2");
|
|
|
|
const int ver_linked = SDL_GetVersion();
|
|
|
|
// Setup backend capabilities flags
|
|
ImGui_ImplSDL3_Data* bd = IM_NEW(ImGui_ImplSDL3_Data)();
|
|
snprintf(bd->BackendPlatformName, sizeof(bd->BackendPlatformName), "imgui_impl_sdl3 (%d.%d.%d; %d.%d.%d)",
|
|
SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_MICRO_VERSION, SDL_VERSIONNUM_MAJOR(ver_linked), SDL_VERSIONNUM_MINOR(ver_linked), SDL_VERSIONNUM_MICRO(ver_linked));
|
|
io.BackendPlatformUserData = (void*)bd;
|
|
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)
|
|
// (ImGuiBackendFlags_PlatformHasViewports may be set just below)
|
|
|
|
bd->Window = window;
|
|
bd->WindowID = SDL_GetWindowID(window);
|
|
bd->Renderer = renderer;
|
|
|
|
// SDL on Linux/OSX doesn't report events for unfocused windows (see https://github.com/ocornut/imgui/issues/4960)
|
|
// We will use 'MouseCanReportHoveredViewport' to set 'ImGuiBackendFlags_HasMouseHoveredViewport' dynamically each frame.
|
|
#ifndef __APPLE__
|
|
bd->MouseCanReportHoveredViewport = bd->MouseCanUseGlobalState;
|
|
#else
|
|
bd->MouseCanReportHoveredViewport = false;
|
|
#endif
|
|
|
|
// 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
|
|
if (bd->MouseCanUseGlobalState)
|
|
io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
|
|
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
platform_io.Platform_SetClipboardTextFn = ImGui_ImplSDL3_SetClipboardText;
|
|
platform_io.Platform_GetClipboardTextFn = ImGui_ImplSDL3_GetClipboardText;
|
|
platform_io.Platform_SetImeDataFn = ImGui_ImplSDL3_PlatformSetImeData;
|
|
platform_io.Platform_OpenInShellFn = [](ImGuiContext*, const char* url) { return SDL_OpenURL(url) == 0; };
|
|
|
|
// Update monitor a first time during init
|
|
ImGui_ImplSDL3_UpdateMonitors();
|
|
|
|
// Gamepad handling
|
|
bd->GamepadMode = ImGui_ImplSDL3_GamepadMode_AutoFirst;
|
|
bd->WantUpdateGamepadsList = true;
|
|
|
|
// Load mouse cursors
|
|
bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_DEFAULT);
|
|
bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_TEXT);
|
|
bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_MOVE);
|
|
bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NS_RESIZE);
|
|
bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_EW_RESIZE);
|
|
bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NESW_RESIZE);
|
|
bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NWSE_RESIZE);
|
|
bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_POINTER);
|
|
bd->MouseCursors[ImGuiMouseCursor_Wait] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAIT);
|
|
bd->MouseCursors[ImGuiMouseCursor_Progress] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_PROGRESS);
|
|
bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NOT_ALLOWED);
|
|
|
|
// Set platform dependent data in viewport
|
|
// Our mouse update function expect PlatformHandle to be filled for the main viewport
|
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
|
ImGui_ImplSDL3_SetupPlatformHandles(main_viewport, window);
|
|
|
|
// From 2.0.5: Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event.
|
|
// Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered.
|
|
// (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application.
|
|
// It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click:
|
|
// you can ignore SDL_EVENT_MOUSE_BUTTON_DOWN events coming right after a SDL_EVENT_WINDOW_FOCUS_GAINED)
|
|
SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
|
|
|
|
// From 2.0.22: Disable auto-capture, this is preventing drag and drop across multiple windows (see #5710)
|
|
SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0");
|
|
|
|
// SDL 3.x : see https://github.com/libsdl-org/SDL/issues/6659
|
|
SDL_SetHint("SDL_BORDERLESS_WINDOWED_STYLE", "0");
|
|
|
|
// We need SDL_CaptureMouse(), SDL_GetGlobalMouseState() from SDL 2.0.4+ to support multiple viewports.
|
|
// We left the call to ImGui_ImplSDL3_InitPlatformInterface() outside of #ifdef to avoid unused-function warnings.
|
|
if (io.BackendFlags & ImGuiBackendFlags_PlatformHasViewports)
|
|
ImGui_ImplSDL3_InitMultiViewportSupport(window, sdl_gl_context);
|
|
|
|
return true;
|
|
}
|
|
|
|
// Should technically be a SDL_GLContext but due to typedef it is sane to keep it void* in public interface.
|
|
bool ImGui_ImplSDL3_InitForOpenGL(SDL_Window* window, void* sdl_gl_context)
|
|
{
|
|
return ImGui_ImplSDL3_Init(window, nullptr, sdl_gl_context);
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForVulkan(SDL_Window* window)
|
|
{
|
|
if (!ImGui_ImplSDL3_Init(window, nullptr, nullptr))
|
|
return false;
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
bd->UseVulkan = true;
|
|
return true;
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForD3D(SDL_Window* window)
|
|
{
|
|
#if !defined(_WIN32)
|
|
IM_ASSERT(0 && "Unsupported");
|
|
#endif
|
|
return ImGui_ImplSDL3_Init(window, nullptr, nullptr);
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForMetal(SDL_Window* window)
|
|
{
|
|
return ImGui_ImplSDL3_Init(window, nullptr, nullptr);
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer)
|
|
{
|
|
return ImGui_ImplSDL3_Init(window, renderer, nullptr);
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForSDLGPU(SDL_Window* window)
|
|
{
|
|
return ImGui_ImplSDL3_Init(window, nullptr, nullptr);
|
|
}
|
|
|
|
bool ImGui_ImplSDL3_InitForOther(SDL_Window* window)
|
|
{
|
|
return ImGui_ImplSDL3_Init(window, nullptr, nullptr);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_CloseGamepads();
|
|
|
|
void ImGui_ImplSDL3_Shutdown()
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?");
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
ImGui_ImplSDL3_ShutdownMultiViewportSupport();
|
|
|
|
if (bd->ClipboardTextData)
|
|
SDL_free(bd->ClipboardTextData);
|
|
for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
|
|
SDL_DestroyCursor(bd->MouseCursors[cursor_n]);
|
|
ImGui_ImplSDL3_CloseGamepads();
|
|
|
|
io.BackendPlatformName = nullptr;
|
|
io.BackendPlatformUserData = nullptr;
|
|
io.BackendFlags &= ~(ImGuiBackendFlags_HasMouseCursors | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_HasGamepad | ImGuiBackendFlags_PlatformHasViewports | ImGuiBackendFlags_HasMouseHoveredViewport);
|
|
IM_DELETE(bd);
|
|
}
|
|
|
|
// This code is incredibly messy because some of the functions we need for full viewport support are not available in SDL < 2.0.4.
|
|
static void ImGui_ImplSDL3_UpdateMouseData()
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
// We forward mouse input when hovered or captured (via SDL_EVENT_MOUSE_MOTION) or when focused (below)
|
|
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
|
|
// - 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_Window* focused_window = SDL_GetKeyboardFocus();
|
|
const bool is_app_focused = (focused_window && (bd->Window == focused_window || ImGui_ImplSDL3_GetViewportForWindowID(SDL_GetWindowID(focused_window)) != NULL));
|
|
#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)
|
|
{
|
|
// (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when io.ConfigNavMoveSetMousePos is enabled by user)
|
|
if (io.WantSetMousePos)
|
|
{
|
|
#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
SDL_WarpMouseGlobal(io.MousePos.x, io.MousePos.y);
|
|
else
|
|
#endif
|
|
SDL_WarpMouseInWindow(bd->Window, io.MousePos.x, io.MousePos.y);
|
|
}
|
|
|
|
// (Optional) Fallback to provide mouse position when focused (SDL_EVENT_MOUSE_MOTION already provides this when hovered or captured)
|
|
const bool is_relative_mouse_mode = SDL_GetWindowRelativeMouseMode(bd->Window);
|
|
if (bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0 && !is_relative_mouse_mode)
|
|
{
|
|
// 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)
|
|
// Multi-viewport mode: mouse position in OS absolute coordinates (io.MousePos is (0,0) when the mouse is on the upper-left of the primary monitor)
|
|
float mouse_x, mouse_y;
|
|
int window_x, window_y;
|
|
SDL_GetGlobalMouseState(&mouse_x, &mouse_y);
|
|
if (!(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable))
|
|
{
|
|
SDL_GetWindowPosition(focused_window, &window_x, &window_y);
|
|
mouse_x -= window_x;
|
|
mouse_y -= window_y;
|
|
}
|
|
io.AddMousePosEvent((float)mouse_x, (float)mouse_y);
|
|
}
|
|
}
|
|
|
|
// (Optional) When using multiple viewports: call io.AddMouseViewportEvent() with the viewport the OS mouse cursor is hovering.
|
|
// If ImGuiBackendFlags_HasMouseHoveredViewport is not set by the backend, Dear imGui will ignore this field and infer the information using its flawed heuristic.
|
|
// - [!] SDL backend does NOT correctly ignore viewports with the _NoInputs flag.
|
|
// Some backend are not able to handle that correctly. If a backend report an hovered viewport that has the _NoInputs flag (e.g. when dragging a window
|
|
// for docking, the viewport has the _NoInputs flag in order to allow us to find the viewport under), then Dear ImGui is forced to ignore the value reported
|
|
// by the backend, and use its flawed heuristic to guess the viewport behind.
|
|
// - [X] SDL backend correctly reports this regardless of another viewport behind focused and dragged from (we need this to find a useful drag and drop target).
|
|
if (io.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
|
|
{
|
|
ImGuiID mouse_viewport_id = 0;
|
|
if (ImGuiViewport* mouse_viewport = ImGui_ImplSDL3_GetViewportForWindowID(bd->MouseWindowID))
|
|
mouse_viewport_id = mouse_viewport->ID;
|
|
io.AddMouseViewportEvent(mouse_viewport_id);
|
|
}
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_UpdateMouseCursor()
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
|
|
return;
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
|
|
ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
|
|
if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
|
|
{
|
|
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
|
|
SDL_HideCursor();
|
|
}
|
|
else
|
|
{
|
|
// Show OS mouse cursor
|
|
SDL_Cursor* expected_cursor = bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow];
|
|
if (bd->MouseLastCursor != expected_cursor)
|
|
{
|
|
SDL_SetCursor(expected_cursor); // SDL function doesn't have an early out (see #6113)
|
|
bd->MouseLastCursor = expected_cursor;
|
|
}
|
|
SDL_ShowCursor();
|
|
}
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_CloseGamepads()
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
if (bd->GamepadMode != ImGui_ImplSDL3_GamepadMode_Manual)
|
|
for (SDL_Gamepad* gamepad : bd->Gamepads)
|
|
SDL_CloseGamepad(gamepad);
|
|
bd->Gamepads.resize(0);
|
|
}
|
|
|
|
void ImGui_ImplSDL3_SetGamepadMode(ImGui_ImplSDL3_GamepadMode mode, SDL_Gamepad** manual_gamepads_array, int manual_gamepads_count)
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
ImGui_ImplSDL3_CloseGamepads();
|
|
if (mode == ImGui_ImplSDL3_GamepadMode_Manual)
|
|
{
|
|
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]);
|
|
}
|
|
else
|
|
{
|
|
IM_ASSERT(manual_gamepads_array == nullptr && manual_gamepads_count <= 0);
|
|
bd->WantUpdateGamepadsList = true;
|
|
}
|
|
bd->GamepadMode = mode;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_UpdateGamepadButton(ImGui_ImplSDL3_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GamepadButton button_no)
|
|
{
|
|
bool merged_value = false;
|
|
for (SDL_Gamepad* gamepad : bd->Gamepads)
|
|
merged_value |= SDL_GetGamepadButton(gamepad, button_no) != 0;
|
|
io.AddKeyEvent(key, merged_value);
|
|
}
|
|
|
|
static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
|
|
static void ImGui_ImplSDL3_UpdateGamepadAnalog(ImGui_ImplSDL3_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GamepadAxis axis_no, float v0, float v1)
|
|
{
|
|
float merged_value = 0.0f;
|
|
for (SDL_Gamepad* gamepad : bd->Gamepads)
|
|
{
|
|
float vn = Saturate((float)(SDL_GetGamepadAxis(gamepad, axis_no) - v0) / (float)(v1 - v0));
|
|
if (merged_value < vn)
|
|
merged_value = vn;
|
|
}
|
|
io.AddKeyAnalogEvent(key, merged_value > 0.1f, merged_value);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_UpdateGamepads()
|
|
{
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
|
|
// Update list of gamepads to use
|
|
if (bd->WantUpdateGamepadsList && bd->GamepadMode != ImGui_ImplSDL3_GamepadMode_Manual)
|
|
{
|
|
ImGui_ImplSDL3_CloseGamepads();
|
|
int sdl_gamepads_count = 0;
|
|
SDL_JoystickID* sdl_gamepads = SDL_GetGamepads(&sdl_gamepads_count);
|
|
for (int n = 0; n < sdl_gamepads_count; n++)
|
|
if (SDL_Gamepad* gamepad = SDL_OpenGamepad(sdl_gamepads[n]))
|
|
{
|
|
bd->Gamepads.push_back(gamepad);
|
|
if (bd->GamepadMode == ImGui_ImplSDL3_GamepadMode_AutoFirst)
|
|
break;
|
|
}
|
|
bd->WantUpdateGamepadsList = false;
|
|
SDL_free(sdl_gamepads);
|
|
}
|
|
|
|
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
|
|
if (bd->Gamepads.Size == 0)
|
|
return;
|
|
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
|
|
|
|
// Update gamepad inputs
|
|
const int thumb_dead_zone = 8000; // SDL_gamepad.h suggests using this value.
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadStart, SDL_GAMEPAD_BUTTON_START);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadBack, SDL_GAMEPAD_BUTTON_BACK);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceLeft, SDL_GAMEPAD_BUTTON_WEST); // Xbox X, PS Square
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceRight, SDL_GAMEPAD_BUTTON_EAST); // Xbox B, PS Circle
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceUp, SDL_GAMEPAD_BUTTON_NORTH); // Xbox Y, PS Triangle
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceDown, SDL_GAMEPAD_BUTTON_SOUTH); // Xbox A, PS Cross
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadLeft, SDL_GAMEPAD_BUTTON_DPAD_LEFT);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadRight, SDL_GAMEPAD_BUTTON_DPAD_RIGHT);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadUp, SDL_GAMEPAD_BUTTON_DPAD_UP);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadDown, SDL_GAMEPAD_BUTTON_DPAD_DOWN);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL1, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR1, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadL2, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, 0.0f, 32767);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadR2, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, 0.0f, 32767);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL3, SDL_GAMEPAD_BUTTON_LEFT_STICK);
|
|
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR3, SDL_GAMEPAD_BUTTON_RIGHT_STICK);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickLeft, SDL_GAMEPAD_AXIS_LEFTX, -thumb_dead_zone, -32768);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickRight, SDL_GAMEPAD_AXIS_LEFTX, +thumb_dead_zone, +32767);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickUp, SDL_GAMEPAD_AXIS_LEFTY, -thumb_dead_zone, -32768);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickDown, SDL_GAMEPAD_AXIS_LEFTY, +thumb_dead_zone, +32767);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickLeft, SDL_GAMEPAD_AXIS_RIGHTX, -thumb_dead_zone, -32768);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickRight, SDL_GAMEPAD_AXIS_RIGHTX, +thumb_dead_zone, +32767);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickUp, SDL_GAMEPAD_AXIS_RIGHTY, -thumb_dead_zone, -32768);
|
|
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_UpdateMonitors()
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
platform_io.Monitors.resize(0);
|
|
bd->WantUpdateMonitors = false;
|
|
|
|
int display_count;
|
|
SDL_DisplayID* displays = SDL_GetDisplays(&display_count);
|
|
for (int n = 0; n < display_count; n++)
|
|
{
|
|
// Warning: the validity of monitor DPI information on Windows depends on the application DPI awareness settings, which generally needs to be set in the manifest or at runtime.
|
|
SDL_DisplayID display_id = displays[n];
|
|
ImGuiPlatformMonitor monitor;
|
|
SDL_Rect r;
|
|
SDL_GetDisplayBounds(display_id, &r);
|
|
monitor.MainPos = monitor.WorkPos = ImVec2((float)r.x, (float)r.y);
|
|
monitor.MainSize = monitor.WorkSize = ImVec2((float)r.w, (float)r.h);
|
|
if (SDL_GetDisplayUsableBounds(display_id, &r) && r.w > 0 && r.h > 0)
|
|
{
|
|
monitor.WorkPos = ImVec2((float)r.x, (float)r.y);
|
|
monitor.WorkSize = ImVec2((float)r.w, (float)r.h);
|
|
}
|
|
monitor.DpiScale = SDL_GetDisplayContentScale(display_id); // See https://wiki.libsdl.org/SDL3/README-highdpi for details.
|
|
monitor.PlatformHandle = (void*)(intptr_t)n;
|
|
if (monitor.DpiScale <= 0.0f)
|
|
continue; // Some accessibility applications are declaring virtual monitors with a DPI of 0, see #7902.
|
|
platform_io.Monitors.push_back(monitor);
|
|
}
|
|
SDL_free(displays);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_GetWindowSizeAndFramebufferScale(SDL_Window* window, ImVec2* out_size, ImVec2* out_framebuffer_scale)
|
|
{
|
|
int w, h;
|
|
int display_w, display_h;
|
|
SDL_GetWindowSize(window, &w, &h);
|
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
|
w = h = 0;
|
|
SDL_GetWindowSizeInPixels(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_ImplSDL3_NewFrame()
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL3_Init()?");
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
// Setup main viewport size (every frame to accommodate for window resizing)
|
|
ImGui_ImplSDL3_GetWindowSizeAndFramebufferScale(bd->Window, &io.DisplaySize, &io.DisplayFramebufferScale);
|
|
|
|
// Update monitors
|
|
#ifdef WIN32
|
|
bd->WantUpdateMonitors = true; // Keep polling under Windows to handle changes of work area when resizing task-bar (#8415)
|
|
#endif
|
|
if (bd->WantUpdateMonitors)
|
|
ImGui_ImplSDL3_UpdateMonitors();
|
|
|
|
// Setup time step (we could also use SDL_GetTicksNS() available since SDL3)
|
|
// (Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. Happens in VMs and Emscripten, see #6189, #6114, #3644)
|
|
static Uint64 frequency = SDL_GetPerformanceFrequency();
|
|
Uint64 current_time = SDL_GetPerformanceCounter();
|
|
if (current_time <= bd->Time)
|
|
current_time = bd->Time + 1;
|
|
io.DeltaTime = bd->Time > 0 ? (float)((double)(current_time - bd->Time) / frequency) : (float)(1.0f / 60.0f);
|
|
bd->Time = current_time;
|
|
|
|
if (bd->MousePendingLeaveFrame && bd->MousePendingLeaveFrame >= ImGui::GetFrameCount() && bd->MouseButtonsDown == 0)
|
|
{
|
|
bd->MouseWindowID = 0;
|
|
bd->MousePendingLeaveFrame = 0;
|
|
io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
|
|
}
|
|
|
|
// Our io.AddMouseViewportEvent() calls will only be valid when not capturing.
|
|
// Technically speaking testing for 'bd->MouseButtonsDown == 0' would be more rigorous, but testing for payload reduces noise and potential side-effects.
|
|
if (bd->MouseCanReportHoveredViewport && ImGui::GetDragDropPayload() == nullptr)
|
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
|
|
else
|
|
io.BackendFlags &= ~ImGuiBackendFlags_HasMouseHoveredViewport;
|
|
|
|
ImGui_ImplSDL3_UpdateMouseData();
|
|
ImGui_ImplSDL3_UpdateMouseCursor();
|
|
|
|
// Update game controllers (if enabled and available)
|
|
ImGui_ImplSDL3_UpdateGamepads();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------------
|
|
// MULTI-VIEWPORT / PLATFORM INTERFACE SUPPORT
|
|
// This is an _advanced_ and _optional_ feature, allowing the backend to create and handle multiple viewports simultaneously.
|
|
// If you are new to dear imgui or creating a new binding for dear imgui, it is recommended that you completely ignore this section first..
|
|
//--------------------------------------------------------------------------------------------------------
|
|
|
|
// Helper structure we store in the void* PlatformUserData field of each ImGuiViewport to easily retrieve our backend data.
|
|
struct ImGui_ImplSDL3_ViewportData
|
|
{
|
|
SDL_Window* Window;
|
|
SDL_Window* ParentWindow;
|
|
Uint32 WindowID; // Stored in ImGuiViewport::PlatformHandle. Use SDL_GetWindowFromID() to get SDL_Window* from Uint32 WindowID.
|
|
bool WindowOwned;
|
|
SDL_GLContext GLContext;
|
|
|
|
ImGui_ImplSDL3_ViewportData() { Window = ParentWindow = nullptr; WindowID = 0; WindowOwned = false; GLContext = nullptr; }
|
|
~ImGui_ImplSDL3_ViewportData() { IM_ASSERT(Window == nullptr && GLContext == nullptr); }
|
|
};
|
|
|
|
static SDL_Window* ImGui_ImplSDL3_GetSDLWindowFromViewportID(ImGuiID viewport_id)
|
|
{
|
|
if (viewport_id != 0)
|
|
if (ImGuiViewport* viewport = ImGui::FindViewportByID(viewport_id))
|
|
{
|
|
SDL_WindowID window_id = (SDL_WindowID)(intptr_t)viewport->PlatformHandle;
|
|
return SDL_GetWindowFromID(window_id);
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_CreateWindow(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
ImGui_ImplSDL3_ViewportData* vd = IM_NEW(ImGui_ImplSDL3_ViewportData)();
|
|
viewport->PlatformUserData = vd;
|
|
|
|
vd->ParentWindow = ImGui_ImplSDL3_GetSDLWindowFromViewportID(viewport->ParentViewportId);
|
|
|
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
|
ImGui_ImplSDL3_ViewportData* main_viewport_data = (ImGui_ImplSDL3_ViewportData*)main_viewport->PlatformUserData;
|
|
|
|
// Share GL resources with main context
|
|
bool use_opengl = (main_viewport_data->GLContext != nullptr);
|
|
SDL_GLContext backup_context = nullptr;
|
|
if (use_opengl)
|
|
{
|
|
backup_context = SDL_GL_GetCurrentContext();
|
|
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
|
|
SDL_GL_MakeCurrent(main_viewport_data->Window, main_viewport_data->GLContext);
|
|
}
|
|
|
|
SDL_WindowFlags sdl_flags = 0;
|
|
sdl_flags |= SDL_WINDOW_HIDDEN;
|
|
sdl_flags |= use_opengl ? SDL_WINDOW_OPENGL : (bd->UseVulkan ? SDL_WINDOW_VULKAN : 0);
|
|
sdl_flags |= SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_HIGH_PIXEL_DENSITY;
|
|
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoDecoration) ? SDL_WINDOW_BORDERLESS : 0;
|
|
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoDecoration) ? 0 : SDL_WINDOW_RESIZABLE;
|
|
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon) ? SDL_WINDOW_UTILITY : 0;
|
|
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_TopMost) ? SDL_WINDOW_ALWAYS_ON_TOP : 0;
|
|
vd->Window = SDL_CreateWindow("No Title Yet", (int)viewport->Size.x, (int)viewport->Size.y, sdl_flags);
|
|
#ifndef __APPLE__ // On Mac, SDL3 Parenting appears to prevent viewport from appearing in another monitor
|
|
SDL_SetWindowParent(vd->Window, vd->ParentWindow);
|
|
#endif
|
|
SDL_SetWindowPosition(vd->Window, (int)viewport->Pos.x, (int)viewport->Pos.y);
|
|
vd->WindowOwned = true;
|
|
if (use_opengl)
|
|
{
|
|
vd->GLContext = SDL_GL_CreateContext(vd->Window);
|
|
SDL_GL_SetSwapInterval(0);
|
|
}
|
|
if (use_opengl && backup_context)
|
|
SDL_GL_MakeCurrent(vd->Window, backup_context);
|
|
|
|
ImGui_ImplSDL3_SetupPlatformHandles(viewport, vd->Window);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_DestroyWindow(ImGuiViewport* viewport)
|
|
{
|
|
if (ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData)
|
|
{
|
|
if (vd->GLContext && vd->WindowOwned)
|
|
SDL_GL_DestroyContext(vd->GLContext);
|
|
if (vd->Window && vd->WindowOwned)
|
|
SDL_DestroyWindow(vd->Window);
|
|
vd->GLContext = nullptr;
|
|
vd->Window = nullptr;
|
|
IM_DELETE(vd);
|
|
}
|
|
viewport->PlatformUserData = viewport->PlatformHandle = nullptr;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_ShowWindow(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
#if defined(_WIN32) && !(defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_APP) && WINAPI_FAMILY == WINAPI_FAMILY_APP) || (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES)))
|
|
HWND hwnd = (HWND)viewport->PlatformHandleRaw;
|
|
|
|
// SDL hack: Show icon in task bar (#7989)
|
|
// Note: SDL_WINDOW_UTILITY can be used to control task bar visibility, but on Windows, it does not affect child windows.
|
|
if (!(viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon))
|
|
{
|
|
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
|
|
ex_style |= WS_EX_APPWINDOW;
|
|
ex_style &= ~WS_EX_TOOLWINDOW;
|
|
::ShowWindow(hwnd, SW_HIDE);
|
|
::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
|
|
}
|
|
#endif
|
|
|
|
#ifdef __APPLE__
|
|
SDL_SetHint(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, "1"); // Otherwise new window appear under
|
|
#else
|
|
SDL_SetHint(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, (viewport->Flags & ImGuiViewportFlags_NoFocusOnAppearing) ? "0" : "1");
|
|
#endif
|
|
SDL_ShowWindow(vd->Window);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_UpdateWindow(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
IM_UNUSED(vd);
|
|
|
|
#ifndef __APPLE__ // On Mac, SDL3 Parenting appears to prevent viewport from appearing in another monitor
|
|
// Update SDL3 parent if it changed _after_ creation.
|
|
// This is for advanced apps that are manipulating ParentViewportID manually.
|
|
SDL_Window* new_parent = ImGui_ImplSDL3_GetSDLWindowFromViewportID(viewport->ParentViewportId);
|
|
if (new_parent != vd->ParentWindow)
|
|
{
|
|
vd->ParentWindow = new_parent;
|
|
SDL_SetWindowParent(vd->Window, vd->ParentWindow);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
static ImVec2 ImGui_ImplSDL3_GetWindowPos(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
int x = 0, y = 0;
|
|
SDL_GetWindowPosition(vd->Window, &x, &y);
|
|
return ImVec2((float)x, (float)y);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetWindowPos(ImGuiViewport* viewport, ImVec2 pos)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
SDL_SetWindowPosition(vd->Window, (int)pos.x, (int)pos.y);
|
|
}
|
|
|
|
static ImVec2 ImGui_ImplSDL3_GetWindowSize(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
int w = 0, h = 0;
|
|
SDL_GetWindowSize(vd->Window, &w, &h);
|
|
return ImVec2((float)w, (float)h);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
SDL_SetWindowSize(vd->Window, (int)size.x, (int)size.y);
|
|
}
|
|
|
|
static ImVec2 ImGui_ImplSDL3_GetWindowFramebufferScale(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
ImVec2 framebuffer_scale;
|
|
ImGui_ImplSDL3_GetWindowSizeAndFramebufferScale(vd->Window, nullptr, &framebuffer_scale);
|
|
return framebuffer_scale;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetWindowTitle(ImGuiViewport* viewport, const char* title)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
SDL_SetWindowTitle(vd->Window, title);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetWindowAlpha(ImGuiViewport* viewport, float alpha)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
SDL_SetWindowOpacity(vd->Window, alpha);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SetWindowFocus(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
SDL_RaiseWindow(vd->Window);
|
|
}
|
|
|
|
static bool ImGui_ImplSDL3_GetWindowFocus(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
return (SDL_GetWindowFlags(vd->Window) & SDL_WINDOW_INPUT_FOCUS) != 0;
|
|
}
|
|
|
|
static bool ImGui_ImplSDL3_GetWindowMinimized(ImGuiViewport* viewport)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
return (SDL_GetWindowFlags(vd->Window) & SDL_WINDOW_MINIMIZED) != 0;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_RenderWindow(ImGuiViewport* viewport, void*)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
if (vd->GLContext)
|
|
SDL_GL_MakeCurrent(vd->Window, vd->GLContext);
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_SwapBuffers(ImGuiViewport* viewport, void*)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
if (vd->GLContext)
|
|
{
|
|
SDL_GL_MakeCurrent(vd->Window, vd->GLContext);
|
|
SDL_GL_SwapWindow(vd->Window);
|
|
}
|
|
}
|
|
|
|
// Vulkan support (the Vulkan renderer needs to call a platform-side support function to create the surface)
|
|
// SDL is graceful enough to _not_ need <vulkan/vulkan.h> so we can safely include this.
|
|
#include <SDL3/SDL_vulkan.h>
|
|
static int ImGui_ImplSDL3_CreateVkSurface(ImGuiViewport* viewport, ImU64 vk_instance, const void* vk_allocator, ImU64* out_vk_surface)
|
|
{
|
|
ImGui_ImplSDL3_ViewportData* vd = (ImGui_ImplSDL3_ViewportData*)viewport->PlatformUserData;
|
|
(void)vk_allocator;
|
|
bool ret = SDL_Vulkan_CreateSurface(vd->Window, (VkInstance)vk_instance, (const VkAllocationCallbacks*)vk_allocator, (VkSurfaceKHR*)out_vk_surface);
|
|
return ret ? 0 : 1; // ret ? VK_SUCCESS : VK_NOT_READY
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_InitMultiViewportSupport(SDL_Window* window, void* sdl_gl_context)
|
|
{
|
|
// Register platform interface (will be coupled with a renderer interface)
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
platform_io.Platform_CreateWindow = ImGui_ImplSDL3_CreateWindow;
|
|
platform_io.Platform_DestroyWindow = ImGui_ImplSDL3_DestroyWindow;
|
|
platform_io.Platform_ShowWindow = ImGui_ImplSDL3_ShowWindow;
|
|
platform_io.Platform_UpdateWindow = ImGui_ImplSDL3_UpdateWindow;
|
|
platform_io.Platform_SetWindowPos = ImGui_ImplSDL3_SetWindowPos;
|
|
platform_io.Platform_GetWindowPos = ImGui_ImplSDL3_GetWindowPos;
|
|
platform_io.Platform_SetWindowSize = ImGui_ImplSDL3_SetWindowSize;
|
|
platform_io.Platform_GetWindowSize = ImGui_ImplSDL3_GetWindowSize;
|
|
platform_io.Platform_GetWindowFramebufferScale = ImGui_ImplSDL3_GetWindowFramebufferScale;
|
|
platform_io.Platform_SetWindowFocus = ImGui_ImplSDL3_SetWindowFocus;
|
|
platform_io.Platform_GetWindowFocus = ImGui_ImplSDL3_GetWindowFocus;
|
|
platform_io.Platform_GetWindowMinimized = ImGui_ImplSDL3_GetWindowMinimized;
|
|
platform_io.Platform_SetWindowTitle = ImGui_ImplSDL3_SetWindowTitle;
|
|
platform_io.Platform_RenderWindow = ImGui_ImplSDL3_RenderWindow;
|
|
platform_io.Platform_SwapBuffers = ImGui_ImplSDL3_SwapBuffers;
|
|
platform_io.Platform_SetWindowAlpha = ImGui_ImplSDL3_SetWindowAlpha;
|
|
platform_io.Platform_CreateVkSurface = ImGui_ImplSDL3_CreateVkSurface;
|
|
|
|
// Register main window handle (which is owned by the main application, not by us)
|
|
// This is mostly for simplicity and consistency, so that our code (e.g. mouse handling etc.) can use same logic for main and secondary viewports.
|
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
|
ImGui_ImplSDL3_ViewportData* vd = IM_NEW(ImGui_ImplSDL3_ViewportData)();
|
|
vd->Window = window;
|
|
vd->WindowID = SDL_GetWindowID(window);
|
|
vd->WindowOwned = false;
|
|
vd->GLContext = (SDL_GLContext)sdl_gl_context;
|
|
main_viewport->PlatformUserData = vd;
|
|
main_viewport->PlatformHandle = (void*)(intptr_t)vd->WindowID;
|
|
}
|
|
|
|
static void ImGui_ImplSDL3_ShutdownMultiViewportSupport()
|
|
{
|
|
ImGui::DestroyPlatformWindows();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#if defined(__clang__)
|
|
#pragma clang diagnostic pop
|
|
#endif
|
|
|
|
#endif // #ifndef IMGUI_DISABLE
|