キーボードショートカットでシャットダウン できるようにするために、カスタムショートカットにgnome-session-quit ---power-off
を割り当てることができます。
Unityでは、これにより次のダイアログが表示されます。
次に、システムの電源を最終的にオフにするために、少なくとも2回のキーストロークが必要です。これはかなり不便です。押すだけで電源を切ることができる場合は、古いシャットダウンダイアログを使用します。 Return または、デフォルトの60秒のカウントダウンを待機させます。
同じシステム(14.04 LTS)でGNOMEセッションflashbackセッションからgnome-session-quit --poweroff
を呼び出すと、カウントダウンを含む古いダイアログが戻ります。
だから私たちはそれがどこかに住むことを知っています。
Unityセッションを実行しているときにこの古いダイアログを呼び出す方法はありますか?
目的の動作をエミュレートするスクリプトを次に示します。 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の--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のキャンセルオプションとタイムアウトをシャットダウンを許可する条件として扱うことで、ユーザーがキャンセルボタン(「DOIT」とラベル付けされている)をクリックした場合にのみOR演算子(||
)を使用してシャットダウンしますまたはダイアログがタイムアウトします。
ユーザーエクスペリエンスを向上させる別のバリエーションは、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
部分を実行するようにスクリプトに指示します
文字通りあなたが求めたものではありませんが、少なくとも(効果的に)比較可能な解決策は、以下のスクリプトをショートカットキーの下に置くことです。
ショートカットキーを使用する場合:
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
システムを閉じるためのセッションマネージャウィンドウのサイズは、画面の解像度に関係なく、常に中央揃えで固定(絶対)サイズになります。したがって、位置画面の中心に対するは一定の要因です。
次に、画面の解像度を読み取り、そこからボタンの位置を計算するだけです。
適用された関数(get_qloc()
)は、ダイアログが表示される場所であるため、左画面の解像度を計算します。
time.sleep(0.4)
行で設定された時間は、マウスが移動することを確認するために比較的遅いシステムに設定されますafterシャットダウンウィンドウが表示されます。より高速なシステムではより短く、低速なシステム(VMなど)ではより長く設定する必要があります。