Align mpv_widget with working Python reference from Gelata

This commit is contained in:
Brendan Szymanski 2026-06-24 13:35:46 -04:00
parent 7168135f4c
commit 29acef1e0a
3 changed files with 26 additions and 8 deletions

View file

@ -65,6 +65,7 @@ let package = Package(
linkerSettings: [
.unsafeFlags(["-L/opt/homebrew/lib"], .when(platforms: [.macOS])),
.linkedLibrary("mpv"),
.linkedLibrary("epoxy"),
]
),

View file

@ -1,6 +1,7 @@
#include "mpv_widget.h"
#include <mpv/client.h>
#include <mpv/render_gl.h>
#include <epoxy/gl.h>
#include <dlfcn.h>
#include <math.h>
@ -27,11 +28,24 @@ static guint signals[LAST_SIGNAL] = {0};
G_DEFINE_TYPE(MpvWidget, mpv_widget, GTK_TYPE_WIDGET)
static gboolean
mpv_widget_render_frame(gpointer user_data)
{
MpvWidget *self = MPV_WIDGET(user_data);
gtk_gl_area_queue_render(GTK_GL_AREA(self->gl_area));
return G_SOURCE_REMOVE;
}
static void
mpv_render_update(void *cb_ctx)
{
MpvWidget *self = MPV_WIDGET(cb_ctx);
gtk_gl_area_queue_render(GTK_GL_AREA(self->gl_area));
if (self->mpv_gl) {
int64_t flags = mpv_render_context_update(self->mpv_gl);
if (flags & MPV_RENDER_UPDATE_FRAME) {
g_idle_add(mpv_widget_render_frame, self);
}
}
}
static void *
@ -54,6 +68,7 @@ mpv_widget_on_realize(GtkWidget *widget, gpointer user_data)
if (!self->mpv)
return;
mpv_set_option_string(self->mpv, "vo", "libmpv");
mpv_set_option_string(self->mpv, "hwdec", "auto");
mpv_set_option_string(self->mpv, "keep-open", "yes");
@ -117,14 +132,18 @@ mpv_widget_on_render(GtkGLArea *area, GdkGLContext *context, gpointer user_data)
if (!self->mpv_gl)
return TRUE;
int width = gtk_widget_get_width(GTK_WIDGET(area));
int height = gtk_widget_get_height(GTK_WIDGET(area));
int scale = gtk_widget_get_scale_factor(GTK_WIDGET(area));
int width = gtk_widget_get_width(GTK_WIDGET(area)) * scale;
int height = gtk_widget_get_height(GTK_WIDGET(area)) * scale;
if (width <= 0 || height <= 0)
return TRUE;
GLint fbo_id = 0;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fbo_id);
mpv_opengl_fbo fbo = {
.fbo = 0,
.fbo = (int)fbo_id,
.w = width,
.h = height,
};
@ -154,9 +173,6 @@ mpv_widget_tick(gpointer user_data)
mpv_event *event = mpv_wait_event(self->mpv, 0);
if (event->event_id == MPV_EVENT_NONE)
break;
if (event->event_id == MPV_EVENT_NONE) {
// mpv 2.5+ removed MPV_EVENT_ERROR; errors are reported via other events.
}
if (event->event_id == MPV_EVENT_END_FILE) {
g_signal_emit(self, signals[SIGNAL_PLAYBACK_STATE_CHANGED], 0, TRUE);
}
@ -272,6 +288,7 @@ static void
mpv_widget_init(MpvWidget *self)
{
self->gl_area = gtk_gl_area_new();
gtk_gl_area_set_auto_render(GTK_GL_AREA(self->gl_area), FALSE);
gtk_widget_set_hexpand(self->gl_area, TRUE);
gtk_widget_set_vexpand(self->gl_area, TRUE);

View file

@ -58,7 +58,7 @@ public struct PlayerView: View {
isPlaying: $isPlaying,
position: $position,
duration: $duration,
onWidgetCreated: { ptr in mpvWidget = ptr }
onWidgetCreated: { ptr in /*mpvWidget = ptr*/ }
)
.vexpand(true)
.hexpand(true)