diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c index 1be1ec622b26b231bc78dc8dfd732ef112e9e7d1..7c9c7e6744d2783e4afc0494d112ec1ed3c78882 100644 --- a/src/module/module_sdl2.c +++ b/src/module/module_sdl2.c @@ -36,6 +36,7 @@ struct module_sdl2_window { pthread_mutex_t mtx; struct lkt_thread self; volatile int launched; + volatile int mpv_wakeup; }; /* Thread related functions */ @@ -51,8 +52,8 @@ sdl_thread__(struct lkt_thread_arg *arg) int w, h; free(arg); (void) self; - if (sdl2 == NULL) - return false; + RETURN_UNLESS(sdl2, "Big nope here, the sdl window pointer is NULL", NULL); + fprintf(stderr, " * Started SDL thread\n"); /* SDL events won't change the database, only the mpv one's will. Do this to be able to put the SDL stuff inside a thread and don't change @@ -96,6 +97,8 @@ loop: flags = mpv_render_context_update(sdl2->mpv_gl); if (flags & MPV_RENDER_UPDATE_FRAME) redraw = 1; + if (event.type == wakeup_on_mpv_events) + sdl2->mpv_wakeup = 1; } /* Handle mpv events are not done here. */ } @@ -217,8 +220,8 @@ module_sdl2_new(struct lkt_win *const win) if (sdl2 == NULL) { sdl2 = calloc(1, sizeof(struct module_sdl2_window)); - memset(sdl2, 0, sizeof(struct module_sdl2_window)); RETURN_UNLESS(sdl2, "Out of memory", false); + memset(sdl2, 0, sizeof(struct module_sdl2_window)); /* Yeah, this is how it is done. */ pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; @@ -259,19 +262,21 @@ module_sdl2_new(struct lkt_win *const win) /* Init mpv_gl here */ RETURN_IF(init_mpv_gl__(sdl2->mpv, &sdl2->mpv_gl, params), "Failed to init mpv_gl", false); + /* Finish */ + SDL_SetWindowTitle(sdl2->window, "Lektord"); + SDL_DisableScreenSaver(); + win->window = sdl2; + /* Start the SDL thread */ if (!sdl2->launched) { struct lkt_thread_arg *arg = calloc(1, sizeof(struct lkt_thread_arg)); RETURN_UNLESS(arg, "Out of memory", false); arg->args = win; + sdl2->launched = 1; RETURN_IF(lkt_th_new(&sdl2->self, LKT_DEFAULT_LIST_SIZE, sdl_thread__, arg), "Failed to launch the SDL thread", false); } - /* Finish */ - SDL_SetWindowTitle(sdl2->window, "Lektord"); - SDL_DisableScreenSaver(); - win->window = sdl2; return true; } @@ -338,7 +343,12 @@ module_sdl2_handle_events(struct lkt_win *const win, sqlite3 *db, enum mpd_idle_ { struct module_sdl2_window *sdl2 = win->window; RETURN_UNLESS(sdl2, "Can't handle events from a NULL window", false); - return ! lmpv_handle(win, sdl2->mpv, db, mpd_idle_events, - (int *) &sdl2->mpv_time_pos, - (int *) &sdl2->mpv_duration); + if (sdl2->mpv_wakeup) { + sdl2->mpv_wakeup = 0; + return ! lmpv_handle(win, sdl2->mpv, db, mpd_idle_events, + (int *) &sdl2->mpv_time_pos, + (int *) &sdl2->mpv_duration); + } + else + return true; }