使用xdotool实现将linux程序绑定到全局热键, 实现一键显示/隐藏

|本文编辑于20230211

总体流程

需要创建一个bindkey_shortcut.sh脚本, 赋予可执行权限

touch bindkey_shortcut.sh
chmod +x ./bindkey_shortcut.sh

脚本会接受一个程序名参数, 需要程序可执行文件和进程名都是这个程序名

  • 程序未启动时, 会通过程序名启动这个程序
  • 程序启动后, 会通过程序名判断前台窗口是否是目标窗口
    • 前台窗口为目标窗口时, 执行隐藏当前窗口, 保存窗口id至tmp文件夹
    • 前台窗口不为目标窗口时, 查找tmp文件夹中id, 恢复窗口(执行失败时尝试重启程序)

脚本内容

#!/bin/bash
focus=`xdotool getwindowfocus` # 获取前台窗口id
result=`xdotool getwindowname $focus|grep -i $1` # 在前台窗口名字中匹配输入的程序名
if [[ "$result" != "" ]]
then
# 如果是前台窗口 则隐藏
echo $focus > /tmp/bindkey_$1.tmp # 将本次启动窗口id保存在tmp文件夹中
xdotool windowunmap $focus # 隐藏窗口
else
# 如果不是前台窗口, 则恢复窗口或者启动程序
xdotool windowmap `cat /tmp/bindkey_$1.tmp`||$1
xdotool windowactivate `cat /tmp/bindkey_$1.tmp` 
fi

以obsidian程序为例, 在系统中将Alt+A绑定至<程序位置>/bindkey_shortcut.sh obsidian命令, 即可调用本程序

注意不要在隐藏窗口之后, 删除/tmp/bindkey_<程序名>.tmp文件
误删请通过xdotool search --name <程序名>找到窗口id, 可能有多个结果, 再通过xdotool windowmap <窗口id>恢复窗口

补充

  • 尝试过不保存窗口id或者wmctrl程序, 其实都大差不差, 这个是最高效方便的, 纰漏最少的