mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-03 17:24:24 +00:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # backends/imgui_impl_opengl3.cpp # imgui.cpp # imgui_internal.h
This commit is contained in:
		@@ -491,8 +491,9 @@ static void ImGui_ImplAllegro5_UpdateKeyModifiers()
 | 
				
			|||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
 | 
					// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
 | 
				
			||||||
bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* ev)
 | 
					bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* ev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
 | 
					    ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
 | 
				
			||||||
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplAllegro5_Init()?");
 | 
				
			||||||
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (ev->type)
 | 
					    switch (ev->type)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -587,7 +588,7 @@ static void ImGui_ImplAllegro5_UpdateMouseCursor()
 | 
				
			|||||||
void ImGui_ImplAllegro5_NewFrame()
 | 
					void ImGui_ImplAllegro5_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
 | 
					    ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplAllegro5_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplAllegro5_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->Texture)
 | 
					    if (!bd->Texture)
 | 
				
			||||||
        ImGui_ImplAllegro5_CreateDeviceObjects();
 | 
					        ImGui_ImplAllegro5_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -588,7 +588,7 @@ void ImGui_ImplDX10_Shutdown()
 | 
				
			|||||||
void ImGui_ImplDX10_NewFrame()
 | 
					void ImGui_ImplDX10_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
 | 
					    ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX10_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX10_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->pFontSampler)
 | 
					    if (!bd->pFontSampler)
 | 
				
			||||||
        ImGui_ImplDX10_CreateDeviceObjects();
 | 
					        ImGui_ImplDX10_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -605,7 +605,7 @@ void ImGui_ImplDX11_Shutdown()
 | 
				
			|||||||
void ImGui_ImplDX11_NewFrame()
 | 
					void ImGui_ImplDX11_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
 | 
					    ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX11_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX11_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->pFontSampler)
 | 
					    if (!bd->pFontSampler)
 | 
				
			||||||
        ImGui_ImplDX11_CreateDeviceObjects();
 | 
					        ImGui_ImplDX11_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -833,7 +833,7 @@ void ImGui_ImplDX12_Shutdown()
 | 
				
			|||||||
void ImGui_ImplDX12_NewFrame()
 | 
					void ImGui_ImplDX12_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
 | 
					    ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX12_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX12_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->pPipelineState)
 | 
					    if (!bd->pPipelineState)
 | 
				
			||||||
        ImGui_ImplDX12_CreateDeviceObjects();
 | 
					        ImGui_ImplDX12_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -419,7 +419,7 @@ void ImGui_ImplDX9_InvalidateDeviceObjects()
 | 
				
			|||||||
void ImGui_ImplDX9_NewFrame()
 | 
					void ImGui_ImplDX9_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
 | 
					    ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX9_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX9_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->FontTexture)
 | 
					    if (!bd->FontTexture)
 | 
				
			||||||
        ImGui_ImplDX9_CreateDeviceObjects();
 | 
					        ImGui_ImplDX9_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -902,7 +902,7 @@ void ImGui_ImplGlfw_NewFrame()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
 | 
					    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplGlfw_InitForXXX()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Setup display size (every frame to accommodate for window resizing)
 | 
					    // Setup display size (every frame to accommodate for window resizing)
 | 
				
			||||||
    int w, h;
 | 
					    int w, h;
 | 
				
			||||||
@@ -955,7 +955,7 @@ void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_sel
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    IM_ASSERT(canvas_selector != nullptr);
 | 
					    IM_ASSERT(canvas_selector != nullptr);
 | 
				
			||||||
    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
 | 
					    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplGlfw_InitForXXX()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bd->CanvasSelector = canvas_selector;
 | 
					    bd->CanvasSelector = canvas_selector;
 | 
				
			||||||
    emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, bd, false, ImGui_ImplGlfw_OnCanvasSizeChange);
 | 
					    emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, bd, false, ImGui_ImplGlfw_OnCanvasSizeChange);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -166,7 +166,7 @@ void ImGui_ImplMetal_Shutdown()
 | 
				
			|||||||
void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor)
 | 
					void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
 | 
					    ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd->SharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?");
 | 
					    IM_ASSERT(bd != nil && "Context or backend not initialized! Did you call ImGui_ImplMetal_Init()?");
 | 
				
			||||||
    bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor];
 | 
					    bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (bd->SharedMetalContext.depthStencilState == nil)
 | 
					    if (bd->SharedMetalContext.depthStencilState == nil)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,7 +120,7 @@ void    ImGui_ImplOpenGL2_Shutdown()
 | 
				
			|||||||
void    ImGui_ImplOpenGL2_NewFrame()
 | 
					void    ImGui_ImplOpenGL2_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
 | 
					    ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL2_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOpenGL2_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->FontTexture)
 | 
					    if (!bd->FontTexture)
 | 
				
			||||||
        ImGui_ImplOpenGL2_CreateDeviceObjects();
 | 
					        ImGui_ImplOpenGL2_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@
 | 
				
			|||||||
// CHANGELOG
 | 
					// CHANGELOG
 | 
				
			||||||
// (minor and older changes stripped away, please see git history for details)
 | 
					// (minor and older changes stripped away, please see git history for details)
 | 
				
			||||||
//  2024-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
 | 
					//  2024-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
 | 
				
			||||||
 | 
					//  2024-05-07: OpenGL: Update loader for Linux to support EGL/GLVND. (#7562)
 | 
				
			||||||
//  2024-04-16: OpenGL: Detect ES3 contexts on desktop based on version string, to e.g. avoid calling glPolygonMode() on them. (#7447)
 | 
					//  2024-04-16: OpenGL: Detect ES3 contexts on desktop based on version string, to e.g. avoid calling glPolygonMode() on them. (#7447)
 | 
				
			||||||
//  2024-01-09: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" and variants, fixing regression on distros missing a symlink.
 | 
					//  2024-01-09: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" and variants, fixing regression on distros missing a symlink.
 | 
				
			||||||
//  2023-11-08: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" instead of "libGL.so.1", accommodating for NetBSD systems having only "libGL.so.3" available. (#6983)
 | 
					//  2023-11-08: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" instead of "libGL.so.1", accommodating for NetBSD systems having only "libGL.so.3" available. (#6983)
 | 
				
			||||||
@@ -407,7 +408,7 @@ void    ImGui_ImplOpenGL3_Shutdown()
 | 
				
			|||||||
void    ImGui_ImplOpenGL3_NewFrame()
 | 
					void    ImGui_ImplOpenGL3_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
 | 
					    ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL3_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOpenGL3_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->ShaderHandle)
 | 
					    if (!bd->ShaderHandle)
 | 
				
			||||||
        ImGui_ImplOpenGL3_CreateDeviceObjects();
 | 
					        ImGui_ImplOpenGL3_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@
 | 
				
			|||||||
// WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT.
 | 
					// WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Regenerate with:
 | 
					// Regenerate with:
 | 
				
			||||||
//   python gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt
 | 
					//   python3 gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// More info:
 | 
					// More info:
 | 
				
			||||||
//   https://github.com/dearimgui/gl3w_stripped
 | 
					//   https://github.com/dearimgui/gl3w_stripped
 | 
				
			||||||
@@ -118,7 +118,7 @@ extern "C" {
 | 
				
			|||||||
** included as <GL/glcorearb.h>.
 | 
					** included as <GL/glcorearb.h>.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
** glcorearb.h includes only APIs in the latest OpenGL core profile
 | 
					** glcorearb.h includes only APIs in the latest OpenGL core profile
 | 
				
			||||||
** implementation together with APIs in newer ARB extensions which
 | 
					** implementation together with APIs in newer ARB extensions which 
 | 
				
			||||||
** can be supported by the core profile. It does not, and never will
 | 
					** can be supported by the core profile. It does not, and never will
 | 
				
			||||||
** include functionality removed from the core profile, such as
 | 
					** include functionality removed from the core profile, such as
 | 
				
			||||||
** fixed-function vertex and fragment processing.
 | 
					** fixed-function vertex and fragment processing.
 | 
				
			||||||
@@ -260,8 +260,6 @@ typedef khronos_intptr_t GLintptr;
 | 
				
			|||||||
#define GL_ARRAY_BUFFER_BINDING           0x8894
 | 
					#define GL_ARRAY_BUFFER_BINDING           0x8894
 | 
				
			||||||
#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
 | 
					#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
 | 
				
			||||||
#define GL_STREAM_DRAW                    0x88E0
 | 
					#define GL_STREAM_DRAW                    0x88E0
 | 
				
			||||||
#define GL_PIXEL_UNPACK_BUFFER            0x88EC
 | 
					 | 
				
			||||||
#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
 | 
					 | 
				
			||||||
typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
 | 
					typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
 | 
				
			||||||
typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
 | 
					typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
 | 
				
			||||||
typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
 | 
					typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
 | 
				
			||||||
@@ -348,6 +346,10 @@ GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean
 | 
				
			|||||||
GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
 | 
					GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif /* GL_VERSION_2_0 */
 | 
					#endif /* GL_VERSION_2_0 */
 | 
				
			||||||
 | 
					#ifndef GL_VERSION_2_1
 | 
				
			||||||
 | 
					#define GL_PIXEL_UNPACK_BUFFER            0x88EC
 | 
				
			||||||
 | 
					#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
 | 
				
			||||||
 | 
					#endif /* GL_VERSION_2_1 */
 | 
				
			||||||
#ifndef GL_VERSION_3_0
 | 
					#ifndef GL_VERSION_3_0
 | 
				
			||||||
typedef khronos_uint16_t GLhalf;
 | 
					typedef khronos_uint16_t GLhalf;
 | 
				
			||||||
#define GL_MAJOR_VERSION                  0x821B
 | 
					#define GL_MAJOR_VERSION                  0x821B
 | 
				
			||||||
@@ -663,31 +665,123 @@ static GL3WglProc get_proc(const char *proc)
 | 
				
			|||||||
#else
 | 
					#else
 | 
				
			||||||
#include <dlfcn.h>
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void *libgl;
 | 
					static void* libgl;  // OpenGL library
 | 
				
			||||||
static GL3WglProc (*glx_get_proc_address)(const GLubyte *);
 | 
					static void* libglx;  // GLX library
 | 
				
			||||||
 | 
					static void* libegl;  // EGL library
 | 
				
			||||||
 | 
					static GL3WGetProcAddressProc gl_get_proc_address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int open_libgl(void)
 | 
					static void close_libgl(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (libgl) {
 | 
				
			||||||
 | 
					        dlclose(libgl);
 | 
				
			||||||
 | 
					        libgl = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (libegl) {
 | 
				
			||||||
 | 
					        dlclose(libegl);
 | 
				
			||||||
 | 
					        libegl = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (libglx) {
 | 
				
			||||||
 | 
					        dlclose(libglx);
 | 
				
			||||||
 | 
					        libglx = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int is_library_loaded(const char* name, void** lib)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    *lib = dlopen(name, RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
 | 
				
			||||||
 | 
					    return *lib != NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int open_libs(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // On Linux we have two APIs to get process addresses: EGL and GLX.
 | 
				
			||||||
 | 
					    // EGL is supported under both X11 and Wayland, whereas GLX is X11-specific.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    libgl = NULL;
 | 
				
			||||||
 | 
					    libegl = NULL;
 | 
				
			||||||
 | 
					    libglx = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // First check what's already loaded, the windowing library might have
 | 
				
			||||||
 | 
					    // already loaded either EGL or GLX and we want to use the same one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (is_library_loaded("libEGL.so.1", &libegl) ||
 | 
				
			||||||
 | 
					        is_library_loaded("libGLX.so.0", &libglx)) {
 | 
				
			||||||
 | 
					        libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
 | 
					        if (libgl)
 | 
				
			||||||
 | 
					            return GL3W_OK;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            close_libgl();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (is_library_loaded("libGL.so", &libgl))
 | 
				
			||||||
 | 
					        return GL3W_OK;
 | 
				
			||||||
 | 
					    if (is_library_loaded("libGL.so.1", &libgl))
 | 
				
			||||||
 | 
					        return GL3W_OK;
 | 
				
			||||||
 | 
					    if (is_library_loaded("libGL.so.3", &libgl))
 | 
				
			||||||
 | 
					        return GL3W_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Neither is already loaded, so we have to load one.  Try EGL first
 | 
				
			||||||
 | 
					    // because it is supported under both X11 and Wayland.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Load OpenGL + EGL
 | 
				
			||||||
 | 
					    libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
 | 
					    libegl = dlopen("libEGL.so.1", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
 | 
					    if (libgl && libegl)
 | 
				
			||||||
 | 
					        return GL3W_OK;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        close_libgl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Fall back to legacy libGL, which includes GLX
 | 
				
			||||||
    // While most systems use libGL.so.1, NetBSD seems to use that libGL.so.3. See https://github.com/ocornut/imgui/issues/6983
 | 
					    // While most systems use libGL.so.1, NetBSD seems to use that libGL.so.3. See https://github.com/ocornut/imgui/issues/6983
 | 
				
			||||||
    libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
 | 
					    libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
    if (!libgl)
 | 
					    if (!libgl)
 | 
				
			||||||
        libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
 | 
					        libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
    if (!libgl)
 | 
					    if (!libgl)
 | 
				
			||||||
        libgl = dlopen("libGL.so.3", RTLD_LAZY | RTLD_LOCAL);
 | 
					        libgl = dlopen("libGL.so.3", RTLD_LAZY | RTLD_LOCAL);
 | 
				
			||||||
    if (!libgl)
 | 
					
 | 
				
			||||||
 | 
					    if (libgl)
 | 
				
			||||||
 | 
					        return GL3W_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return GL3W_ERROR_LIBRARY_OPEN;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int open_libgl(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int res = open_libs();
 | 
				
			||||||
 | 
					    if (res)
 | 
				
			||||||
 | 
					        return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (libegl)
 | 
				
			||||||
 | 
					        *(void**)(&gl_get_proc_address) = dlsym(libegl, "eglGetProcAddress");
 | 
				
			||||||
 | 
					    else if (libglx)
 | 
				
			||||||
 | 
					        *(void**)(&gl_get_proc_address) = dlsym(libglx, "glXGetProcAddressARB");
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        *(void**)(&gl_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!gl_get_proc_address) {
 | 
				
			||||||
 | 
					        close_libgl();
 | 
				
			||||||
        return GL3W_ERROR_LIBRARY_OPEN;
 | 
					        return GL3W_ERROR_LIBRARY_OPEN;
 | 
				
			||||||
    *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return GL3W_OK;
 | 
					    return GL3W_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void close_libgl(void) { dlclose(libgl); }
 | 
					static GL3WglProc get_proc(const char* proc)
 | 
				
			||||||
 | 
					 | 
				
			||||||
static GL3WglProc get_proc(const char *proc)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GL3WglProc res;
 | 
					    GL3WglProc res = NULL;
 | 
				
			||||||
    res = glx_get_proc_address((const GLubyte *)proc);
 | 
					
 | 
				
			||||||
 | 
					    // Before EGL version 1.5, eglGetProcAddress doesn't support querying core
 | 
				
			||||||
 | 
					    // functions and may return a dummy function if we try, so try to load the
 | 
				
			||||||
 | 
					    // function from the GL library directly first.
 | 
				
			||||||
 | 
					    if (libegl)
 | 
				
			||||||
 | 
					        *(void**)(&res) = dlsym(libgl, proc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!res)
 | 
					    if (!res)
 | 
				
			||||||
        *(void **)(&res) = dlsym(libgl, proc);
 | 
					        res = gl_get_proc_address(proc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!libegl && !res)
 | 
				
			||||||
 | 
					        *(void**)(&res) = dlsym(libgl, proc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return res;
 | 
					    return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -639,6 +639,7 @@ static void ImGui_ImplOSX_UpdateImePosWithView(NSView* view)
 | 
				
			|||||||
void ImGui_ImplOSX_NewFrame(NSView* view)
 | 
					void ImGui_ImplOSX_NewFrame(NSView* view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
 | 
					    ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
 | 
				
			||||||
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOSX_Init()?");
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Setup display size
 | 
					    // Setup display size
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -328,8 +328,9 @@ static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
 | 
				
			|||||||
// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field.
 | 
					// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field.
 | 
				
			||||||
bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
 | 
					bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
 | 
					    ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
 | 
				
			||||||
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL2_Init()?");
 | 
				
			||||||
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (event->type)
 | 
					    switch (event->type)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -841,7 +842,7 @@ static void ImGui_ImplSDL2_UpdateMonitors()
 | 
				
			|||||||
void ImGui_ImplSDL2_NewFrame()
 | 
					void ImGui_ImplSDL2_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
 | 
					    ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDL2_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL2_Init()?");
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Setup display size (every frame to accommodate for window resizing)
 | 
					    // Setup display size (every frame to accommodate for window resizing)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -281,8 +281,9 @@ static void ImGui_ImplSDL3_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
 | 
				
			|||||||
// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field.
 | 
					// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field.
 | 
				
			||||||
bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
 | 
					bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
 | 
					    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)
 | 
					    switch (event->type)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -721,30 +722,30 @@ static void ImGui_ImplSDL3_UpdateGamepads()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Update gamepad inputs
 | 
					    // Update gamepad inputs
 | 
				
			||||||
    const int thumb_dead_zone = 8000;           // SDL_gamepad.h suggests using this value.
 | 
					    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_GamepadStart,       SDL_GAMEPAD_BUTTON_START);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadBack,            SDL_GAMEPAD_BUTTON_BACK);
 | 
					    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_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_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_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_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_GamepadDpadLeft,    SDL_GAMEPAD_BUTTON_DPAD_LEFT);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadRight,       SDL_GAMEPAD_BUTTON_DPAD_RIGHT);
 | 
					    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_GamepadDpadUp,      SDL_GAMEPAD_BUTTON_DPAD_UP);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadDown,        SDL_GAMEPAD_BUTTON_DPAD_DOWN);
 | 
					    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_GamepadL1,          SDL_GAMEPAD_BUTTON_LEFT_SHOULDER);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR1,              SDL_GAMEPAD_BUTTON_RIGHT_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_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_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_GamepadL3,          SDL_GAMEPAD_BUTTON_LEFT_STICK);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR3,              SDL_GAMEPAD_BUTTON_RIGHT_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_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_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_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_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_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_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_GamepadRStickUp,    SDL_GAMEPAD_AXIS_RIGHTY, -thumb_dead_zone, -32768);
 | 
				
			||||||
    ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown,      SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767);
 | 
					    ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown,  SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ImGui_ImplSDL3_UpdateMonitors()
 | 
					static void ImGui_ImplSDL3_UpdateMonitors()
 | 
				
			||||||
@@ -779,7 +780,7 @@ static void ImGui_ImplSDL3_UpdateMonitors()
 | 
				
			|||||||
void ImGui_ImplSDL3_NewFrame()
 | 
					void ImGui_ImplSDL3_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
 | 
					    ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDL3_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL3_Init()?");
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Setup display size (every frame to accommodate for window resizing)
 | 
					    // Setup display size (every frame to accommodate for window resizing)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,7 +106,7 @@ static void ImGui_ImplSDLRenderer2_SetupRenderState()
 | 
				
			|||||||
void ImGui_ImplSDLRenderer2_NewFrame()
 | 
					void ImGui_ImplSDLRenderer2_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
 | 
					    ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDLRenderer2_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDLRenderer2_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->FontTexture)
 | 
					    if (!bd->FontTexture)
 | 
				
			||||||
        ImGui_ImplSDLRenderer2_CreateDeviceObjects();
 | 
					        ImGui_ImplSDLRenderer2_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,7 +102,7 @@ static void ImGui_ImplSDLRenderer3_SetupRenderState()
 | 
				
			|||||||
void ImGui_ImplSDLRenderer3_NewFrame()
 | 
					void ImGui_ImplSDLRenderer3_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplSDLRenderer3_Data* bd = ImGui_ImplSDLRenderer3_GetBackendData();
 | 
					    ImGui_ImplSDLRenderer3_Data* bd = ImGui_ImplSDLRenderer3_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDLRenderer3_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDLRenderer3_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->FontTexture)
 | 
					    if (!bd->FontTexture)
 | 
				
			||||||
        ImGui_ImplSDLRenderer3_CreateDeviceObjects();
 | 
					        ImGui_ImplSDLRenderer3_CreateDeviceObjects();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1183,7 +1183,7 @@ void ImGui_ImplVulkan_Shutdown()
 | 
				
			|||||||
void ImGui_ImplVulkan_NewFrame()
 | 
					void ImGui_ImplVulkan_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
 | 
					    ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplVulkan_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplVulkan_Init()?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!bd->FontDescriptorSet)
 | 
					    if (!bd->FontDescriptorSet)
 | 
				
			||||||
        ImGui_ImplVulkan_CreateFontsTexture();
 | 
					        ImGui_ImplVulkan_CreateFontsTexture();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -452,9 +452,9 @@ static void ImGui_ImplWin32_UpdateMonitors()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void    ImGui_ImplWin32_NewFrame()
 | 
					void    ImGui_ImplWin32_NewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
 | 
					    ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
 | 
				
			||||||
    IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplWin32_Init()?");
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized? Did you call ImGui_ImplWin32_Init()?");
 | 
				
			||||||
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Setup display size (every frame to accommodate for window resizing)
 | 
					    // Setup display size (every frame to accommodate for window resizing)
 | 
				
			||||||
    RECT rect = { 0, 0, 0, 0 };
 | 
					    RECT rect = { 0, 0, 0, 0 };
 | 
				
			||||||
@@ -652,11 +652,13 @@ static ImGuiMouseSource GetMouseSourceFromMessageExtraInfo()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 | 
					IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    // Most backends don't have silent checks like this one, but we need it because WndProc are called early in CreateWindow().
 | 
				
			||||||
    if (ImGui::GetCurrentContext() == nullptr)
 | 
					    if (ImGui::GetCurrentContext() == nullptr)
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
 | 
					    ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
 | 
				
			||||||
 | 
					    IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplWin32_Init()?");
 | 
				
			||||||
 | 
					    ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (msg)
 | 
					    switch (msg)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,9 +36,11 @@ HOW TO UPDATE?
 | 
				
			|||||||
- Please report any issue!
 | 
					- Please report any issue!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-----------------------------------------------------------------------
 | 
					-----------------------------------------------------------------------
 | 
				
			||||||
 VERSION 1.90.6 WIP (In Progress)
 | 
					 VERSION 1.90.6 (Released 2024-05-08)
 | 
				
			||||||
-----------------------------------------------------------------------
 | 
					-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Breaking changes:
 | 
					Breaking changes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- TreeNode: Fixed a layout inconsistency when using a empty/hidden label followed
 | 
					- TreeNode: Fixed a layout inconsistency when using a empty/hidden label followed
 | 
				
			||||||
@@ -70,16 +72,17 @@ Other changes:
 | 
				
			|||||||
  duplicate with this fix. (#7399, #7404) [@GamingMinds-DanielC]
 | 
					  duplicate with this fix. (#7399, #7404) [@GamingMinds-DanielC]
 | 
				
			||||||
- TreeNode: Added ImGuiTreeNodeFlags_SpanTextWidth to make hitbox and highlight only
 | 
					- TreeNode: Added ImGuiTreeNodeFlags_SpanTextWidth to make hitbox and highlight only
 | 
				
			||||||
  cover the label. (#6937) [@dimateos]
 | 
					  cover the label. (#6937) [@dimateos]
 | 
				
			||||||
- ProgressBar: Added support for indeterminate progress bar by passing an animated
 | 
					 | 
				
			||||||
  negative fraction, e.g. ProgressBar(-1.0f * GetTime()). (#5316, #5370, #1901)[@gan74]
 | 
					 | 
				
			||||||
- Tables: Angled headers: fixed multi-line label display when angle is flipped. (#6917)
 | 
					- Tables: Angled headers: fixed multi-line label display when angle is flipped. (#6917)
 | 
				
			||||||
- Tables: Angled headers: added style.TableAngledHeadersTextAlign and corresponding
 | 
					- Tables: Angled headers: added style.TableAngledHeadersTextAlign and corresponding
 | 
				
			||||||
  ImGuiStyleVar_TableAngledHeadersTextAlign variable. Default to horizontal center. (#6917)
 | 
					  ImGuiStyleVar_TableAngledHeadersTextAlign variable. Default to horizontal center. (#6917)
 | 
				
			||||||
  [@thedmd, @ocornut]
 | 
					  [@thedmd, @ocornut]
 | 
				
			||||||
 | 
					- ProgressBar: Added support for indeterminate progress bar by passing an animated
 | 
				
			||||||
 | 
					  negative fraction, e.g. ProgressBar(-1.0f * GetTime()). (#5316, #5370, #1901)[@gan74]
 | 
				
			||||||
- Text, DrawList: Improved handling of long single-line wrapped text. Faster and
 | 
					- Text, DrawList: Improved handling of long single-line wrapped text. Faster and
 | 
				
			||||||
  mitigitate issues with reading vertex indexing limits with 16-bit indices. (#7496, #5720)
 | 
					  mitigate issues with reading vertex indexing limits with 16-bit indices. (#7496, #5720)
 | 
				
			||||||
- Backends: OpenGL: Detect ES3 contexts on desktop based on version string,
 | 
					- Backends: OpenGL3: Detect ES3 contexts on desktop based on version string,
 | 
				
			||||||
  to e.g. avoid calling glPolygonMode() on them. (#7447) [@afraidofdark, @ocornut]
 | 
					  to e.g. avoid calling glPolygonMode() on them. (#7447) [@afraidofdark, @ocornut]
 | 
				
			||||||
 | 
					- Backends: OpenGL3: Update loader for Linux to support EGL/GLVND. (#7562) [@ShadowNinja, @vanfanel]
 | 
				
			||||||
- Backends: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define.
 | 
					- Backends: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define.
 | 
				
			||||||
  (you could always use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + ImGui_ImplVulkan_LoadFunctions() as well).
 | 
					  (you could always use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + ImGui_ImplVulkan_LoadFunctions() as well).
 | 
				
			||||||
  (#6582, #4854) [@adalsteinnh, @kennyalive, @ocornut]
 | 
					  (#6582, #4854) [@adalsteinnh, @kennyalive, @ocornut]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (main code and documentation)
 | 
					// (main code and documentation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Help:
 | 
					// Help:
 | 
				
			||||||
@@ -438,7 +438,7 @@ CODE
 | 
				
			|||||||
                          - likewise io.MousePos and GetMousePos() will use OS coordinates.
 | 
					                          - likewise io.MousePos and GetMousePos() will use OS coordinates.
 | 
				
			||||||
                            If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
 | 
					                            If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - 2024/04/18 (1.90.6) - treeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282)
 | 
					 - 2024/04/18 (1.90.6) - TreeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282)
 | 
				
			||||||
                           - old: TreeNode("##Hidden"); SameLine(); Text("Hello");     // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise).
 | 
					                           - old: TreeNode("##Hidden"); SameLine(); Text("Hello");     // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise).
 | 
				
			||||||
                           - new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values.
 | 
					                           - new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values.
 | 
				
			||||||
                         with the fix, IF you were successfully using TreeNode("")+SameLine(); you will now have extra spacing between your TreeNode and the following item.
 | 
					                         with the fix, IF you were successfully using TreeNode("")+SameLine(); you will now have extra spacing between your TreeNode and the following item.
 | 
				
			||||||
@@ -6703,6 +6703,30 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// [EXPERIMENTAL] Called by Begin(). NextWindowData is valid at this point.
 | 
				
			||||||
 | 
					// This is designed as a toy/test-bed for
 | 
				
			||||||
 | 
					void ImGui::UpdateWindowSkipRefresh(ImGuiWindow* window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    window->SkipRefresh = false;
 | 
				
			||||||
 | 
					    if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasRefreshPolicy) == 0)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    if (g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_TryToAvoidRefresh)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // FIXME-IDLE: Tests for e.g. mouse clicks or keyboard while focused.
 | 
				
			||||||
 | 
					        if (window->Appearing) // If currently appearing
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        if (window->Hidden) // If was hidden (previous frame)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnHover) && g.HoveredWindow && window->RootWindow == g.HoveredWindow->RootWindow)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnFocus) && g.NavWindow && window->RootWindow == g.NavWindow->RootWindow)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        window->DrawList = NULL;
 | 
				
			||||||
 | 
					        window->SkipRefresh = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing)
 | 
					// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing)
 | 
				
			||||||
// should be positioned behind that modal window, unless the window was created inside the modal begin-stack.
 | 
					// should be positioned behind that modal window, unless the window was created inside the modal begin-stack.
 | 
				
			||||||
// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent.
 | 
					// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent.
 | 
				
			||||||
@@ -6950,11 +6974,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
    if (window->Appearing)
 | 
					    if (window->Appearing)
 | 
				
			||||||
        SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false);
 | 
					        SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // [EXPERIMENTAL] Skip Refresh mode
 | 
				
			||||||
 | 
					    UpdateWindowSkipRefresh(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
 | 
					    // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
 | 
				
			||||||
    g.CurrentWindow = NULL;
 | 
					    g.CurrentWindow = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // When reusing window again multiple times a frame, just append content (don't need to setup again)
 | 
					    // When reusing window again multiple times a frame, just append content (don't need to setup again)
 | 
				
			||||||
    if (first_begin_of_the_frame)
 | 
					    if (first_begin_of_the_frame && !window->SkipRefresh)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Initialize
 | 
					        // Initialize
 | 
				
			||||||
        const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345)
 | 
					        const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345)
 | 
				
			||||||
@@ -7547,6 +7574,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        // Skip refresh always mark active
 | 
				
			||||||
 | 
					        if (window->SkipRefresh)
 | 
				
			||||||
 | 
					            window->Active = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Append
 | 
					        // Append
 | 
				
			||||||
        SetCurrentViewport(window, window->Viewport);
 | 
					        SetCurrentViewport(window, window->Viewport);
 | 
				
			||||||
        SetCurrentWindow(window);
 | 
					        SetCurrentWindow(window);
 | 
				
			||||||
@@ -7554,7 +7585,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
        SetLastItemDataForWindow(window, window->TitleBarRect());
 | 
					        SetLastItemDataForWindow(window, window->TitleBarRect());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(flags & ImGuiWindowFlags_DockNodeHost))
 | 
					    if (!(flags & ImGuiWindowFlags_DockNodeHost) && !window->SkipRefresh)
 | 
				
			||||||
        PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true);
 | 
					        PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused)
 | 
					    // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused)
 | 
				
			||||||
@@ -7562,7 +7593,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
    window->BeginCount++;
 | 
					    window->BeginCount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update visibility
 | 
					    // Update visibility
 | 
				
			||||||
    if (first_begin_of_the_frame)
 | 
					    if (first_begin_of_the_frame && !window->SkipRefresh)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // When we are about to select this tab (which will only be visible on the _next frame_), flag it with a non-zero HiddenFramesCannotSkipItems.
 | 
					        // When we are about to select this tab (which will only be visible on the _next frame_), flag it with a non-zero HiddenFramesCannotSkipItems.
 | 
				
			||||||
        // This will have the important effect of actually returning true in Begin() and not setting SkipItems, allowing an earlier submission of the window contents.
 | 
					        // This will have the important effect of actually returning true in Begin() and not setting SkipItems, allowing an earlier submission of the window contents.
 | 
				
			||||||
@@ -7630,6 +7661,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
        if (window->SkipItems && !window->Appearing)
 | 
					        if (window->SkipItems && !window->Appearing)
 | 
				
			||||||
            IM_ASSERT(window->Appearing == false); // Please report on GitHub if this triggers: https://github.com/ocornut/imgui/issues/4177
 | 
					            IM_ASSERT(window->Appearing == false); // Please report on GitHub if this triggers: https://github.com/ocornut/imgui/issues/4177
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else if (first_begin_of_the_frame)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Skip refresh mode
 | 
				
			||||||
 | 
					        window->SkipItems = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // [DEBUG] io.ConfigDebugBeginReturnValue override return value to test Begin/End and BeginChild/EndChild behaviors.
 | 
					    // [DEBUG] io.ConfigDebugBeginReturnValue override return value to test Begin/End and BeginChild/EndChild behaviors.
 | 
				
			||||||
    // (The implicit fallback window is NOT automatically ended allowing it to always be able to receive commands without crashing)
 | 
					    // (The implicit fallback window is NOT automatically ended allowing it to always be able to receive commands without crashing)
 | 
				
			||||||
@@ -7675,10 +7711,16 @@ void ImGui::End()
 | 
				
			|||||||
    // Close anything that is open
 | 
					    // Close anything that is open
 | 
				
			||||||
    if (window->DC.CurrentColumns)
 | 
					    if (window->DC.CurrentColumns)
 | 
				
			||||||
        EndColumns();
 | 
					        EndColumns();
 | 
				
			||||||
    if (!(window->Flags & ImGuiWindowFlags_DockNodeHost))   // Pop inner window clip rectangle
 | 
					    if (!(window->Flags & ImGuiWindowFlags_DockNodeHost) && !window->SkipRefresh)   // Pop inner window clip rectangle
 | 
				
			||||||
        PopClipRect();
 | 
					        PopClipRect();
 | 
				
			||||||
    PopFocusScope();
 | 
					    PopFocusScope();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (window->SkipRefresh)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        IM_ASSERT(window->DrawList == NULL);
 | 
				
			||||||
 | 
					        window->DrawList = &window->DrawListInst;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Stop logging
 | 
					    // Stop logging
 | 
				
			||||||
    if (!(window->Flags & ImGuiWindowFlags_ChildWindow))    // FIXME: add more options for scope of logging
 | 
					    if (!(window->Flags & ImGuiWindowFlags_ChildWindow))    // FIXME: add more options for scope of logging
 | 
				
			||||||
        LogFinish();
 | 
					        LogFinish();
 | 
				
			||||||
@@ -8426,6 +8468,14 @@ void ImGui::SetNextWindowClass(const ImGuiWindowClass* window_class)
 | 
				
			|||||||
    g.NextWindowData.WindowClass = *window_class;
 | 
					    g.NextWindowData.WindowClass = *window_class;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This is experimental and meant to be a toy for exploring a future/wider range of features.
 | 
				
			||||||
 | 
					void ImGui::SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasRefreshPolicy;
 | 
				
			||||||
 | 
					    g.NextWindowData.RefreshFlagsVal = flags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ImDrawList* ImGui::GetWindowDrawList()
 | 
					ImDrawList* ImGui::GetWindowDrawList()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
					    ImGuiWindow* window = GetCurrentWindow();
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							@@ -27,8 +27,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Library Version
 | 
					// Library Version
 | 
				
			||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
 | 
					// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
 | 
				
			||||||
#define IMGUI_VERSION       "1.90.6 WIP"
 | 
					#define IMGUI_VERSION       "1.90.6"
 | 
				
			||||||
#define IMGUI_VERSION_NUM   19054
 | 
					#define IMGUI_VERSION_NUM   19060
 | 
				
			||||||
#define IMGUI_HAS_TABLE
 | 
					#define IMGUI_HAS_TABLE
 | 
				
			||||||
#define IMGUI_HAS_VIEWPORT          // Viewport WIP branch
 | 
					#define IMGUI_HAS_VIEWPORT          // Viewport WIP branch
 | 
				
			||||||
#define IMGUI_HAS_DOCK              // Docking WIP branch
 | 
					#define IMGUI_HAS_DOCK              // Docking WIP branch
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (demo code)
 | 
					// (demo code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Help:
 | 
					// Help:
 | 
				
			||||||
@@ -10,6 +10,11 @@
 | 
				
			|||||||
// Read top of imgui.cpp and imgui.h for many details, documentation, comments, links.
 | 
					// Read top of imgui.cpp and imgui.h for many details, documentation, comments, links.
 | 
				
			||||||
// Get the latest version at https://github.com/ocornut/imgui
 | 
					// Get the latest version at https://github.com/ocornut/imgui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// How to easily locate code?
 | 
				
			||||||
 | 
					// - Use the Item Picker to debug break in code by clicking any widgets: https://github.com/ocornut/imgui/wiki/Debug-Tools
 | 
				
			||||||
 | 
					// - Browse an online version the demo with code linked to hovered widgets: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html
 | 
				
			||||||
 | 
					// - Find a visible string and search for it in the code!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//---------------------------------------------------
 | 
					//---------------------------------------------------
 | 
				
			||||||
// PLEASE DO NOT REMOVE THIS FILE FROM YOUR PROJECT!
 | 
					// PLEASE DO NOT REMOVE THIS FILE FROM YOUR PROJECT!
 | 
				
			||||||
//---------------------------------------------------
 | 
					//---------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (drawing and font code)
 | 
					// (drawing and font code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -391,6 +391,7 @@ void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Initialize before use in a new frame. We always have a command ready in the buffer.
 | 
					// Initialize before use in a new frame. We always have a command ready in the buffer.
 | 
				
			||||||
 | 
					// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this.
 | 
				
			||||||
void ImDrawList::_ResetForNewFrame()
 | 
					void ImDrawList::_ResetForNewFrame()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory.
 | 
					    // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (internal structures/api)
 | 
					// (internal structures/api)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
 | 
					// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
 | 
				
			||||||
@@ -189,6 +189,7 @@ typedef int ImGuiSeparatorFlags;        // -> enum ImGuiSeparatorFlags_     // F
 | 
				
			|||||||
typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx()
 | 
					typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx()
 | 
				
			||||||
typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx()
 | 
					typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx()
 | 
				
			||||||
typedef int ImGuiTypingSelectFlags;     // -> enum ImGuiTypingSelectFlags_  // Flags: for GetTypingSelectRequest()
 | 
					typedef int ImGuiTypingSelectFlags;     // -> enum ImGuiTypingSelectFlags_  // Flags: for GetTypingSelectRequest()
 | 
				
			||||||
 | 
					typedef int ImGuiWindowRefreshFlags;    // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
 | 
					typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1129,6 +1130,15 @@ struct IMGUI_API ImGuiInputTextState
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ImGuiWindowRefreshFlags_
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ImGuiWindowRefreshFlags_None                = 0,
 | 
				
			||||||
 | 
					    ImGuiWindowRefreshFlags_TryToAvoidRefresh   = 1 << 0,   // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
 | 
				
			||||||
 | 
					    ImGuiWindowRefreshFlags_RefreshOnHover      = 1 << 1,   // [EXPERIMENTAL] Always refresh on hover
 | 
				
			||||||
 | 
					    ImGuiWindowRefreshFlags_RefreshOnFocus      = 1 << 2,   // [EXPERIMENTAL] Always refresh on focus
 | 
				
			||||||
 | 
					    // Refresh policy/frequency, Load Balancing etc.
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ImGuiNextWindowDataFlags_
 | 
					enum ImGuiNextWindowDataFlags_
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiNextWindowDataFlags_None               = 0,
 | 
					    ImGuiNextWindowDataFlags_None               = 0,
 | 
				
			||||||
@@ -1141,9 +1151,10 @@ enum ImGuiNextWindowDataFlags_
 | 
				
			|||||||
    ImGuiNextWindowDataFlags_HasBgAlpha         = 1 << 6,
 | 
					    ImGuiNextWindowDataFlags_HasBgAlpha         = 1 << 6,
 | 
				
			||||||
    ImGuiNextWindowDataFlags_HasScroll          = 1 << 7,
 | 
					    ImGuiNextWindowDataFlags_HasScroll          = 1 << 7,
 | 
				
			||||||
    ImGuiNextWindowDataFlags_HasChildFlags      = 1 << 8,
 | 
					    ImGuiNextWindowDataFlags_HasChildFlags      = 1 << 8,
 | 
				
			||||||
    ImGuiNextWindowDataFlags_HasViewport        = 1 << 9,
 | 
					    ImGuiNextWindowDataFlags_HasRefreshPolicy   = 1 << 9,
 | 
				
			||||||
    ImGuiNextWindowDataFlags_HasDock            = 1 << 10,
 | 
					    ImGuiNextWindowDataFlags_HasViewport        = 1 << 10,
 | 
				
			||||||
    ImGuiNextWindowDataFlags_HasWindowClass     = 1 << 11,
 | 
					    ImGuiNextWindowDataFlags_HasDock            = 1 << 11,
 | 
				
			||||||
 | 
					    ImGuiNextWindowDataFlags_HasWindowClass     = 1 << 12,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Storage for SetNexWindow** functions
 | 
					// Storage for SetNexWindow** functions
 | 
				
			||||||
@@ -1170,6 +1181,7 @@ struct ImGuiNextWindowData
 | 
				
			|||||||
    ImGuiID                     DockId;
 | 
					    ImGuiID                     DockId;
 | 
				
			||||||
    ImGuiWindowClass            WindowClass;
 | 
					    ImGuiWindowClass            WindowClass;
 | 
				
			||||||
    ImVec2                      MenuBarOffsetMinVal;    // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
 | 
					    ImVec2                      MenuBarOffsetMinVal;    // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
 | 
				
			||||||
 | 
					    ImGuiWindowRefreshFlags     RefreshFlagsVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiNextWindowData()       { memset(this, 0, sizeof(*this)); }
 | 
					    ImGuiNextWindowData()       { memset(this, 0, sizeof(*this)); }
 | 
				
			||||||
    inline void ClearFlags()    { Flags = ImGuiNextWindowDataFlags_None; }
 | 
					    inline void ClearFlags()    { Flags = ImGuiNextWindowDataFlags_None; }
 | 
				
			||||||
@@ -2763,6 +2775,7 @@ struct IMGUI_API ImGuiWindow
 | 
				
			|||||||
    bool                    Collapsed;                          // Set when collapsing window to become only title-bar
 | 
					    bool                    Collapsed;                          // Set when collapsing window to become only title-bar
 | 
				
			||||||
    bool                    WantCollapseToggle;
 | 
					    bool                    WantCollapseToggle;
 | 
				
			||||||
    bool                    SkipItems;                          // Set when items can safely be all clipped (e.g. window not visible or collapsed)
 | 
					    bool                    SkipItems;                          // Set when items can safely be all clipped (e.g. window not visible or collapsed)
 | 
				
			||||||
 | 
					    bool                    SkipRefresh;                        // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.
 | 
				
			||||||
    bool                    Appearing;                          // Set during the frame where the window is appearing (or re-appearing)
 | 
					    bool                    Appearing;                          // Set during the frame where the window is appearing (or re-appearing)
 | 
				
			||||||
    bool                    Hidden;                             // Do not display (== HiddenFrames*** > 0)
 | 
					    bool                    Hidden;                             // Do not display (== HiddenFrames*** > 0)
 | 
				
			||||||
    bool                    IsFallbackWindow;                   // Set on the "Debug##Default" window.
 | 
					    bool                    IsFallbackWindow;                   // Set on the "Debug##Default" window.
 | 
				
			||||||
@@ -3255,6 +3268,7 @@ namespace ImGui
 | 
				
			|||||||
    IMGUI_API ImGuiWindow*  FindWindowByID(ImGuiID id);
 | 
					    IMGUI_API ImGuiWindow*  FindWindowByID(ImGuiID id);
 | 
				
			||||||
    IMGUI_API ImGuiWindow*  FindWindowByName(const char* name);
 | 
					    IMGUI_API ImGuiWindow*  FindWindowByName(const char* name);
 | 
				
			||||||
    IMGUI_API void          UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
 | 
					    IMGUI_API void          UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
 | 
				
			||||||
 | 
					    IMGUI_API void          UpdateWindowSkipRefresh(ImGuiWindow* window);
 | 
				
			||||||
    IMGUI_API ImVec2        CalcWindowNextAutoFitSize(ImGuiWindow* window);
 | 
					    IMGUI_API ImVec2        CalcWindowNextAutoFitSize(ImGuiWindow* window);
 | 
				
			||||||
    IMGUI_API bool          IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy, bool dock_hierarchy);
 | 
					    IMGUI_API bool          IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy, bool dock_hierarchy);
 | 
				
			||||||
    IMGUI_API bool          IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
 | 
					    IMGUI_API bool          IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
 | 
				
			||||||
@@ -3280,6 +3294,9 @@ namespace ImGui
 | 
				
			|||||||
    IMGUI_API int           FindWindowDisplayIndex(ImGuiWindow* window);
 | 
					    IMGUI_API int           FindWindowDisplayIndex(ImGuiWindow* window);
 | 
				
			||||||
    IMGUI_API ImGuiWindow*  FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
 | 
					    IMGUI_API ImGuiWindow*  FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Windows: Idle, Refresh Policies [EXPERIMENTAL]
 | 
				
			||||||
 | 
					    IMGUI_API void          SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Fonts, drawing
 | 
					    // Fonts, drawing
 | 
				
			||||||
    IMGUI_API void          SetCurrentFont(ImFont* font);
 | 
					    IMGUI_API void          SetCurrentFont(ImFont* font);
 | 
				
			||||||
    inline ImFont*          GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
 | 
					    inline ImFont*          GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (tables and columns code)
 | 
					// (tables and columns code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// dear imgui, v1.90.6 WIP
 | 
					// dear imgui, v1.90.6
 | 
				
			||||||
// (widgets code)
 | 
					// (widgets code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user