Автоматически минимизируйте программу после X раз без фокуса?

Существует ли способ автоматически минимизировать программу после того, как он не сфокусировался для количества времени набора?

6
задан 15 December 2016 в 12:29

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. Для сценария нужны оба wmctrl и xdotool:

    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"
    

Примечания

  • Запуская скрипт, я не мог заметить дополнительную нагрузку для процессора.
  • Сценарий "округляет" время на двух секундах. Если окно фокусируется для, например, только 0,5 секунды, оно не могло бы быть замечено как "сфокусированный".

Объяснение

  • Сценарий ведет учет всех открытых окон. Однажды в две секунды, сценарий добавляет две секунды к "учетной записи" окон, если окно не фокусируется.
  • Если окно фокусируется, его учетная запись isa набор к 0
  • Если учетная запись достигает определенного порога, установленного в аргументе, окно минимизировано xdotool windowminimize.

Если окно больше не существует, оно удалено из рекордного списка.


2. Специализированная версия

vesrion ниже минимизирует все окна произвольного приложения после 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
ответ дан 23 November 2019 в 07:37

Другие вопросы по тегам:

Похожие вопросы: