AwesomeWM:统计系统托盘图标数量并隐藏空托盘
解决空系统托盘占用空间的问题
要实现空托盘时自动隐藏,核心是实时监控托盘内图标数量,根据数量切换托盘可见性,以下是具体实现方案:
1. 统计托盘图标数量
系统托盘遵循Freedesktop规范,可通过X11工具查询图标数量:
- 用
xprop获取托盘窗口的_NET_CLIENT_LIST属性,该属性包含所有嵌入托盘的图标窗口ID,统计ID数量就是图标数:# 先通过wmctrl找到托盘窗口ID(替换为你的托盘窗口名称,比如Polybar-tray) TRAY_WINDOW_ID=$(wmctrl -l | grep "Polybar-tray" | awk '{print $1}') # 统计图标数量 TRAY_ICON_COUNT=$(xprop -id $TRAY_WINDOW_ID _NET_CLIENT_LIST | wc -w) - 部分桌面环境也可以通过专属工具查询,但基于X11属性的查询是通用可靠方案。
2. 自动切换托盘可见性
以i3+Polybar为例,写个监控脚本自动调整托盘模块的可见性:
#!/bin/bash CONFIG_PATH=~/.config/polybar/config.ini TRAY_WINDOW_NAME="Polybar-tray" while true; do TRAY_WINDOW_ID=$(wmctrl -l | grep "$TRAY_WINDOW_NAME" | awk '{print $1}') if [ -z "$TRAY_WINDOW_ID" ]; then sleep 2 continue fi TRAY_ICON_COUNT=$(xprop -id $TRAY_WINDOW_ID _NET_CLIENT_LIST | wc -w) if [ $TRAY_ICON_COUNT -eq 0 ]; then sed -i 's/^visibility = true/visibility = false/' $CONFIG_PATH else sed -i 's/^visibility = false/visibility = true/' $CONFIG_PATH fi # 刷新Polybar使配置生效 polybar-msg cmd restart sleep 2 done
将脚本保存为tray-monitor.sh,添加可执行权限后,加入i3启动项(在~/.config/i3/config中加exec --no-startup-id ~/tray-monitor.sh)。
如果你用的是Python的pystray库,直接通过API操作更简单:
import pystray import time from threading import Thread from PIL import Image def monitor_tray(tray): while True: # 直接获取托盘内图标数量 if len(tray.icon_list) == 0: tray.visible = False else: tray.visible = True time.sleep(1) # 初始化托盘示例(替换为你的实际初始化逻辑) icon = Image.open("icon.png") tray = pystray.Icon("test", icon) # 启动监控线程 Thread(target=monitor_tray, args=(tray,), daemon=True).start() # 运行托盘 tray.run()
关键提示
- 不同托盘工具的窗口名称/属性可能不同,需要根据自己的环境调整
wmctrl的过滤条件。 - 监控间隔设为1-3秒即可,避免过度占用系统资源。
内容的提问来源于stack exchange,提问作者Mario Davó
相关产品推荐
相关产品推荐

