# slstatus **Repository Path**: tanloong/slstatus ## Basic Information - **Project Name**: slstatus - **Description**: slstatus, status bar for dwm - **Primary Language**: Unknown - **License**: ISC - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-14 - **Last Updated**: 2023-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### [slstatus](https://git.suckless.org/slstatus/file/README.html) #### 下载 使用 git 下载 slstatus 的源代码,这里我下载到家目录下的 software 目录。 ``` git clone https://git.suckless.org/slstatus ~/software/slstatus # 下载源代码 ``` #### 配置 编辑 config.h 来自定义你的状态栏,拿我的为例,以供参考。 ```c const unsigned int interval = 2000; // 每隔 2s 更新一次 static const char unknown_str[] = "n/a"; // 如果某个值不存在,就显示 n/a(默认),比如断网时 IP 地址就会显示成 n/a #define MAXLEN 2048 // 状态栏最大字符数量 MAXLEN,如果超过了它,第 MAXLEN 个字符及其右边的字符会被丢弃。 ``` ```c // 下面的注释介绍了 slstatus 的各种函数,每个函数负责显示一项信息。 /* * 函数 描述 参数 (示例) * * battery_perc 电量(百分比形式) 电池名称 (BAT0) * 在 OpenBSD/FreeBSD 上无需参数 * battery_state 电池的状态:是不是正在充电 电池名称 (BAT0) * 在 OpenBSD/FreeBSD 上无需参数 * battery_remaining 剩下的电量还能撑多久 电池名称 (BAT0) * 在 OpenBSD/FreeBSD 上无需参数 * cpu_perc CPU 的利用率(百分比形式) 无 * cpu_freq CPU 的频率(单位是 MHz) 无 * datetime 日期和时间 格式化字符串 (%F %T) * disk_free 硬盘还剩多少(单位是 GB) 硬盘的挂载点 (/) * disk_perc 硬盘已经使用了多少 (百分比形式) 硬盘的挂载点 (/) * disk_total 硬盘总量(单位是 GB) 硬盘的挂载点 (/) * disk_used 硬盘已经使用了多少(单位是 GB) 硬盘的挂载点 (/) * entropy 系统的可用熵值,该值越大系统越安全 无 * gid 当前用户的 GID 无 * hostname 主机名 无 * ipv4 IPv4 的地址 网卡名字 (eth0) * ipv6 IPv6 的地址 网卡名字 (eth0) * kernel_release 内核版本号 无 * keyboard_indicators 显示大写锁定和数字键盘是否开启 格式化字符串 (c?n?) * 参数由字母 c 和字母 n 构成,大小写都可以。c 表示大写锁定,n 表示数字键盘。 * c 和 n 后面都可以附加一个问号"?"。 * 如果加了问号 "?",只有锁定开启时才显示字母。比如开启大写锁定时显示 c,关闭时不显示。 * 如果没加问号"?",锁定开启时显示大写字母,关闭时显示小写字母。 * keymap 键盘布局 无 * load_avg 系统负载(共 3 个值,分别是 1 分钟、5 分钟和 15 分钟的平均负载)无 * netspeed_rx 下行网速 网卡名字 (wlan0) * netspeed_tx 上传网速 网卡名字 (wlan0) * num_files 指定文件夹的文件数量 该文件夹的路径 (/home/foo/Inbox/cur) * ram_free 内存还剩多少(单位是 GB) 无 * ram_perc 内存已经使用了多少(百分比形式) 无 * ram_total 内存总量(单位是 GB) 无 * ram_used 内存已经使用了多少(单位是 GB) 无 * run_command 执行一个自定义的 shell 命令 具体的 shell 命令 (echo foo) * separator 各信息之间的分隔符 无 * swap_free 交换空间还剩多少(单位是 GB) 无 * swap_perc 交换空间已经使用了多少(百分比形式)无 * swap_total 交换空间总量(单位是 GB) 无 * swap_used 交换空间已经使用了多少(单位是 GB) 无 * temp 温度(单位是摄氏度) 传感器文件的路径 (/sys/class/thermal/...) * 在 OpenBSD 上无需参数 * 在 FreeBSD 上需要热区 (thermal zone) 作参数 (tz0, tz1, etc.) * uid 当前用户的 UID 无 * uptime 系统已经开机运行了多久 无 * username 当前用户的用户名 无 * vol_perc OSS/ALSA 音量(百分比形式) mixer 文件的路径 (/dev/mixer) * 在 OpenBSD 上无需参数 * wifi_perc WiFi 信号强度(百分比形式) 网卡名字 (wlan0) * wifi_essid WiFi 的 ESSID 网卡名字 (wlan0) */ ``` ```c static const struct arg args[] = {// 选择上面的函数,在下面添加你想让状态栏显示的信息 // 函数 格式 参数 { ipv4, " %s", "wlan0" }, // %s 代表 ipv4 的值;参数需要用双引号引起来,不能是单引号, // 因为 C 语言里单引号内的是字符常量,双引号内的是字符串常量,两者不一样。 { separator, "|", NULL }, // 用 "|" 间隔两项信息;参数 NULL 表示空,就是没有参数 { battery_perc, "Battery %s%%","BAT0" }, // 在 C 语言里 "%" 需要转义,用 "%%" 来表示 { battery_state,"%s", "BAT0" }, { separator, "|", NULL }, { disk_free, "Disk %s", "/" }, { separator, "|", NULL }, { vol_perc, "Volume %s", "/dev/mixer" }, { separator, "|", NULL }, { ram_free, "Memory %s", NULL }, { separator, "|", NULL }, { cpu_perc, "CPU %s%%", NULL }, { separator, "|", NULL }, { datetime, "%s", "%m月%d日周%u %H:%M" }, }; ``` #### 安装 slstatus 的默认安装目录是 /usr/local/,如果你想安装到别的地方,可以在执行下面的安装命令之前编辑 config.mk 文件,把第 7 行左右的 PREFIX 的值改成你想要的目录。这里我选择默认的安装目录。 执行下面的命令来安装 slstatus ``` cd ~/software/slstatus # 切换到 slstatus 目录 sudo make clean install # 安装 ``` 执行完后,slstatus 可执行程序和 slstatus.1 手册都已经被保存在安装目录 (默认 /usr/local/)下。 现在你可以把配置好的显示内容打印到终端上,来查看 slstatus 的效果 ``` slstatus -1 # 只打印一次 slstatus -s # 连续打印,间隔时间是你在 config.h 里设置的时间,按 Ctrl+c 结束打印 ``` 把这些信息显示到状态栏上 ``` slstatus & ``` #### 设置进入图形界面时自动运行 slstatus 在 ~/.xinitrc 中添加 `slstatus &`,注意一定要添加到 [exec 命令的前面](https://wiki.archlinux.org/title/Xinit#xinitrc),否则 slstatus 不会被执行。 #### 修改 slstatus 配置 安装并启动 slstatus 后,如果你又修改了 config.h 里的配置,可以用下面的命令启动新的 slstatus: ```bash sudo make clean install # 重新编译 killall slstatus # 结束旧的 slstatus 进程 slstatus & ``` #### 调整音量时及时更新状态栏 状态栏每隔固定时间才会更新,但我们希望调整音量时状态栏能立刻进行一次更新,来显示新的音量。我的解决办法是用下面的三个脚本来控制音量。 你需要先安装 pamixer (调整音量) 和 xorg-xsetroot (设置状态栏的内容) `sudo pacman -S pamixer xorg-xsetroot` ~/.local/bin/vol-up ```bash #!/usr/bin/env bash # 音量增加 %5 pamixer -i 5 # 更新状态栏 status=$(slstatus -1) xsetroot -name "$status" ``` ~/.local/bin/vol-down ```bash #!/usr/bin/env bash # 音量减少 %5 pamixer -d 5 # 更新状态栏 status=$(slstatus -1) xsetroot -name "$status" ``` ~/.local/bin/vol-toggle ```bash #!/usr/bin/env bash # 静音和取消静音 pamixer -t # 更新状态栏 status=$(slstatus -1) xsetroot -name "$status" ``` 将这三个脚本绑定到快捷键上。如果你用的是 dwm,可以在 dwm 的 config.h 里进行绑定: ``` static const char *voltoggle[] = { "~/.local/bin/vol-toggle", NULL }; static const char *voldown[] = { "~/.local/bin/vol-down", NULL }; static const char *volup[] = { "~/.local/bin/vol-up", NULL }; ... static Key keys[] = { /* modifier key function argument */ { 0, XF86XK_AudioMute, spawn, {.v = voltoggle } }, { 0, XF86XK_AudioLowerVolume, spawn, {.v = voldown } }, { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } }, }; ``` 你可以执行 `xmodmap -pke | less` 来查看 XF86XK\_AudioMute、XF86XK\_AudioLowerVolume 和 XF86XK\_AudioRaiseVolume 对应的按键,在我电脑上分别是 F1、F2 和 F3。 重新编译并重启 dwm 后,按 F1、F2 和 F3 键来调整音量,就能看到状态栏的音量信息会及时更新。 #### 卸载 如果你想卸载 slstatus,执行下面的命令: `sudo make uninstall` 执行完后,安装目录 (默认 /usr/local/) 下的 slstatus 可执行程序和 slstatus.1 手册都已经被删除。 #### 排错 ##### 音量显示 n/a 你可能没有 /dev/mixer 设备,你需要执行 `sudo modprobe snd-pcm-oss`来[加载 snd-pcm-oss 模块](https://bbs.archlinux.org/viewtopic.php?id=8333)。开机[自动加载该模块](https://wiki.archlinux.org/title/Kernel_module#Automatic_module_loading_with_systemd): `echo 'snd-pcm-oss' | sudo tee /etc/modules-load.d/snd-pcm-oss.conf`