Linux下KDE环境屏幕颜色匹配BASH脚本优化求助
优化后的KDE环境鼠标触发脚本
核心优化点
- 单次屏幕捕获:避免重复调用屏幕抓取工具,一次性提取所有目标像素颜色,大幅减少进程创建开销
- 启停状态控制:实现鼠标4键单击切换脚本启停,同时触发
Alt+5 - 焦点检测:仅当目标窗口获得焦点时才执行逻辑,避免无效运算
- 降低CPU占用:空闲时添加短延迟,减少循环频率
优化后脚本代码
#!/bin/bash # 配置项 MOUSE_ID=12 # 鼠标ID,通过xinput --list获取 TARGET_WINDOW_CLASS="your-target-window-class" # 目标窗口类名,用xprop WM_CLASS获取 # 目标像素坐标(x,y) PIXEL_POS=( "195,247" "1407,681" "1200,256" "1095,257" "1195,258" ) RUNNING=true # 脚本启停状态标记 # 监听鼠标4键点击的函数 check_mouse_button4() { local state=$(xinput --query-state "$MOUSE_ID") if echo "$state" | grep -q "button[4]=down"; then # 等待按键释放,避免重复触发 while echo "$(xinput --query-state "$MOUSE_ID")" | grep -q "button[4]=down"; do sleep 0.05 done RUNNING=!$RUNNING xdotool key --clearmodifiers alt+5 fi } # 获取目标窗口焦点状态 check_window_focus() { local focused_win=$(xdotool getwindowfocus) local target_win_class=$(xprop -id "$focused_win" WM_CLASS | awk -F '"' '{print $4}') [[ "$target_win_class" == "$TARGET_WINDOW_CLASS" ]] } while true; do # 先检查鼠标4键切换状态 check_mouse_button4 # 脚本未运行或目标窗口未聚焦时,延迟后继续循环 if ! $RUNNING || ! check_window_focus; then sleep 0.05 continue fi # 单次抓取屏幕,提取所有目标像素颜色 local colors=() # 用import直接抓取屏幕,一次性处理多个像素 convert import:- -depth 8 txt:- | while read -r line; do for pos in "${PIXEL_POS[@]}"; do x=${pos%,*} y=${pos#*,} if echo "$line" | grep -q "^$x,$y:"; then local color=$(echo "$line" | grep -om1 '#\w\+') colors+=("$color") break fi done done # 检查鼠标左键状态 local mouse_state=$(xinput --query-state "$MOUSE_ID") if echo "$mouse_state" | grep -q "button[1]=down"; then # 先按下Alt+4 xdotool key --clearmodifiers alt+4 # 依次检查像素颜色,触发对应按键 if [[ "${colors[0]}" == "#FFFFFF" ]]; then xdotool key --clearmodifiers alt+1 fi if [[ "${colors[1]}" == "#FFFFFF" ]]; then xdotool key --clearmodifiers alt+2 fi if [[ "${colors[2]}" == "#FFFFFF" ]]; then xdotool key --clearmodifiers alt+3 fi # 原脚本中的color4/5可根据需求保留或调整 # if [[ "${colors[3]}" == "#FFFFFF" ]]; then # xdotool key --clearmodifiers alt+X # fi # if [[ "${colors[4]}" == "#FFFFFF" ]]; then # xdotool key --clearmodifiers alt+Y # fi fi # 短延迟降低CPU占用 sleep 0.03 done
配置说明
- 鼠标ID:通过
xinput --list查看你的鼠标设备ID,替换MOUSE_ID - 目标窗口类名:运行
xprop WM_CLASS后点击目标窗口,获取窗口类名(第二个引号内的内容),替换TARGET_WINDOW_CLASS - 像素坐标:保留你原脚本中的目标像素位置,已整理到数组中
额外优化建议
- 如果需要更精准的鼠标事件监听,可替换
xinput为libinput工具,减少状态查询开销 - 若屏幕分辨率固定,可提前计算像素位置的偏移,避免每次循环解析坐标
- 对于高频触发的逻辑,可考虑用C语言编写核心部分再通过bash调用,进一步提升性能
内容的提问来源于stack exchange,提问作者proxyx
相关产品推荐
相关产品推荐

