Чтобы смочь завершить работу с сочетанием клавиш, мы можем присвоиться gnome-session-quit ---power-off
к пользовательскому ярлыку.
В Единице это приведет к следующему диалоговому окну:
Затем нам нужны еще по крайней мере два нажатий клавиш для окончательного выключения нашей системы. Это довольно неудобно, и я предпочел бы старое диалоговое окно завершения работы, когда Вы могли выключение питания просто нажатие Return или позволяя ему ожидать обратный отсчет по умолчанию 60 секунд.
При вызове gnome-session-quit --poweroff
от сессии ретроспективного кадра сессии GNOME в той же системе (14.04 LTS) возвращается старое диалоговое окно включая обратный отсчет:
Таким образом, мы знаем, что это живет где-нибудь.
Там какой-либо путь состоит в том, чтобы назвать это старое диалоговое окно при выполнении сессии Единицы?
Вот сценарий для эмуляции желаемого поведения. Должен быть работал как с sudo
. Может быть связан с сочетанием клавиш (с предварительным добавлением shutdown
управляйте в sudoers файл для разрешения выполнения без пароля). Упрощенный, краткий, и делает задание.
#!/bin/bash
# Date: June 11,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# Tell ubuntu to shutdown in 1 min
shutdown -P +1 &
# Show the dialog
zenity --question --text="Shutdown now ? Automatic shutdown in 60 seconds" --ok-label="DOIT"
# If user clicks DOIT, then cancel the old
# shutdown call that has countdown,
# (because only one shutdown command can be run at a time), and
# tell ubuntu to shutdown immediately
# otherwise - cancel it
if [ $? -eq 0 ];then
shutdown -c
shutdown -P now
else
shutdown -c
fi
Как предложено Takkat, вот сценарий, который использует zenity's - опция таймера и dbus для достижения того же поведения без потребности в sudo доступе:
#!/bin/bash
# Date: June 14,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# version #2
zenity --question --text="Shutdown now ? Autoshutdown in 60 seconds" \
--cancel-label="DOIT" --ok-label="NOPE" --timeout=60 ||
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
Основная идея здесь состоит в том, что опция тайм-аута zenity выходит с кодом, больше, чем 0, который обычно означает отказавшую команду. Таким образом путем обработки опции отмены zenity и тайм-аута как условие, которое позволит завершение работы, мы используем операцию ИЛИ (||
) завершать работу, только если пользователь нажимает кнопку отмены (маркированный как "МЕЛКАЯ МОНЕТА") или диалоговое окно, испытывает таймаут.
Другое изменение для улучшения пользовательского опыта может быть, покончили yad
(потребности, которые будут установлены сначала с этими командами sudo apt-add-repository ppa:webupd8team/y-ppa-manager;sudo apt-get update; sudo apg-get install yad
). Это изменение использует индикатор выполнения для уведомления пользователя, сколько времени оставляют
#!/bin/bash
yad --auto-close --sticky --on-top --skip-taskbar --center \
--text 'Shutdown now ? Autoshutdown in 60 seconds.' \
--button="gtk-ok:1" --button="gtk-close:0" --image=dialog-question \
--title 'Shutdown' --timeout=60 --timeout-indicator=top ||
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
Другая возможная версия, принимает во внимание, что при изменении маркировки кнопки ОК zenity кнопка, выделенная по умолчанию, может или не может быть кнопкой ОК.
zenity --question --timeout 10 --text="Automatic shutdown in 10 seconds"
if [[ $? -eq 1 ]] ; then
# user clicked Cancel
exit
else
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
fi
Сценарий закрывает систему по любому возврату, который не является 0. Если сценарий испытывает таймаут, возвращаемое значение или 1 или 5 говорит сценарию выполняться else
часть
Не буквально то, что Вы попросили, но по крайней мере (эффективно) сопоставимое решение, должно будет поместить сценарий ниже под сочетанием клавиш.
Когда сочетание клавиш используется:
gnome-session-quit --power-off
команда выполняетсямышь перемещена в соответствующую "близкую" кнопку, эффективно делая кнопку отключения пред - выбранной:
Затем:
#!/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
Размер окна Session Manager для закрытия системы всегда центрируется и фиксированного (абсолютного) размера, независимого к разрешению экрана. Поэтому положение относительно центра экрана является постоянным множителем.
Все, что мы должны сделать затем, должно считать разрешение экрана и вычислить положение кнопки оттуда.
Прикладная функция ( get_qloc()
) вычисляет разрешение левого экрана, так как это - то, где диалог появится.
Время, установленное в строке time.sleep(0.4)
установлен для относительно медленных систем, удостовериться, что мышь перемещена после того, как окно закрытия появляется. В более быстрых системах это может быть короче, в более медленных системах (как возможно VM) можно было бы быть необходимо установить на дольше.