Xfce

Light Locker - 在螢幕鎖定/解鎖時執行腳本

  • April 23, 2018

如果 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 。我不認為包含它是相關的。

execwhen 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

引用自:https://unix.stackexchange.com/questions/203339