Assign drags to first-empty pane and ensure mpv ready before load

This commit is contained in:
Stu 2025-12-14 00:46:50 -05:00
parent 29bc1ac19c
commit bd1b90be03

View File

@ -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 ""