Автоматически свернуть программу после 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
Как пользоваться
Скрипт нуждается в обоих
wmctrl
а такжеxdotool
:sudo apt-get install wmctrl xdotool
Скопируйте скрипт в пустой файл, сохраните его как
minimize_timer.py
Протестируйте его, указав в качестве аргумента требуемое время в секундах (до минимизации), например:
python3 /path/to/minimize_timer.py 300
... чтобы минимизировать окна через 5 минут без фокуса
Если все работает нормально, добавьте его в автозагрузку приложений: Dash > Startup Applications > Add. Добавьте команду:
/bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"
Заметки
- Запустив скрипт, я не заметил никакой дополнительной нагрузки на процессор.
- Скрипт "округляет" время по две секунды. Если окно фокусируется, например, только на 0,5 секунды, оно может быть не замечено как "сфокусированное".
объяснение
- Скрипт ведет учет всех открытых окон. Раз в две секунды скрипт добавляет две секунды к "учетной записи" окна, если только окно не имеет фокуса.
- Если окно имеет фокус, его учетная запись установлена в
0
- Если учетная запись достигает определенного порога, установленного в аргументе, окно сворачивается
xdotool
"swindowminimize
,
Если окно больше не существует, оно удаляется из списка записей.
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
Как пользоваться
Скрипт нужен
xdotool
:sudo apt-get install xdotool
Скопируйте скрипт в пустой файл, сохраните его как
minimize_timer.py
- В разделе заголовка установите приложение для минимизации
Протестируйте его, указав в качестве аргумента требуемое время в секундах (до минимизации), например:
python3 /path/to/minimize_timer.py 300
... чтобы минимизировать окна через 5 минут без фокуса
Если все работает нормально, добавьте его в автозагрузку приложений: Dash > Startup Applications > Add. Добавьте команду:
/bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"