在没有焦点的 X 时间之后自动最小化程序?

在没有焦点的 X 时间之后自动最小化程序?

有没有办法在程序在一段规定的时间内没有获得焦点之后自动将其最小化?

答案1

它运行完美,几乎和您描述的完全一样。

1. 脚本用于在 x 时间后最小化无焦点的窗口

下面的后台脚本将在任意时间之后最小化无焦点的窗口。

剧本

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

def getwindowlist():
    # get windowlist
    try:
        return [
            l.split()[0] for l in \
            subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")\
            .splitlines()
            ]
    except subprocess.CalledProcessError:
        pass

def getactive():
    # get active window, convert to hex for compatibility with wmctrl
    wid = str(hex(int(
        subprocess.check_output(["xdotool", "getactivewindow"])\
        .decode("utf-8"))))
    return wid[:2]+str((10-len(wid))*"0")+wid[2:]

# round down on 2 seconds (match needs to be exact)
minitime = (int(sys.argv[1])/2)*2

wlist1 = []
timerlist = []

while True:
    time.sleep(2)
    wlist2 = getwindowlist()
    if wlist2:
        # clean up previous windowlist; remove non- existent windows
        try:
            timerlist = [
                wcount for wcount in timerlist if wcount[0] in wlist2
                ]
        except IndexError:
            pass
        for w in wlist2:
            # add new windows, zero record
            if not w in wlist1:
                timerlist.append([w, 0])
        # add two to account(s)
        for item in timerlist:
            item[1] += 2
        active = getactive()
        for w in timerlist:
            # minimize windows that reach the threshold
            if w[1] == minitime:
                subprocess.Popen(["xdotool", "windowminimize", w[0]])
            # set acoount of active window to zero
            w[1] = 0 if w[0] == active else w[1]
        wlist1 = wlist2

如何使用

  1. 该脚本需要wmctrlxdotool

    sudo apt-get install wmctrl xdotool
    
  2. 将脚本复制到一个空文件中,另存为minimize_timer.py

  3. 测试运行它,以所需时间(以秒为单位)(最小化之前)作为参数,例如:

    python3 /path/to/minimize_timer.py 300
    

    ...在 5 分钟未聚焦后最小化窗口

  4. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

    /bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"
    

笔记

  • 运行脚本时我没有注意到任何给处理器带来额外的负担。
  • 脚本以两秒为单位“舍入”时间。如果窗口的焦点只持续 0.5 秒,则可能不会被注意到“已获得焦点”。

解释

  • 该脚本会记录所有打开的窗口。每两秒,脚本会将两秒添加到窗口的“帐户”中,除非窗口获得焦点。
  • 如果窗口具有焦点,则其帐户设置为0
  • 如果帐户达到参数中设置的某个阈值,则窗口将最小xdotoolwindowminimize

如果窗口不再存在,它将被从记录列表中删除。


2. 应用程序特定版本

以下版本将在 x 秒后最小化任意应用程序的所有窗口。

剧本

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

# --- set the application below
app = "gedit"
# ---

minitime = (int(sys.argv[1])/2)*2

def get(cmd):
    # helper function
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

t = 0

while True:
    time.sleep(2)
    # first check if app is runing at all (saves fuel if not)
    pid = get(["pgrep", app])
    if pid:
        # if app is running, look up its windows
        windows = get(["xdotool", "search", "--all", "--pid", pid]).splitlines()
        if windows:
            # ...and see if one of its windows is focussed
            if get(["xdotool", "getactivewindow"]) in windows:
                # if so, counter is set to 0
                t = 0
            else:
                # if not, counter adds 2
                t += 2
        if t == minitime:
            # if counter equals the threshold, minimize app's windows
            for w in windows:
                subprocess.Popen(["xdotool", "windowminimize", w])
    else:
        t = 0

如何使用

  1. 该脚本需要xdotool

    sudo apt-get install xdotool
    
  2. 将脚本复制到一个空文件中,另存为minimize_timer.py

  3. 在 head 部分,将应用程序设置为最小化
  4. 测试运行它,以所需时间(以秒为单位)(最小化之前)作为参数,例如:

    python3 /path/to/minimize_timer.py 300
    

    ...在 5 分钟未聚焦后最小化窗口

  5. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

    /bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"
    

相关内容