Sway环境状态栏优化

sway配置 中完成对桌面空间极致利用之后,按照Gemini建议,定制一个针对 FreeBSD Sway桌面 优化的状态栏:

  • 脚本直接利用FreeBSD的系统工具( sysctldate )来获取信息,无需第三方工具,响应最快

  • 考虑到我使用的 ThinkPad X220笔记本 硬件很弱,直接通过 sysctl 获取内核信息能够降低负载,并适当延长采样周期(5秒)

状态脚本

~/.config/sway/status.sh
#!/bin/sh

# 1. CPU 状态:频率/温度/负载 (C:频率@温度/负载)
get_cpu() {
    # 获取当前频率 (MHz)
    freq=$(sysctl -n dev.cpu.0.freq)
    temp=$(sysctl -n dev.cpu.0.temperature | cut -d'.' -f1)
    load=$(uptime | awk -F'load averages:' '{ print $2 }' | cut -d',' -f1 | tr -d ' ')
    echo "C:${freq}@${temp}°C/${load}"
}

# 2. 内存占用 (M:百分比)
get_mem() {
    pagesize=$(sysctl -n hw.pagesize)
    total_pages=$(sysctl -n vm.stats.vm.v_page_count)
    free_pages=$(sysctl -n vm.stats.vm.v_free_count)
    used_percent=$(( (total_pages - free_pages) * 100 / total_pages ))
    echo "M:${used_percent}%"
}

# 3. 硬件信息:风扇转速/WiFi强度 (H:转速/WiFi)
get_hw() {
    # 需加载 acpi_ibm
    fan=$(sysctl -n dev.acpi_ibm.0.fan_speed 2>/dev/null || echo "0")
    wifi=$(ifconfig wlan0 list sta | tail -1 | awk '{print $5}' 2>/dev/null || echo "0")
    echo "F:${fan}|W:${wifi}%"
}

# 4. 电池 (含状态图标)
get_battery() {
    cap=$(sysctl -n hw.acpi.battery.life)
    state=$(sysctl -n hw.acpi.battery.state)
    [ "$state" -eq 2 ] && echo "⚡$cap%" && return
    echo "🔋$cap%"
}

while true; do
    echo "$(get_cpu) | $(get_mem) | $(get_hw) | $(get_battery) | $(date +'%H:%M')"
    sleep 5
done

脚本运行环境要求

  • 状态脚本通过 sysctl 获取内核信息,需要内核支持ACPI:

    • acpi_ibm ThinkPad专用支持

    • acpi_dock 处理ThinkPad底座热插拔

    • acpi_video 调节屏幕亮度

    • coretemp 虽然不是 ACPI 模块,但它提供 sysctl 读取 CPU 每个核心的精确温度

为确保系统启动时加载上述内核模块,需要配置 /boot/loader.conf :

配置系统启动时加载ACPI相关模块
acpi_ibm_load="YES"
acpi_video_load="YES"
acpi_dock_load="YES"
coretemp_load="YES"

另外,为确保CPU能够动态调节频率(对 ThinkPad X220笔记本 续航至关重要),需要确保 /etc/rc.conf 中开启了 powerd 电源管理:

确保 /etc/rc.conf 启用了 powerd
powerd_enable="YES"

亮度调节

sway默认的 config 配置是设置使用 brightnessctl 调节屏幕亮度,这要求系统安装 light 软件包。如果没有安装该软件包,也可以改成以下方式直接使用 sysctl 调节:

设置通过sysctl直接调整亮度
    # Special keys to adjust brightness via brightnessctl
    bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
    bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+

备注

我的实践发现调整 ThinkPad X220笔记本 的亮度键, hw.acpi.video.lcd0.brightness 值确实变化,但是实际屏幕亮度却没有改变。暂时不知道怎么解决,以后再说

我也没有找到如何安装 brightnessctl 方法