如何用wmutils与Shell脚本聚焦当前窗口左右上下的最近窗口
用wmutils实现聚焦当前窗口左右最近窗口
需求背景
通过wmutils与Shell脚本实现聚焦当前窗口左侧/右侧最近的窗口,核心逻辑是计算其他窗口与当前窗口的x偏移差,筛选对应方向上距离最近的窗口。
现有基础代码
先获取当前窗口ID、排除当前窗口的其他窗口列表,以及当前窗口的x偏移量:
cur=$(pfw) # 排除当前窗口,获取其他所有窗口ID other_wins=$(lsw | grep -v "$cur") curoff=$(wattr x "$cur")
遍历其他窗口,输出窗口ID和对应的x偏移量:
for win in $other_wins; do wattr ix "$win" done
输出格式示例:
0x00c00005 152 0x01000015 0 0x01800001 2 0x01a00005 67
计算每个窗口与当前窗口的x偏移差:
for win in $other_wins; do wattr ix "$win" done | awk -v curoff="$curoff" '{ dis = $2 - curoff; print $1, dis }'
输出示例(负数值为左侧窗口,正数值为右侧窗口):
0x01000015 -166 0x01600005 514 0x01800001 -164
解决方案:筛选左右最近窗口
1. 聚焦左侧最近窗口
通过awk筛选最大的负偏移差(最接近0的负数),对应左侧最近的窗口:
cur=$(pfw) curoff=$(wattr x "$cur") lsw | grep -v "$cur" | while read win; do wattr ix "$win" done | awk -v curoff="$curoff" ' { dis = $2 - curoff # 只处理左侧窗口(偏移差为负) if (dis < 0) { # 首次赋值或找到更接近0的负数时更新 if (dis > left_max || left_max == "") { left_max = dis left_win = $1 } } } END { # 如果找到左侧窗口,输出ID并聚焦 if (left_win != "") { echo "左侧最近窗口:$left_win" wtp "$left_win" # 使用wmutils的wtp命令聚焦窗口 } else { echo "无左侧窗口" } }'
2. 聚焦右侧最近窗口
通过awk筛选最小的正偏移差(最接近0的正数),对应右侧最近的窗口:
cur=$(pfw) curoff=$(wattr x "$cur") lsw | grep -v "$cur" | while read win; do wattr ix "$win" done | awk -v curoff="$curoff" ' { dis = $2 - curoff # 只处理右侧窗口(偏移差为正) if (dis > 0) { # 首次赋值或找到更接近0的正数时更新 if (dis < right_min || right_min == "") { right_min = dis right_win = $1 } } } END { # 如果找到右侧窗口,输出ID并聚焦 if (right_win != "") { echo "右侧最近窗口:$right_win" wtp "$right_win" } else { echo "无右侧窗口" } }'
3. 整合为可指定方向的脚本
将逻辑整合为单一脚本(比如命名为focus-neighbor),通过参数指定方向:
#!/bin/bash if [ $# -ne 1 ]; then echo "用法:$0 [left|right]" exit 1 fi cur=$(pfw) curoff=$(wattr x "$cur") lsw | grep -v "$cur" | while read win; do wattr ix "$win" done | awk -v dir="$1" -v curoff="$curoff" ' { dis = $2 - curoff if (dir == "left" && dis < 0) { if (dis > left_max || left_max == "") { left_max = dis target_win = $1 } } else if (dir == "right" && dis > 0) { if (dis < right_min || right_min == "") { right_min = dis target_win = $1 } } } END { if (target_win != "") { wtp "$target_win" } else { printf "无%s侧窗口\n", dir } }'
给脚本添加执行权限后,可通过./focus-neighbor left或./focus-neighbor right快速聚焦对应方向的最近窗口。
上下方向拓展逻辑
上下方向实现逻辑完全一致,只需将wattr x替换为wattr y(获取窗口顶部的y偏移量),再在awk中处理y方向的偏移差即可。
内容的提问来源于stack exchange,提问作者fr3
相关产品推荐
相关产品推荐

