Unity에서 카운트 다운하여 gnome-session-quit를 어떻게 호출합니까?


13

키보드 단축키종료 할 수 있도록 gnome-session-quit ---power-off사용자 정의 단축키를 지정할 수 있습니다 .

Unity에서는 다음과 같은 대화 상자가 나타납니다.

여기에 이미지 설명을 입력하십시오

그런 다음 시스템 전원을 끄려면 적어도 두 번의 키 입력이 필요합니다. 이것은 다소 불편하며, 누르 Return거나 기본 카운트 다운 60 초를 기다리도록하여 전원을 끌 수있을 때 이전 종료 대화 상자를 선호합니다 .

호출 할 때 gnome-session-quit --poweroffA로부터 GNOME 세션 플래시백 동일한 시스템 (14.04 LTS)에 세션 카운트 다운을 포함하여 이전 대화 상자가 다시 온다 :

여기에 이미지 설명을 입력하십시오

우리는 그것이 어딘가에 있다는 것을 알고 있습니다.

Unity 세션을 실행할 때이 오래된 대화 상자를 호출하는 방법이 있습니까?


통일 된 타이머가 숨겨진 타이머가 없으므로 60 초 후에 전원이 꺼 집니까?
Tim


둘 다 : 새로운 대화의 것은 그것이 무엇을 해야할지 사용자 선택을 기다리는 것 같습니다 ... : /
Takkat

2
@Serg 창은 세션 관리자에 속합니다 (백그라운드 스크립트를 실행하여 새 창의 속성을 파일에 작성했습니다). 문제는 창 관리자에 따라 다르게 동작한다는 것입니다.
Jacob Vlijm 2016 년

1
@JacobVlijm : 그렇습니다. 저도 볼 수 있습니다. WM을 폴링 한 다음이 규칙이나 루틴을 호출하지만이를 강제 할 방법을 찾지 못했습니다.
Takkat

답변:


10

다음은 원하는 동작을 에뮬레이트하는 스크립트입니다. 와 같이 실행해야합니다 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

업데이트 : 6 월 14 일

Takkat이 제안한대로 다음은 zenity의 --timer 옵션과 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의 취소 옵션 및 시간 초과를 종료를 허용하는 조건으로 처리함으로써 OR 연산자 ( ||)를 사용하여 사용자가 취소 버튼 ( "DOIT"으로 표시됨)을 클릭하거나 대화 상자가 시간 초과 된 경우에만 종료합니다.

사용자 경험을 향상시키기위한 또 다른 변형을 수행 할 수 있습니다 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의 ok 버튼 레이블을 변경하면 기본적으로 강조 표시된 버튼이 ok 버튼 일 수도 있고 아닐 수도 있다는 점을 고려합니다.

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파트 를 실행하도록 지시합니다.


sudo로 실행하거나 루트가 아닌 사용자가 종료되도록 할 때 매력처럼 작동합니다. 차라리 그렇게하지 않을 것입니다. 필사자 사용자가 스크립트를 실행할 수 있도록 다음 편집을 제안하겠습니다. 1. 이 답변에서 제안한 대로 전원을 끄 려면 dbus를 사용하십시오 . 2.zenity --timeout 내장 타이머를 사용하십시오 . 이를 통해 나중에 종료를 취소 / 다시 시작할 필요는 없습니다.
Takkat

@Takkat은 제안을 사용하는 다른 스크립트를 추가했습니다. 검토하십시오
Sergiy Kolodyazhnyy

실제로 루트 암호없이 종료되지만 RETURN 키를 사용하여 즉시 종료하기 위해 기본적으로 OK / DOIT 버튼이 선택되어 있지 않습니다. 우리는 비슷한 if [[ $? -eq 1 ]] ; then exit \else dbus...조건의 스크립트를 사용 합니다. 분명히 오래된 로그 아웃 도우미를 호출 할 방법이없는 것
같습니다

yad;)를 설치하는 명령을 추가하십시오.
AB

현상금을 두 가지 답변으로 나눌 수 있기를 바랍니다. 두 가지 똑같이 훌륭한 답변을 얻은 후에 여기에서 결정하기가 매우 어려웠습니다. 마침내 나는 그의 대답이 좀 더 다재다능한 것처럼 보이기 때문에 야곱에게 주었다. 그러나 스크립트는 훌륭하게 작동하며 매우 간단합니다. 대신 정답으로 표시되도록 승인 된 것으로 표시하겠습니다. 이것으로 시간이 지남에 따라 더 많은 표를 얻길 바랍니다.
Takkat

6

하지 말 그대로 당신이 물었지만, 적어도 (효과적으로) 비교 솔루션 바로 가기 키 아래에 아래의 스크립트를 넣어 것입니다 무슨.

그것이하는 일

바로 가기 키를 사용하는 경우 :

  • gnome-session-quit --power-off명령이 실행됩니다
  • 마우스가 해당 "닫기"버튼으로 이동 하여 종료 버튼이 효과적으로 선택됩니다.

    여기에 이미지 설명을 입력하십시오

그때:

  • 사용자가를 누르면 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

사용하는 방법

나는 당신이 그것을 사용하는 방법을 알고 있다고 확신하지만, 여기서 우리는 habbit 이유로 간다

  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

설명

시스템을 닫기위한 세션 관리자 창의 크기는 화면의 해상도와 상관없이 항상 중앙에 있으며 고정 된 (절대) 크기입니다. 따라서 화면 중앙을 기준으로 한 위치 는 일정한 요소입니다.

그런 다음 화면 해상도를 읽고 버튼 위치를 계산하기 만하면됩니다.

적용된 함수 ( get_qloc())는 왼쪽 화면 의 해상도를 계산합니다 . 대화 상자가 표시되기 때문입니다.

노트

라인에 설정된 시간은, time.sleep(0.4)반드시 마우스를 이동하기 위해, 상대적으로 느린 시스템 설정 윈도우가 나타납니다 아래로 종료합니다. 더 빠른 시스템에서는 더 짧을 수 있고 느린 시스템 (예 : VM)에서는 더 길게 설정해야 할 수 있습니다.


@Takkat 고정,이 버전은 모든 해상도에서 작동합니다.
Jacob Vlijm 2016 년

큰! 내 VM에서도 완벽하게 작동합니다.
Takkat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.