jno*_*cho 8 xfce screen-lock xubuntu
如果 XFCE 会话被锁定和解锁,我想运行一个脚本。有没有办法在桌面锁定或解锁时拦截它并执行某些操作?
我找到了以下解决方案:
对于 Gnome -在屏幕锁定/解锁时运行脚本
for xscreensaver
-如何在解锁时运行脚本?
但是我正在使用light-locker
并且没有屏幕保护程序。我试图监视 DBUS,但它似乎没有light-locker
发出任何信号。
一种选择是修改,xflock4
但这只会有助于屏幕锁定。
有什么办法light-locker
吗?
基于Brent Roman的回答,我实现了一个脚本dbus-monitor
,然后用 替换了它gdbus
,它具有更清晰的界面和更清晰的输出。该脚本相当长,我将删除与 dbus 无关的任何内容,以说明在屏幕解锁时运行脚本的意义。
首先是 running 的示例输出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 [])
Run Code Online (Sandbox Code Playgroud)
所以,脚本骨架:
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 [])
Run Code Online (Sandbox Code Playgroud)
函数kill_running
检查是否有一个实例正在运行并杀死它。如果脚本在每次 lightdm 登录时自动启动,我们可能会运行多个实例,因此需要在启动之前终止所有当前实例。
如果安装的 USB 设备(带有我的音乐收藏)已重置(从挂起恢复后随机发生),则函数会check_quodlibet
重新启动quodlibet。我不认为包含它是相关的。
在exec
运行时,gdbus
是不是绝对必要的,但后来它避免了额外的过程,因为脚本将运行前叉本身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
Run Code Online (Sandbox Code Playgroud)
作为对自己的 TODO:我打算研究如何将脚本作为 systemd 用户服务启动,D-Bus 激活。
这个带有所有答案的问题对我达成这个解决方案来说是无价的。这个问题困扰了很长时间,我尝试了很多解决方案,但是在阅读了每个人在这里写的内容后,我才更清楚地了解什么是必要的。感谢大家,尤其是 Brent Roman。
作为最后的评论,我在调查这个时构建并安装了d-feet and bustle,它们真的很有用。
我正在运行Xubuntu 17.10。
小智 5
上一个答案帮助我编写了这段 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
Run Code Online (Sandbox Code Playgroud)