X画面ロック解除後のコマンド実行(KDE)

X画面ロック解除後のコマンド実行(KDE)

退勤時に画面をロックするには、Ctrl + Lでコンピュータをロックします。戻ると、常にJabberにログインすることを忘れます。画面ロックが解除された後にコマンドを実行する方法はありますか?これはKDEにあります。ロックメカニズムがX機能なのかKDE機能なのかわからないので、どこを見るべきかわかりません。

答え1

画面がロックまたはロック解除されたときにBanshee(Gnome Music Player)が一時停止/一時停止解除されるようにしたいと思います。 Banshee Launchpadプロジェクトでチケットを見つけました。

https://bugs.launchpad.net/banshee/+bug/237687

誰かが画面がロックされている(オフになっている場合)、それを通知し、Bansheeの一時停止(ロック解除)をトリガーするスクリプトを(DBus経由で)作成しました。私はこのスクリプトを少し調整してしばらく使ってきました。更新されたコピーをチケットに追加します。

今、私はこれがまさにあなたが望むものではないことを知っています。ただし、すでに画面のロック/ロック解除を検出しているPythonスクリプトをインポートして、必要な操作を行うように少し変更することもできます。私が知っているのは、KDEスクリーンセーバーはgnomeスクリーンセーバーと同じDBusインターフェースをサポートしています。 KDEに関する最高のドキュメントは次のとおりです。

http://quickgit.kde.org/?p=kde-workspace.git&a=blob&f=krunner/screensaver/saverengine.h

頑張ってください!

答え2

XScreenSaverのソリューションは次のとおりです。xscreensaver-command -watch

man xscreensaver-commandさまざまなスクリーンセーバーと、BLANK、LOCK、UNBLANKなどの画面ロックイベントを処理するサンプルPerlスクリプトが含まれています。

以下は、スクリーンセーバーを使用して音をオフにしてオンにする例です。

       #!/usr/bin/perl

       my $blanked = 0;
       open (IN, "xscreensaver-command -watch |");
       while (<IN>) {
           if (m/^(BLANK|LOCK)/) {
               if (!$blanked) {
                   system "sound-off";
                   $blanked = 1;
               }
           } elsif (m/^UNBLANK/) {
               system "sound-on";
               $blanked = 0;
           }
       }

しかし、KDEがXScreenSaverを使用しているかどうかはわかりません。

答え3

mark-dragoの答えを改善するためにスクリプトを更新しました。

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import os

def screensaver_changed(state):
  """This method is called when the screensaver starts/stops """
  screensaver = session_bus.get_object('org.freedesktop.ScreenSaver', '/ScreenSaver')
  active = screensaver.GetActive()
  print("ScreenSaver is " + ("on" if active else "off"))
  if not active:
    os.system("xkbcomp ~/.Xkeymap :0")

DBusGMainLoop(set_as_default=True)

session_bus = dbus.SessionBus()
session_bus.add_signal_receiver(screensaver_changed,'ActiveChanged','org.freedesktop.ScreenSaver')


from gi.repository import GLib

loop = GLib.MainLoop()
loop.run()

関連情報