web-dev-qa-db-ja.com

フォーカスなしでX時間後にプログラムを自動的に最小化しますか?

プログラムが一定時間フォーカスされていない場合、プログラムを自動的に最小化する方法はありますか?

6
L42

あなたが説明した通り、完璧に機能します。

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. すべてが正常に動作する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加。コマンドを追加します。

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

ノート

  • スクリプトを実行していると、anyプロセッサに追加の負荷がかかることに気付きませんでした。
  • スクリプトは、2秒の時間を「ラウンド」します。ウィンドウにフォーカスがある場合わずか0.5秒で、「焦点が合っている」ことに気付かない場合があります。

説明

  • スクリプトは、開いているすべてのウィンドウの記録を保持します。 2秒に1回、スクリプトはウィンドウの「アカウント」に2秒を追加します。nlessウィンドウにフォーカスがあります。
  • ウィンドウにフォーカスがある場合、そのアカウントは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. ヘッドセクションで、アプリケーションを最小化するように設定します
  4. テストとして、必要な時間を秒単位(最小化する前)で引数としてテスト実行します。例:

    python3 /path/to/minimize_timer.py 300
    

    ...フォーカスなしで5分後にウィンドウを最小化する

  5. すべてが正常に動作する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加。コマンドを追加します。

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