![类似 wmctrl 的工具或 kde wayland 的替代品](https://linux22.com/image/15851/%E7%B1%BB%E4%BC%BC%20wmctrl%20%E7%9A%84%E5%B7%A5%E5%85%B7%E6%88%96%20kde%20wayland%20%E7%9A%84%E6%9B%BF%E4%BB%A3%E5%93%81.png)
我的工作流程的很大一部分是基于使用快捷方式。目前,我使用 xbindkeys 和 wmctrl 来运行或引发应用程序。例如:Super+F调出 Firefox,如果没有运行则运行它。
Autokey 在 KDE 上工作得很好,我也可以使用 KDE 本机自定义快捷方式管理器来替换xbindkeys
,但我找不到(我在 google 上搜索了很多)一种方法来确定窗口/应用程序是否正在运行,如果没有,则引发它。
我可能可以使用ps
或类似的命令来查找应用程序是否正在运行,如果没有,则启动它,但这涉及到最后一个问题:如何以编程方式引发(或聚焦)现有正在运行的窗口/应用程序?
GNOME似乎有某种gdbus
解决方案,但当然这在 KDE 中不起作用。
有人知道我能做什么吗?
答案1
经过大量研究,我找到了一个仅适用于 KDE 且仅适用于 KDE 的解决方案:使用 kwin 脚本。
脚本是:
- 用于
pgrep
查看程序是否正在运行(有用的命令grep
) - 如果运行:
- 安装一个即时 kwin 脚本,该脚本将使用传递的类名或标题显式“激活”窗口
- 运行脚本
- 停止脚本
- 卸载脚本
- 如果未运行:运行命令来启动它。
例如,假设我想要聚焦或启动 Firefox,我会使用我的脚本:
ww -f firefox -c firefox
-f
:窗口类名
-c
:如果未运行则运行的命令
-fa
:使用窗口标题而不是类的替代过滤器
这是脚本我现在正在使用并且效果很好。
答案2
这自动键脚本将聚焦火狐浏览器如果它正在运行或启动,如果没有运行则将其聚焦:
output = system.exec_command("wmctrl -l", getOutput=True)
if "Firefox" in output:
window.activate("Firefox",switchDesktop=True)
else:
subprocess.Popen(["firefox"])
请注意,我使用了子进程.Popen函数,因为它允许您执行其他代码和/或与进程交互子进程.通信进程运行时起作用。