如何自动提升由用户定义的快捷方式启动的应用程序

如何自动提升由用户定义的快捷方式启动的应用程序

我为建立了一个键盘快捷键Ctrl+ Alt+ 。这个功能很好用,但如果当前正在运行另一个应用程序,计算器就会在另一个应用程序后面打开。Cgnome-calculator

如何使用此快捷方式在启动时激活计算器?

答案1

运行下面的脚本将启动gnome-calculator(或任何其他应用程序,请参阅“注释”),等待其窗口出现并引发:它。

剧本

#!/usr/bin/env python3
import subprocess
import time

app = "gnome-calculator"
subprocess.Popen([app])

t = 0
while t < 20:
    try:
        # wait for the application's pid
        pid = subprocess.check_output(["pgrep", "-f", app]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass
    else:
        try:
            # read the window list
            w_data = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()
            # find the window of the found pid
            window = [w.split()[0] for w in w_data if pid in w][0]
            # raise it and terminate the script
            subprocess.Popen(["wmctrl", "-ia", window])
            break
        except IndexError:
            pass
    time.sleep(0.5)
    t = t + 1

如何使用

  1. 脚本需要wmctrl读取窗口列表并升起窗口:

    sudo apt-get install wmctrl
    
  2. 将脚本复制到一个空文件中,另存为raise_window.py
  3. 通过命令测试运行:

    python3 /path/to/raise_window.py
    
  4. 如果一切正常,请将命令添加到键盘快捷键:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令:

    python3 /path/to/raise_window.py
    

笔记

  • 为了防止无限循环(例如,如果应用程序由于某种原因未运行),脚本将等待十秒钟,然后无论如何都会终止。如果要增加时间,请更改以下行中的值:

    while t < 20
    

    20= 20*0.5秒)

  • 如上所述,您可以使用脚本来“修复”任何无法自行提升的应用程序的行为,方法是更改​​以下行:

    app = "gnome-calculator"
    

    运行另一个应用程序(app = "<application>"),或者:

    或者,将该脚本用于各种应用程序:

    替换以下行:

    app = "gnome-calculator"
    

    经过:

    app = sys.argv[1]
    

    并在脚本的头部部分(shebang 正下方)添加:

    import sys
    

    然后通过以下命令运行脚本:

    python3 raise_window.py <application>
    

解释

要打开一个窗口,可以使用以下命令:

wmctrl -ia <window_id> 

或者

wmctrl -a <window_name>

(假设wmctrl已安装)

从窗户姓名可能不是唯一的,最好使用 id。诀窍是等待应用程序的 pid 出现,使用以下命令进行测试:

pgrep -f <application>

如果该命令有输出,这意味着应用程序有一个 pid 并且正在运行。下一步是查看应用程序是否(已经)有一个窗口,使用以下命令:

wmctrl -lp

它将输出窗口列表、它们的窗口 ID 和相应(应用程序的)pid。

如果找到的 pid 与列表中的窗口匹配,则我们找到了需要启动的窗口。我们可以从列表中窗口的行中解析窗口 ID,随后我们将使用该 ID 使用以下命令启动窗口:

wmctrl -ia <window_id>

相关内容