已复制
全屏展示
复制代码

xdotool 自定义切换应用窗口总结

· 2 min read

xdotool 是一个在 X Window 系统中模拟鼠标和键盘输入的命令行工具。它可以通过命令行来模拟用户的鼠标点击、键盘输入等操作,用于自动化、脚本编写和其他一些用途。

sudo apt install xdotool

我用 xdotool 的目的是想在多个应用之间快速切换,比如 现在打开了5个应用:idea、vscode、securecrt、chrome、wechat 这个5应用,此时下我可以按 alt + tab 在这些应用之间快速切换,其实在我看来这并不快,因为有可能我要按多次才能到达指定应用。

现在我的需求是这样的 只按一次就到达指定应用,比如 Alt+Q 直接跳转 chrome,解决办法在不同的系统有点不同,Windows上可以使用 Autohotkey,在mac上可以使用 Keyboard Maestro,但是在 Linux 上,没有太好的应用给你使用,你需要自己来实现。

比如在 linux mint 下切换文件管理器的脚本如下,我执行在定义 Alt+Q 快捷键来执行该脚本即可快速打开、切换到文件管理器。

$ cat /opt/pro/xdotools/nemo.sh 
#!/bin/bash
classname="Nemo"
startpath="nemo"

windowidcount=$(xdotool search --all --onlyvisible --classname "$classname" | wc -l)
if [ "$windowidcount" -eq 1 ];then
    windowid=""
else
    windowid=$(xdotool search --all --onlyvisible --classname "$classname" | awk BEGIN'{max=0} {if($1>max)max=$1} END{print max}')
fi

if [ "$windowid" == "" ];then
    nohup $startpath 1>/dev/null 2>&1 &
else
    activewindowid=$(xdotool getactivewindow)
    if [ "$windowid" == "$activewindowid" ];then
        xdotool windowminimize "$activewindowid"
    else
        xdotool windowactivate $windowid
    fi
fi

切换 Chrome 浏览器的脚本示例

$ cat /opt/pro/xdotools/google-chrome.sh 
#!/bin/bash
classname="google-chrome"
startpath="google-chrome"

windowid=$(xdotool search --all --onlyvisible --classname "$classname")
if [ "$windowid" == "" ];then
    nohup $startpath 1>/dev/null 2>&1 &
else
    activewindowid=$(xdotool getactivewindow)
    if [ "$windowid" == "$activewindowid" ];then
        xdotool windowminimize "$activewindowid"
    else
        xdotool windowactivate $windowid
    fi
fi

其实 wmctrl 也可以实现类似的功能,wmctrl是一个用于控制和管理窗口(窗口管理器)的命令行工具。它允许你通过命令行来查看和控制当前打开的窗口,切换窗口,调整窗口大小和位置,以及执行其他窗口管理操作。

# 列出所有打开的窗口
wmctrl -l

# 切换到指定的窗口
wmctrl -a "窗口标题"

# 激活指定的窗口
wmctrl -R "窗口标题"

我们也可以编写 Python 脚本来实现 ,Python 脚本如下:

import subprocess
target_class = 'google-chrome.Google-chrome'
start_command = 'google-chrome'

output = system.exec_command('wmctrl -lx', getOutput=True)
if target_class in output:
    win_class = window.get_active_class()
    if win_class == target_class:
        subprocess.Popen('xdotool windowminimize $(xdotool getactivewindow)', shell=True)
    else:
        window.activate(target_class, switchDesktop=True, matchClass=True)
else:
    subprocess.Popen(start_command, shell=True)
    
🔗

文章推荐