summary refs log tree commit diff
path: root/.config/mpv/mvi/scripts/status-line.lua
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2026-04-08 13:26:13 +0900
committerRobert Günzler <r@gnzler.io>2026-04-08 13:26:13 +0900
commit4e34cbf9673aeaba252e01df554a0d204e83c5e2 (patch)
treef3eea07d0e2bf1628ce19987c5164577f63ac614 /.config/mpv/mvi/scripts/status-line.lua
parent28db7c76e26c312918959384e02e433f8858de49 (diff)
Automated-commit-by: dots
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '.config/mpv/mvi/scripts/status-line.lua')
-rw-r--r--.config/mpv/mvi/scripts/status-line.lua142
1 files changed, 142 insertions, 0 deletions
diff --git a/.config/mpv/mvi/scripts/status-line.lua b/.config/mpv/mvi/scripts/status-line.lua
new file mode 100644
index 0000000..7ac5168
--- /dev/null
+++ b/.config/mpv/mvi/scripts/status-line.lua
@@ -0,0 +1,142 @@
+local opts = {
+    enabled = true,
+    size = 36,
+    margin = 10,
+    text_top_left = "",
+    text_top_right = "",
+    text_bottom_left = "${filename} [${playlist-pos-1}/${playlist-count}]",
+    text_bottom_right = "[${dwidth:X}x${dheight:X}]",
+}
+
+local msg = require 'mp.msg'
+local assdraw = require 'mp.assdraw'
+local options = require 'mp.options'
+
+options.read_options(opts, nil, function(c)
+    if c["enabled"] then
+        if opts.enabled then
+            enable()
+        else
+            disable()
+        end
+    end
+    if c["size"] or c["margin"] then
+        mark_stale()
+    end
+    if c["text_top_left"] or
+       c["text_top_right"] or
+       c["text_bottom_left"] or
+       c["text_bottom_right"]
+    then
+        observe_properties()
+        mark_stale()
+    end
+end)
+
+local stale = true
+local active = false
+
+function draw_ass(ass)
+    local ww, wh = mp.get_osd_size()
+    mp.set_osd_ass(ww, wh, ass)
+end
+
+function refresh()
+    if not stale then return end
+    stale = false
+    local a = assdraw:ass_new()
+    local draw_text = function(text, an, x, y)
+        if text == "" then return end
+        local expanded = mp.command_native({ "expand-text", text})
+        if not expanded then
+            msg.error("Error expanding status-line")
+            return
+        end
+        msg.verbose("Status-line changed to: " .. expanded)
+        a:new_event()
+        a:an(an)
+        a:pos(x,y)
+        a:append("{\\fs".. opts.size.. "}{\\bord1.0}")
+        a:append(expanded)
+    end
+    local w,h = mp.get_osd_size()
+    local m = opts.margin
+    draw_text(opts.text_top_left, 7, m, m)
+    draw_text(opts.text_top_right, 9, w-m, m)
+    draw_text(opts.text_bottom_left, 1, m, h-m)
+    draw_text(opts.text_bottom_right, 3, w-m, h-m)
+    draw_ass(a.text)
+end
+
+function mark_stale()
+    stale = true
+end
+
+function observe_properties()
+    mp.unobserve_property(mark_stale)
+    if not active then return end
+    for _, str in ipairs({
+        opts.text_top_left,
+        opts.text_top_right,
+        opts.text_bottom_left,
+        opts.text_bottom_right,
+    }) do
+        local start = 0
+        while true do
+            local s, e, cap = string.find(str, "%${[?!]?([%l%d-/]*)", start)
+            if not s then break end
+            msg.verbose("Observing property " .. cap)
+            mp.observe_property(cap, nil, mark_stale)
+            start = e
+        end
+    end
+    mp.observe_property("osd-width", nil, mark_stale)
+    mp.observe_property("osd-height", nil, mark_stale)
+end
+
+function enable()
+    if active then return end
+    active = true
+    observe_properties()
+    mp.register_idle(refresh)
+    mark_stale()
+end
+
+
+function disable()
+    if not active then return end
+    active = false
+    observe_properties()
+    mp.unregister_idle(refresh)
+    draw_ass("")
+end
+
+function toggle()
+    if active then
+        disable()
+    else
+        enable()
+    end
+end
+
+if opts.enabled then
+    enable()
+end
+
+mp.add_key_binding(nil, "status-line-enable", enable)
+mp.add_key_binding(nil, "status-line-disable", disable)
+mp.add_key_binding(nil, "status-line-toggle", toggle)
+
+-- TODO remove
+mp.add_key_binding(nil, "enable-status-line", function()
+    msg.warn("This binding is deprecated, use 'status-line-enable' instead")
+    enable()
+end)
+mp.add_key_binding(nil, "disable-status-line", function()
+    msg.warn("This binding is deprecated, use 'status-line-disable' instead")
+    disable()
+end)
+mp.add_key_binding(nil, "toggle-status-line", function()
+    msg.warn("This binding is deprecated, use 'status-line-toggle' instead")
+    toggle()
+end)