Light Locker - 在螢幕鎖定/解鎖時執行腳本
如果 XFCE 會話被鎖定和解鎖,我想執行一個腳本。有沒有辦法在桌面被鎖定或解鎖時攔截它並執行某些操作?
我找到了以下解決方案:
對於 Gnome -在螢幕鎖定/解鎖時執行腳本
for
xscreensaver
-如何在解鎖時執行腳本?但我正在使用
light-locker
並且沒有螢幕保護程序。我試圖監控 DBUS,但它似乎沒有light-locker
發出任何信號。一種選擇是修改
xflock4
,但這僅有助於螢幕鎖定。有什麼辦法
light-locker
嗎?
上一個答案幫助我編寫了這個處理目前會話的鎖定和解鎖會話事件的 bash 腳本片段。我用它在會話被鎖定時暫停瀏覽器程序,並在它解鎖時恢復它們。在Debian不穩定(Xfce 4.12)下測試享受!
session=/org/freedesktop/login1/session/$XDG_SESSION_ID iface=org.freedesktop.login1.Session dbus-monitor --system "type=signal,path=$session,interface=$iface" 2>/dev/null | while read signal stamp sender arrow dest rest; do case "$rest" in *Lock) echo LOCKED at $stamp pause $@ ;; *Unlock) echo UNLOCKED at $stamp resume $@ ;; #unknown Session signal received *) # echo $signal $stamp $sender $arrow $dest $rest esac done
基於Brent Roman的回答,我使用 實現了一個腳本
dbus-monitor
,然後將其替換為gdbus
,它具有更清晰的界面和更清晰的輸出。該腳本相當長,我將刪除任何與 dbus 無關的內容,以說明在螢幕解鎖上執行腳本的意義。首先是執行的範例輸出
gdbus
,鎖定螢幕然後解鎖它:paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2 Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1 The name org.freedesktop.login1 is owned by :1.6 /org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <false>}, @as []) /org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock () /org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock () /org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <true>}, @as [])
所以,腳本骨架:
OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID BUS_NAME=org.freedesktop.login1 UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()" GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH" PROGNAME=$(basename "$0") LOGFILE=~/log/$PROGNAME.log # ... function log { echo "$(date +'%F %T.%3N') [$$]" "$@" } # ... function run_daemon { exec &>>"$LOGFILE" kill_running "$GDBUS_MONITOR" local signal while read -r signal; do log "$signal" if [[ $signal == "$UNLOCK" ]]; then check_quodlibet fi done < <(eval "exec $GDBUS_MONITOR") } # ... run_daemon
函式
kill_running
檢查是否有一個實例正在執行並殺死它。如果腳本在每次 lightdm 登錄時自動啟動,我們可能會執行多個實例,因此需要在啟動之前終止所有目前實例。如果已安裝的 USB 設備(帶有我的音樂收藏)已重置(從掛起恢復後隨機發生),函式將
check_quodlibet
重新啟動quodlibet 。我不認為包含它是相關的。
exec
when runninggdbus
不是絕對必要的,但它避免了額外的程序,因為腳本會在執行之前 fork自己gdbus
。這樣,將只有 2 個程序在執行:腳本本身和gdbus
.我創建了*~/.config/autostart/quodr.desktop*(quodr是腳本的名稱),以便在每次 lightdm 登錄時啟動腳本:
[Desktop Entry] Version=1.0 Type=Application Name=quodr Exec=quodr Comment=Check if quodlibet needs refresh Icon=dialog-question-symbolic Hidden=false
作為我自己的 TODO:我打算研究如何將腳本作為 systemd 使用者服務啟動,D-Bus 啟動。
這個帶有所有答案的問題對於我達成這個解決方案來說是無價的。這個問題困擾了很長時間,我嘗試了很多解決方案,但是在閱讀了每個人在這裡寫的內容後,我才更清楚地了解了什麼是必要的。感謝所有人,特別是 Brent Roman。
作為最後的評論,我在調查此問題時建構並安裝了d-feet and bustle,它們非常有用。
我正在執行Xubuntu 17.10。