当我下班时,我用 ctrl + l 锁定我的机器来锁定屏幕。当我回来时,我总是忘记登录jabber。有没有办法在屏幕解锁后运行命令?这是在 KDE 中。我不确定锁定机制是 X 功能还是 KDE 功能,所以我不知道该去哪里查找。
答案1
我希望在屏幕锁定/解锁时让 Banshee(Gnome 音乐播放器)暂停/取消暂停。我在banshee launchpad项目中找到了一张票:
https://bugs.launchpad.net/banshee/+bug/237687
有人创建了一个脚本,它会(通过 DBus)注意到屏幕是否(解锁)锁定,并触发 Banshee 暂停(解锁)。我对此脚本进行了一些小调整,并且已经使用了一段时间。我将更新后的副本添加到该票证中。
现在我知道这并不完全是你想要做的。但是您可能可以采用该 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
包含一个示例 Perl 脚本来处理各种屏幕保护程序和屏幕锁定事件,如 BLANK、LOCK、UNBLANK 等。
这是 - 使用屏幕保护程序关闭和打开声音的示例:
#!/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()