aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authoruser <user@clank>2026-09-22 15:12:02 +0200
committeruser <user@clank>2026-09-22 15:12:02 +0200
commit720aa48e249c0c962e8f73372ceded6092414a6e (patch)
treedb713dc86f1333dab0f509e633077384005562c3 /config
parentsidebar: air inside it, the way panes have padding (tab_bar_padding) (diff)
downloadslosh-720aa48e249c0c962e8f73372ceded6092414a6e.tar.gz
slosh-720aa48e249c0c962e8f73372ceded6092414a6e.tar.xz
slosh-720aa48e249c0c962e8f73372ceded6092414a6e.zip
osc 5577: `busy`, and a sidebar that shows it (busy_mark)
A status is a line of text, and a line of text cannot say whether it is still true. "building 3/7" reads exactly the same while it builds and ten minutes after it stopped, which is the one thing somebody reading it from another tab wants to know -- and the only workaround available to a program was to write the answer into the words and keep rewriting them. So `busy`: printf '\033]5577;1;status;make test\033\\' printf '\033]5577;1;busy;1\033\\' ... printf '\033]5577;1;busy;0\033\\' A flag of its own rather than a field of `status`, because a status is the *whole* payload after the verb -- `status;a;b;c` has always been the text "a;b;c" -- so anything added to that line would change what every existing sender means, including the five pi extensions D1 promises byte compatibility to. Orthogonal, so a program can leave one line up and toggle the other; anything but 0/false/no/off is on; `clear` takes both; and a pane whose program has gone is never busy, whatever it last claimed, because a spinner turning under a dead tab is a lie you keep looking at. In a sidebar the row turns `tab_status_busy` -- the theme's accent, derived like the other status colours, so no theme needs a line -- and takes a spinner in the column `tab_bar_padding` was already holding blank, so nothing reflows when a program starts or stops working. `busy_mark` is the frames, separated by spaces: one frame is a static mark and costs nothing, several make it turn, and only then does the session keep a frame clock -- via the same `animating` flag an animated shader uses, so the cost lands only while such a row is actually composed, and `""` drops the mark entirely and leaves the colour to say it. The frame is a pure function of the clock, like every other pulse here, so two clients attached to one session show the same one. `panes` now reports `status` and `busy`, which is the scriptable half of the same fact: what a pane says about itself, without reading its screen.
Diffstat (limited to 'config')
-rw-r--r--config/config.kdl15
1 files changed, 15 insertions, 0 deletions
diff --git a/config/config.kdl b/config/config.kdl
index 2ee0fb9..aac3292 100644
--- a/config/config.kdl
+++ b/config/config.kdl
@@ -280,6 +280,21 @@ bell_indicator true
// this file has no \u escape, so put the character itself here).
bell_mark "[!]"
+// A pane can also say that what its status describes is still *happening*
+// (`busy` over OSC 5577, see the scripting chapter). In a sidebar that status
+// then turns the theme's `tab_status_busy` colour and carries this spinner,
+// which is how "running" and "finished" tell themselves apart from another tab
+// without reading the words.
+//
+// The frames are separated by spaces. One frame is a static mark and costs
+// nothing; several make it turn, and only then does the session keep a frame
+// clock -- and only while such a row is actually on screen. "" draws no mark
+// at all and leaves the colour to say it. The mark sits in the column
+// `tab_bar_padding` was holding blank, so nothing moves when a program starts
+// or stops working; give it a gutter of its own with `tab_bar_padding 0 2`.
+busy_mark "⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏"
+busy_ms 120
+
// The one-row bar with tabs, the new-tab button and the pane count.
status_bar true