Align mpv_widget with working Python reference from Gelata
This commit is contained in:
parent
7168135f4c
commit
29acef1e0a
3 changed files with 26 additions and 8 deletions
|
|
@ -65,6 +65,7 @@ let package = Package(
|
|||
linkerSettings: [
|
||||
.unsafeFlags(["-L/opt/homebrew/lib"], .when(platforms: [.macOS])),
|
||||
.linkedLibrary("mpv"),
|
||||
.linkedLibrary("epoxy"),
|
||||
]
|
||||
),
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue