场景
kubuntu 是集成了 kde plasma 桌面环境的 ubuntu,而且 kde plasma 很适合我,但是有一个问题是
kde 自定义快捷键中不能自定义
鼠标键触发某个操作
默认只支持自定义键盘快捷键触发某个操作,例如可以定义 ctrl + shift + prt
键盘快捷键触发 flameshot gui
命令进行截图
我需要 鼠标点击中键 - 显示活动窗口
,目前在 kubuntu 上只能通过键盘按键 super + w
使用。在我的 mac 上可以直接在设置中设置鼠标快捷键,很方便。而我需要做到一致的体验,在搜索引擎中辗转多个网页,最终找到了好的方案
xbindkeys 和 xdotool
两个开源工具
xbindkeys:监听事件,例如 鼠标中键按下
,然后根据配置文件(~/.xbindkeysrc)执行相应的命令
xdotool:使用命令的方式模拟某个操作,例如键盘按下(super+w)
注:其只适用于 x11 图形平台
确认图形服务使用的 x11
使用 apt 安装
sudo apt install xbindkeys xdotool
编辑配置文件
vim .xbindkeysrc
内容为
"xdotool key --clearmodifiers super+w"
b:2
b:2
前需要有缩进,空格数不限制
--clearmodifiers
参数的作用是在执行键盘操作前清除所有可能已经按下的修饰键,可以防止意外组合
无论你当前按着什么其他键,触发的始终是干净的 Super+W 组合
逻辑很简单
xbindkeys 监听
鼠标中键
,当被按下时,执行xdotool key --clearmodifiers super+w
命令,模拟键盘按键super + w
从而显示 kubuntu 上的所有活动窗口
安装完成、配置文件编写正确后就不再需要手动管理服务了
xbindkeys 文档中提到,xbindkeys 将会在后台以守护进程的方式运行,并且当配置文件发生变化将会自动加载
实际上在系统启动时也会自动运行
bug
看上去达到预期了,但是实际上并没有 QAQ。
多数情况下,需要按下两次鼠标中键,才能触发 Super + w 的组合
按下中键时,系统需要先处理中键按下时的行为
然后再将事件传输给 xbindkeys,xbindkeys 再调用 xdotool,xdotool 触发新的按键事件
在这个过程中可能会产生竞争导致失效
另外在搜寻资料的过程中发现还有一个可能的因素:
图形显示服务器 x11 事件队列可能存在延迟和缓存
第一次点击的事件被延迟,第二次点击才真正生效5
鉴于以上原因,我找到了第二种方法:不经过 x11 图形系统,直接使用 kde 内部的快捷键系统调用 kwin 的窗口管理器,实现需求
此时将配置文件改为
"qdbus org.kde.kglobalaccel /component/kwin invokeShortcut 'Overview'"
b:2
qdbus:D-Bus 是 Linux 桌面环境中进程间通信的标准协议,qdbus 是 Qt 提供的命令行工具,用于与 D-Bus 服务交互
org.kde.kglobalaccel:这是 KDE 的全局快捷键服务,负责管理系统级别的快捷键绑定和处理,所有 KDE 应用的快捷键都通过这个服务统一管理
/component/kwin:指向 KWin 窗口管理器组件
invokeShortcut:方法名称,用于触发快捷键
‘Overview’:方法参数,对应的就是 kde 的窗口概览功能
新的配置文件去除了 xdotool 组件,鼠标中键被 xbindkeys 捕捉到后直接调用 kwin 窗口管理区触发函数
此种方式就没有任何问题
评论区