diff options
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/gl_wayland.c | 30 | ||||
-rw-r--r-- | video/out/wayland_common.h | 3 |
2 files changed, 32 insertions, 1 deletions
diff --git a/video/out/gl_wayland.c b/video/out/gl_wayland.c index e13314f531..ddc12c2486 100644 --- a/video/out/gl_wayland.c +++ b/video/out/gl_wayland.c @@ -196,12 +196,40 @@ static void releaseGlContext_wayland(MPGLContext *ctx) wl->egl_context.egl.ctx = NULL; } -static void swapGlBuffers_wayland(MPGLContext *ctx) +static const struct wl_callback_listener frame_listener; + +static void frame_handle_redraw(void *data, + struct wl_callback *callback, + uint32_t time) + { + MPGLContext *ctx = data; struct vo_wayland_state *wl = ctx->vo->wayland; + + if (callback) + wl_callback_destroy(callback); + + //struct wl_callback *tmp = wl_surface_frame(wl->window.surface); + //wl_callback_add_listener(tmp, &frame_listener, ctx); + wl->egl_context.redraw_callback = wl_surface_frame(wl->window.surface); + wl_callback_add_listener(wl->egl_context.redraw_callback, &frame_listener, ctx); + eglSwapBuffers(wl->egl_context.egl.dpy, wl->egl_context.egl_surface); } +static const struct wl_callback_listener frame_listener = { + frame_handle_redraw +}; + +static void swapGlBuffers_wayland(MPGLContext *ctx) +{ + struct vo_wayland_state *wl = ctx->vo->wayland; +// eglSwapBuffers(wl->egl_context.egl.dpy, wl->egl_context.egl_surface); + + if (!wl->egl_context.redraw_callback) + frame_handle_redraw(ctx, NULL, 0); +} + static int control(struct vo *vo, int *events, int request, void *data) { struct vo_wayland_state *wl = vo->wayland; diff --git a/video/out/wayland_common.h b/video/out/wayland_common.h index ac5fc3cf39..e8e0420706 100644 --- a/video/out/wayland_common.h +++ b/video/out/wayland_common.h @@ -60,6 +60,9 @@ struct vo_wayland_state { EGLContext ctx; EGLConfig conf; } egl; + + + struct wl_callback * redraw_callback; } egl_context; #endif |