Как я называю выход сессии гнома с обратным отсчетом от Единицы?

Чтобы смочь завершить работу с сочетанием клавиш, мы можем присвоиться gnome-session-quit ---power-off к пользовательскому ярлыку.

В Единице это приведет к следующему диалоговому окну:

enter image description here

Затем нам нужны еще по крайней мере два нажатий клавиш для окончательного выключения нашей системы. Это довольно неудобно, и я предпочел бы старое диалоговое окно завершения работы, когда Вы могли выключение питания просто нажатие Return или позволяя ему ожидать обратный отсчет по умолчанию 60 секунд.

При вызове gnome-session-quit --poweroff от сессии ретроспективного кадра сессии GNOME в той же системе (14.04 LTS) возвращается старое диалоговое окно включая обратный отсчет:

enter image description here

Таким образом, мы знаем, что это живет где-нибудь.

Там какой-либо путь состоит в том, чтобы назвать это старое диалоговое окно при выполнении сессии Единицы?

13
задан 13 April 2017 в 05:24

2 ответа

Вот сценарий для эмуляции желаемого поведения. Должен быть работал как с 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

Обновление: 14 июня

Как предложено 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 часть

10
ответ дан 23 November 2019 в 03:20

Не буквально то, что Вы попросили, но по крайней мере (эффективно) сопоставимое решение, должно будет поместить сценарий ниже под сочетанием клавиш.

Что это делает

Когда сочетание клавиш используется:

  • gnome-session-quit --power-off команда выполняется
  • мышь перемещена в соответствующую "близкую" кнопку, эффективно делая кнопку отключения пред - выбранной:

    enter image description here

Затем:

  • Если пользователь нажимает 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

Как использовать

Я вполне уверен, Вы знаете, как использовать его, но здесь мы идем по причинам привычки:

  1. Использование сценария xdotool

    sudo apt-get install xdotool
    
  2. Скопируйте сценарий в пустой файл, сохраните его как run_close.py

  3. В главном разделе, устанавливает местоположение экрана кнопки отключения в завершении - окно (мое первое предположение было правильным):

    #--- set the location of the close button x, y
    q_loc = [1050, 525]
    

    и время для ожидания перед необслуживаемым закрытием:

    #--- set the time to wait before shutdown
    countdown = 30
    
  4. Тестовый прогон это командой:

    python3 /path/to/run_close.py
    

    Протестируйте его со всей опцией: нажатие Enter для непосредственного завершения работы, необслуживаемого завершения работы и повреждения процедура мышью - перемещение

  5. Если все хорошо работает, добавьте его к сочетанию клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

     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) можно было бы быть необходимо установить на дольше.

6
ответ дан 23 November 2019 в 03:20

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

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