From bd1b90be0365e219966059340d0bcae68bfff79a Mon Sep 17 00:00:00 2001 From: Stu Date: Sun, 14 Dec 2025 00:46:50 -0500 Subject: [PATCH] Assign drags to first-empty pane and ensure mpv ready before load --- cmd/gtkplayer/main.go | 60 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/cmd/gtkplayer/main.go b/cmd/gtkplayer/main.go index c5ff519..f1161df 100644 --- a/cmd/gtkplayer/main.go +++ b/cmd/gtkplayer/main.go @@ -42,6 +42,8 @@ type pane struct { path string } +func (p *pane) hasVideo() bool { return p.path != "" } + func main() { gtk.Init(nil) @@ -68,8 +70,7 @@ func main() { applyCSS() preferDark() - setupDragDest(left, win) - setupDragDest(right, win) + setupDragDest(left, right, win) win.Connect("destroy", func() { if left.mpv != nil { @@ -213,7 +214,7 @@ func chooseAndLoad(win *gtk.Window, p *pane) { } func loadIntoPane(p *pane, filename string) { - if p.mpv == nil { + if !ensurePaneReady(p) { return } p.path = filename @@ -306,14 +307,59 @@ func setupDragDest(p *pane, win *gtk.Window) { if ln == "" { continue } - if path := uriToPath(ln); path != "" { - loadIntoPane(p, path) - break - } + assignPathToPane(ln, p, nil) + break } }) } +// decide which pane to load based on availability: left prefers first, right second. +func assignPathToPane(uri string, left, right *pane) { + path := uriToPath(uri) + if path == "" { + return + } + if left != nil && !left.hasVideo() { + loadIntoPane(left, path) + return + } + if right != nil && !right.hasVideo() { + loadIntoPane(right, path) + return + } + // default: replace left + if left != nil { + loadIntoPane(left, path) + } +} + +func ensurePaneReady(p *pane) bool { + if p == nil { + return false + } + if p.mpv != nil { + return true + } + mpv, err := mpvembed.New() + if err != nil { + log.Printf("mpv create: %v", err) + return false + } + // Bind window if realized + if w, err := p.area.GetWindow(); err == nil && w != nil { + if xid := getWindowID(w); xid != 0 { + _ = mpv.SetWID(xid) + } + } + _ = mpv.SetOptionString("pause", "yes") + if err := mpv.Initialize(); err != nil { + log.Printf("mpv init: %v", err) + return false + } + p.mpv = mpv + return true +} + func uriToPath(u string) string { if u == "" { return ""