You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用wmctrl编写bash脚本实现fvwm下xterm窗口往返切换

嘿,这个需求我太懂了!之前在fvwm下折腾窗口切换的时候也遇到过同样的问题——wmctrl -a能轻松切到目标窗口,但想切回原窗口就没那么直接了。其实核心思路就是先把当前活跃窗口的唯一ID记录下来,之后用这个ID就能精准切回去,完全不需要依赖wmctrl的“切换后执行命令”功能。

给你写一个实用的bash脚本,实现“一键切换到目标xterm,再一键切回原窗口”的效果:

#!/bin/bash

# 配置目标窗口的识别关键词(可以是窗口标题的一部分,或者类名)
TARGET_WINDOW="xterm"
# 临时文件用来存储切换前的窗口ID(重启后会自动消失)
TEMP_FILE="/tmp/prev_active_window_id"

# 判断临时文件是否存在:存在则切回原窗口,不存在则切换到目标窗口
if [ -f "$TEMP_FILE" ]; then
    # 读取之前存储的窗口ID
    prev_win_id=$(cat "$TEMP_FILE")
    # 通过ID切换回原窗口(-i参数表示使用窗口ID而非标题)
    wmctrl -i -a "$prev_win_id"
    # 删除临时文件,下次运行会再次切换到目标窗口
    rm "$TEMP_FILE"
else
    # 获取当前活跃窗口的ID(xprop直接读取系统的活跃窗口属性)
    current_win_id=$(xprop -root _NET_ACTIVE_WINDOW | awk '{print $NF}')
    # 过滤掉无效的窗口ID(比如0x0,一般不会出现)
    if [ "$current_win_id" = "0x0" ]; then
        echo "Error: 未检测到活跃窗口!"
        exit 1
    fi
    # 切换到目标窗口(wmctrl会自动跳转到对应虚拟桌面)
    wmctrl -a "$TARGET_WINDOW"
    # 将当前窗口ID写入临时文件
    echo "$current_win_id" > "$TEMP_FILE"
fi

脚本使用说明:

  • 先确保你的系统安装了wmctrlxprop(大多数Linux发行版默认都有,如果没有可以用包管理器安装,比如Debian/Ubuntu系:sudo apt install wmctrl xprop
  • 根据你的实际情况修改TARGET_WINDOW的值——如果你的xterm有特定标题,可以写完整标题;如果有多个xterm,也可以用窗口类名(可以通过wmctrl -l -x查看窗口类名)
  • 给脚本加执行权限:chmod +x switch_window.sh
  • 第一次运行脚本:会记录当前窗口ID,然后切换到目标xterm;第二次运行:切回之前的窗口,同时清空临时文件,第三次运行又会切换到目标窗口,循环往复

额外优化建议:

  • 如果想要更精准地定位目标窗口,不用标题关键词,可以直接用窗口ID:把wmctrl -a "$TARGET_WINDOW"改成wmctrl -i -a "目标窗口ID",窗口ID可以通过wmctrl -l命令查看
  • 如果你希望切换到目标窗口后自动执行某些命令(比如在xterm里跑个脚本),可以在wmctrl -a "$TARGET_WINDOW"之后加上xdotool type "你的命令"xdotool key Return(需要安装xdotool),这样切换过去后会自动输入并执行命令

内容的提问来源于stack exchange,提问作者Leo Simon

火山引擎 最新活动