Light Locker - 画面がロックまたはロック解除されたときにスクリプトを実行する

Light Locker - 画面がロックまたはロック解除されたときにスクリプトを実行する

XFCEセッションがロックされているかロック解除されている場合は、スクリプトを実行したいと思います。デスクトップがロックされているかロック解除されているときにこの動作を傍受していくつかの操作を実行する方法はありますか?

次の解決策が見つかりました。

格言の場合 -画面がロックまたはロック解除されたときにスクリプトを実行する

xscreensaverfor-ロックが解除された場合、スクリプトをどのように実行できますか?

しかし、私はそれを使用していますが、light-lockerスクリーンセーバーはありません。 DBUSを監視しようとしていますlight-lockerが、信号はエクスポートされないようです。

1つのオプションは変更することですが、xflock4これは画面ロックにのみ役立ちます。

回避策は何ですかlight-locker

答え1

確立されたブレントローマンを使用してスクリプトを実装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がログインするたびにスクリプトが自動的に起動されると、複数のインスタンスが実行されている可能性があるため、開始する前に現在のインスタンスをすべて終了する必要があります。

機能check_quodlibetの再起動クワッドリベットマウントされたUSBデバイス(マイミュージックコレクションを含む)がリセットされた場合(一時停止から再開した後にランダムに発生する)、含めるのは適切ではないと思います。

execランタイムはgdbus必ずしも必要ではありませんが、スクリプトが実行される前にそれ自体が分岐するため、追加のプロセスが作成されるのを防ぎますgdbus。これにより、スクリプト自体と2つのプロセスのみが実行されますgdbus

私が作る~/.config/autostart/quodr.desktopグデルこれはスクリプトの名前です)lightdmがログインするたびにスクリプトを起動するには、次の手順を実行します。

[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false

私自身のための注意:D-Busアクティベーションシステムユーザーサービスでスクリプトを起動する方法を見てみましょう。

この質問とそれに対するすべての答えは、私がこの解決策を見つけるのに非常に重要でした。この問題は長い間私を悩ませており、多くの解決策を試みましたが、ここで誰もが書いた内容を読んだ後に必要なものがより明確にわかりました。特にみんなに感謝します。 ブレントローマン

最後のコメントで、構築して設置しました。Dフィートそして忙しい私がこれを調べたとき、彼らは本当に役に立ちました。

私は走っているジュブント 17.10

答え2

以前の回答は、現在のセッションのロックとロック解除のセッションイベントを処理するためにこの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

答え3

dateLight-Lockerを介してロックまたはロック解除されるたびに、次のコマンドが実行されます。ところで、ロックされているのか、開いているのかはわかりません。

dbus-monitor --system "type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1/seat/seat0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" | grep --line-buffered "ActiveSession" | while read line; do date; done

引用:ランチパッドのバグ報告コメント

関連情報