是否可以使用 xsetroot 和 dwm 以不同的时间间隔设置顶部和底部栏?

Mic*_*l A 4 x-server dwm

我正在使用带有双重状态补丁的dwm 。除了顶部的标准栏之外,这还会在屏幕底部添加一个状态栏。每个栏中的文本在 ~/.xinitrc 中设置(例如),如下所示:

xsetroot -name “top text;bottom text”
Run Code Online (Sandbox Code Playgroud)

bash中有没有办法以不同的间隔设置顶部文本和底部文本?例如,我有一个topbar显示系统信息的脚本,例如 uptime 命令的输出,以及一个bottombar显示天气、电池状态等信息的脚本。

目标是让顶部栏每秒更新一次,而底部栏每分钟更新一次,因为它的信息来自更昂贵的过程(例如查询我的音乐播放器,检查电池状态等)现在我的 ~/.xinitrc看起来像这样:

while true; do
    bottomdisp=$(bottombar)
    for s in {1..60}
    do
        xsetroot -name "$(topbar);$bottomdisp";
    sleep 1;
    done
done &

xbindkeys
( ( sleep 5 && /usr/bin/xscreensaver -no-splash -display :0.0 ) & )

exec rundwm
Run Code Online (Sandbox Code Playgroud)

但是,这每秒更新一次。有没有更简单的方法来做到这一点?我能想到的想法是

  1. 也许是一种告诉 xsetroot 保留底部栏中的内容的方法?作为最后的手段,我可​​能会调整dualstatus补丁中的一些代码,以允许它在xsetroot -name ';bottom text'传递类似内容时保留顶部/底部栏的当前状态,但这并不理想,因为我的 C 已生锈,我仍在使用上述内容命令有时清除条形。

  2. 使用 cronjob 更新底部栏中文本的缓存,并每分钟运行一次。尽管顶部/底部栏会每秒显示一次,但实际上只有顶部栏会每秒更改一次。

还有其他方法吗?有没有一种简单的(r)方法可以在我错过的 bash 中做到这一点?

Bri*_*fer 5

我建议让 bash 跟踪您之前的底部字符串,并且每分钟只更新一次(当此代码中当前时间模 60 的秒数等于 0 时)。

while true; do 
    (( 10#$(date +%s) % 60 )) || bottomdisp=$(date)
    xsetroot -name "$(topbar);$bottomdisp";
    sleep 1;
done  &
Run Code Online (Sandbox Code Playgroud)

这种语法可以很容易地修改次要(或有多个)间隔的频率,例如,只需将 60 更改为 15 即可每分钟更新 4 次。