Не буквально то, что вы просили, но, по крайней мере, (эффективно) сопоставимое решение было бы поместить сценарий ниже под сочетанием клавиш.
Что оно делает
Когда используется сочетание клавиш:
Потом:
- Если пользователь нажимает Enter, система выключается
- Если пользователь ничего не делает, система ждет 30 секунд (или любой другой период времени, который вы хотите установить) и выключается.
- Если пользователь перемещает мышь в течение 30 секунд, процедура останавливается
Сценарий
#!/usr/bin/env python3
import subprocess
import time
#--- set the location of the close button x, y
q_loc = [1050, 525]
#--- set the time to wait before shutdown
countdown = 30
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
Как пользоваться
Я вполне уверен, что вы знаете, как его использовать, но здесь мы пойдем по причинам привычки:
Скрипт использует xdotool
sudo apt-get install xdotool
Скопируйте скрипт в пустой файл, сохраните его как run_close.py
В разделе заголовка установите расположение экрана кнопки выключения в окне закрытия (мое первое предположение было правильным):
#--- set the location of the close button x, y
q_loc = [1050, 525]
и время ожидания, прежде чем отключить без присмотра:
#--- set the time to wait before shutdown
countdown = 30
Протестируйте его командой:
python3 /path/to/run_close.py
Протестируйте его всеми опциями: нажмите Enterдля немедленного выключения, автоматического выключения и прервите процедуру движением мыши
Если все работает нормально, добавьте его к сочетанию клавиш: выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду:
python3 /path/to/run_close.py
РЕДАКТИРОВАТЬ
Ниже приведена версия скрипта, которая не требует каких-либо дополнительных настроек. Он рассчитывает координаты кнопки выхода, независимо от разрешения экрана.
Настройка почти такая же, но [3.]
ее можно пропустить.
#!/usr/bin/env python3
import subprocess
import time
#--- set the time to wait before shutdown
countdown = 30
def get_qloc():
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
scrs = [s.split("+") for s in xr if all([s.count("x") == 1, s.count("+") == 2])]
center = [int(int(s)/2) for s in [scr[0] for scr in scrs if scr[1] == "0"][0].split("x")]
return [center[0] + 250, center[1]]
q_loc = get_qloc()
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
объяснение
Размер окна диспетчера сеансов для закрытия системы всегда центрирован и имеет фиксированный (абсолютный) размер, не зависящий от разрешения экрана. Поэтому положение относительно центра экрана является постоянным фактором.
Все, что нам нужно сделать, это прочитать разрешение экрана и рассчитать положение кнопки оттуда.
Применяемая функция ( get_qloc()
) вычисляет разрешение левого экрана , поскольку именно там появится диалог.
Заметка
Время, установленное в строке time.sleep(0.4)
, устанавливается для относительно медленных систем, чтобы убедиться, что мышь перемещается после появления окна выключения. В более быстрых системах это может быть короче, в более медленных системах (например, возможно, в ВМ) может потребоваться установить более продолжительное время.