diff --git a/src/iface-video/sdlapp/sdlapp_imgui_video.cpp b/src/iface-video/sdlapp/sdlapp_imgui_video.cpp index 64f2e4e..5508c36 100644 --- a/src/iface-video/sdlapp/sdlapp_imgui_video.cpp +++ b/src/iface-video/sdlapp/sdlapp_imgui_video.cpp @@ -41,7 +41,7 @@ typedef struct SdlappMyImGuiVideo_t { SDL_Surface *surface; - SDL_TimerID update_title_timer; + guint update_title_timer; Uint64 lastPictureTime; int TARGET_FPS; int FRAME_TIME; @@ -153,14 +153,18 @@ static void sdlapp_myimgui_video_set_colormap(uint32_t *colormap) video_sdl3_set_surface_colormap(colormap, g_sdlapp_myimgui_video->surface); } -static Uint32 sdlapp_mygui_video_update_status_line(void *userdata, SDL_TimerID timerID, Uint32 interval) +static gboolean sdlapp_mygui_video_update_status_line(guint timer_id, gpointer user_data) { - (void)timerID; - SDL_Window *window = (SDL_Window *)userdata; + (void)timer_id; + SDL_Window *window = (SDL_Window *)user_data; + if (!window) + { + return FALSE; + } char *title_text = iface_video_create_window_title_text(); SDL_SetWindowTitle(window, title_text); g_free(title_text); - return interval; + return TRUE; } static gboolean sdlapp_myimgui_video_init(void) @@ -308,7 +312,7 @@ static gboolean sdlapp_myimgui_video_init(void) // protože SetForegroundWindow selže když foreground drží konzole) // Nastavení titulku okna - g_sdlapp_myimgui_video->update_title_timer = SDL_AddTimer(IFACE_VIDEO_UPDATE_WINDOW_TITLE_INTERVAL_MS, sdlapp_mygui_video_update_status_line, win->sdl_window); + g_sdlapp_myimgui_video->update_title_timer = sdlapp_add_timer(g_sdlapp, IFACE_VIDEO_UPDATE_WINDOW_TITLE_INTERVAL_MS, sdlapp_mygui_video_update_status_line, win->sdl_window); sdlapp_myimgui_video_reset_fps_timer(); @@ -326,7 +330,8 @@ static void sdlapp_myimgui_video_exit(void) { if (g_sdlapp_myimgui_video->update_title_timer) { - SDL_RemoveTimer(g_sdlapp_myimgui_video->update_title_timer); + sdlapp_remove_timer(g_sdlapp, g_sdlapp_myimgui_video->update_title_timer); + g_sdlapp_myimgui_video->update_title_timer = 0; }; if (g_sdlapp_myimgui_video->surface) @@ -337,6 +342,14 @@ static void sdlapp_myimgui_video_exit(void) g_free(g_sdlapp_myimgui_video); g_sdlapp_myimgui_video = NULL; }; + if (!headless) + { + if (g_gui && g_gui->win && g_gui->win->sdl_window && g_gui->win->gl_context) + { + SDL_GL_MakeCurrent(g_gui->win->sdl_window, g_gui->win->gl_context); + } + imgui_images_destroy_all(); + }; if (headless && g_gui) { /* Stub g_gui byl alokovaný v init headless větvi - free, ne destroy @@ -344,11 +357,6 @@ static void sdlapp_myimgui_video_exit(void) g_free(g_gui); }; g_gui = NULL; - sdl3_backend_video_quit(); - if (!headless) - { - imgui_images_destroy_all(); - }; } static SDL_Window *getSDL_Window_by_name(const char *name) diff --git a/src/iface/iface_video.c b/src/iface/iface_video.c index 278f66f..a040743 100644 --- a/src/iface/iface_video.c +++ b/src/iface/iface_video.c @@ -107,6 +107,15 @@ void iface_video_exit(void) if (!g_iface_video) return; + if (g_iface_video_callbacks->exit) + { + g_iface_video_callbacks->exit(); + } + else + { + WARN("Exit callback is not set!\n"); + }; + if (g_iface_video->redraw_full_screen_request_rwlock) { APP_RWLOCK_DESTROY(g_iface_video->redraw_full_screen_request_rwlock); @@ -129,15 +138,6 @@ void iface_video_exit(void) g_free(g_iface_video); g_iface_video = NULL; - - if (g_iface_video_callbacks->exit) - { - g_iface_video_callbacks->exit(); - } - else - { - WARN("Exit callback is not set!\n"); - }; } char *iface_video_create_window_title_text(void) diff --git a/src/ui-imgui/bootstrap/myimgui.cpp b/src/ui-imgui/bootstrap/myimgui.cpp index f1cbd30..9ae5b44 100644 --- a/src/ui-imgui/bootstrap/myimgui.cpp +++ b/src/ui-imgui/bootstrap/myimgui.cpp @@ -260,6 +260,11 @@ static gboolean myimgui_init_for_sdl3_opengl(SdlAppWindow *win, gpointer user_da SDLAPP_ERROR("Failed to get GL context"); return false; }; + if (!SDL_GL_MakeCurrent(sdl_window, gl_context)) + { + SDLAPP_ERROR("SDL_GL_MakeCurrent failed: %s", SDL_GetError()); + return false; + }; // Setup Dear ImGui context IMGUI_CHECKVERSION(); @@ -597,6 +602,11 @@ void myimgui_render_cb(SdlAppWindow *win, gpointer user_data) } else if (win->renderer_type == SDLAPP_RENDERER_OPENGL) { + if (!SDL_GL_MakeCurrent(win->sdl_window, win->gl_context)) + { + SDLAPP_ERROR("SDL_GL_MakeCurrent failed: %s", SDL_GetError()); + return; + }; ImGui_ImplOpenGL3_NewFrame(); } else @@ -665,6 +675,10 @@ void myimgui_destroy_cb(SdlAppWindow *win, gpointer user_data) } else if (win->renderer_type == SDLAPP_RENDERER_OPENGL) { + if (win->sdl_window && win->gl_context) + { + SDL_GL_MakeCurrent(win->sdl_window, win->gl_context); + } ImGui_ImplOpenGL3_Shutdown(); } else