From 530a0863b859e96d20318704284bf52962e691ec Mon Sep 17 00:00:00 2001 From: "Avi Halachmi (:avih)" Date: Sat, 11 Apr 2020 01:20:02 +0300 Subject: stats: support UP/DOWN to scroll at page 4 (perf) Keys and lines-to-scroll are configurabe, and the scroll keys are only bound on pages which support scrolling (currently only page 4) - also during oneshot (like the page-switching keys). Scroll offset is reset for all pages on any key - except scroll keys, so that entering or switching to a page resets the scroll, as well as when "re-entering" the same page or "re-activating" the stats oneshot view. TODO: print_page(..) is highly associated with extending the oneshot timer if required. The timer handling can probably move into print_page and removed from all the places which boilerplate its management. --- DOCS/man/stats.rst | 20 +++++++++++-- player/lua/stats.lua | 80 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 86 insertions(+), 14 deletions(-) diff --git a/DOCS/man/stats.rst b/DOCS/man/stats.rst index 82418f8c42..1d7e653b08 100644 --- a/DOCS/man/stats.rst +++ b/DOCS/man/stats.rst @@ -24,7 +24,14 @@ stats: 1 Show usual stats 2 Show frame timings 3 Input cache stats -4 Internal stuff +4 Internal stuff (scroll) +==== ================== + +On pages which support scroll, these key bindings are also active: + +==== ================== +UP Scroll one line up +DOWN Scroll one line down ==== ================== Font @@ -62,6 +69,15 @@ Configurable Options Key bindings for page switching while stats are displayed. +``key_scroll_up`` + Default: UP +``key_scroll_down`` + Default: DOWN +``scroll_lines`` + Default: 1 + + Scroll key bindings and number of lines to scroll on pages which support it. + ``duration`` Default: 4 @@ -183,7 +199,7 @@ The displayed information is accumulated over the redraw delay (shown as ``poll-time`` field). This adds entries for each Lua script. If there are too many scripts running, -parts of the list will simply be out of the screen. +parts of the list will simply be out of the screen, but it can be scrolled. If the underlying platform does not support pthread per thread times, the displayed times will be 0 or something random (I suspect that at time of this diff --git a/player/lua/stats.lua b/player/lua/stats.lua index 161d99848f..c10fb53249 100644 --- a/player/lua/stats.lua +++ b/player/lua/stats.lua @@ -19,6 +19,10 @@ local o = { key_page_2 = "2", key_page_3 = "3", key_page_4 = "4", + -- For pages which support scrolling + key_scroll_up = "UP", + key_scroll_down = "DOWN", + scroll_lines = 1, duration = 4, redraw_delay = 1, -- acts as duration in the toggling case @@ -89,6 +93,7 @@ local cache_recorder_timer = nil -- Current page and : mappings local curr_page = o.key_page_1 local pages = {} +local scroll_bound = false -- Save these sequences locally as we'll need them a lot local ass_start = mp.get_property_osd("osd-ass-cc/0") local ass_stop = mp.get_property_osd("osd-ass-cc/1") @@ -353,20 +358,32 @@ local function append_perfdata(s, dedicated_page) end end -local function append_general_perfdata(s) - for _, data in ipairs(mp.get_property_native("perf-info") or {}) do - append(s, data.text or data.value, {prefix=data.name..":"}) +local function append_general_perfdata(s, offset) + local perf_info = mp.get_property_native("perf-info") or {} + local count = 0 + for _, data in ipairs(perf_info) do + count = count + 1 + end + offset = max(1, min((offset or 1), count)) + + local i = 0 + for _, data in ipairs(perf_info) do + i = i + 1 + if i >= offset then + append(s, data.text or data.value, {prefix="["..tostring(i).."] "..data.name..":"}) - if o.plot_perfdata and o.use_ass and data.value then - buf = perf_buffers[data.name] - if not buf then - buf = {0, pos = 1, len = 50, max = 0} - perf_buffers[data.name] = buf + if o.plot_perfdata and o.use_ass and data.value then + buf = perf_buffers[data.name] + if not buf then + buf = {0, pos = 1, len = 50, max = 0} + perf_buffers[data.name] = buf + end + graph_add_value(buf, data.value) + s[#s+1] = generate_graph(buf, buf.pos, buf.len, buf.max, nil, 0.8, 1) end - graph_add_value(buf, data.value) - s[#s+1] = generate_graph(buf, buf.pos, buf.len, buf.max, nil, 0.8, 1) end end + return offset end local function append_display_sync(s) @@ -621,7 +638,7 @@ local function perf_stats() add_header(stats) local page = pages[o.key_page_4] append(stats, "", {prefix=o.nl .. o.nl .. page.desc .. ":", nl="", indent=""}) - append_general_perfdata(stats, true) + page.offset = append_general_perfdata(stats, page.offset) return table.concat(stats) end @@ -750,7 +767,7 @@ pages = { [o.key_page_1] = { f = default_stats, desc = "Default" }, [o.key_page_2] = { f = vo_stats, desc = "Extended Frame Timings" }, [o.key_page_3] = { f = cache_stats, desc = "Cache Statistics" }, - [o.key_page_4] = { f = perf_stats, desc = "Internal performance info" }, + [o.key_page_4] = { f = perf_stats, desc = "Internal performance info", scroll = true }, } @@ -801,11 +818,47 @@ local function clear_screen() if o.persistent_overlay then mp.set_osd_ass(0, 0, "") else mp.osd_message("", 0) end end +local function scroll_delta(d) + if display_timer.oneshot then display_timer:kill() ; display_timer:resume() end + pages[curr_page].offset = (pages[curr_page].offset or 1) + d + print_page(curr_page) +end +local function scroll_up() scroll_delta(-o.scroll_lines) end +local function scroll_down() scroll_delta(o.scroll_lines) end + +local function reset_scroll_offsets() + for _, page in pairs(pages) do + page.offset = nil + end +end +local function bind_scroll() + if not scroll_bound then + mp.add_forced_key_binding(o.key_scroll_up, o.key_scroll_up, scroll_up, {repeatable=true}) + mp.add_forced_key_binding(o.key_scroll_down, o.key_scroll_down, scroll_down, {repeatable=true}) + scroll_bound = true + end +end +local function unbind_scroll() + if scroll_bound then + mp.remove_key_binding(o.key_scroll_up) + mp.remove_key_binding(o.key_scroll_down) + scroll_bound = false + end +end +local function update_scroll_bindings(k) + if (pages[k].scroll) then + bind_scroll() + else + unbind_scroll() + end +end -- Add keybindings for every page local function add_page_bindings() local function a(k) return function() + reset_scroll_offsets() + update_scroll_bindings(k) curr_page = k print_page(k) if display_timer.oneshot then display_timer:kill() ; display_timer:resume() end @@ -814,6 +867,7 @@ local function add_page_bindings() for k, _ in pairs(pages) do mp.add_forced_key_binding(k, k, a(k), {repeatable=true}) end + update_scroll_bindings(curr_page) end @@ -822,10 +876,12 @@ local function remove_page_bindings() for k, _ in pairs(pages) do mp.remove_key_binding(k) end + unbind_scroll() end local function process_key_binding(oneshot) + reset_scroll_offsets() -- Stats are already being displayed if display_timer:is_enabled() then -- Previous and current keys were oneshot -> restart timer -- cgit v1.2.3