我正在寻找一种体面的、非蹩脚的方式来抑制 xscreensaver、kscreensaver 或 gnome-screensaver,无论哪个可能正在运行,最好以与屏幕保护程序无关的方式,并且它绝对必须快速执行。
我已阅读xscreensaver 常见问题解答。
我有一个基于 gtk 的游戏程序,它在混合多个音频通道时以 30 帧/秒的速度运行,并且由于它是由操纵杆控制的,因此有时会启动“the”屏幕保护程序。我将“the”放在引号中,因为有至少三个不同的流行屏幕保护程序,xscreensaver、gnome-screensaver 和 kscreensaver,每个都有自己独特而笨重的方法,应用程序可能会通过这些方法来抑制它们。
有没有人将代码封装成一个快速的代码块来禁止所有这些?哦,它必须与 GPL 兼容。
目前,如果检测到任何屏幕保护程序并且操纵杆正在使用中,我的代码只是对不合作的屏幕保护程序开发人员发出悲哀的抱怨,并且实际上除了建议用户手动禁用屏幕保护程序之外并没有尝试做任何事情,这是我唯一能做的事情想去做是非常丑陋的,我干脆拒绝去做。
只是想知道是否有其他人遇到过这个问题,他们做了什么,如果他们做了什么,它是否像我认为的那样丑陋,或者是否有一些优雅的解决方案......似乎可能以某种方式合成 X 事件以欺骗屏幕保护程序,使其认为有一些活动可能会以一种通用的方式来解决问题,但我真的不知道该怎么做(并且希望你不需要 root 来做到这一点.)
有任何想法吗?
嗯,不幸的是,至少在 Fedora core 8 上,这似乎不起作用。
xdg-screensaver 脚本在那里,并且似乎打算工作,但实际上并没有工作。
一旦你执行“xdg-screensaver 暂停窗口 ID”,窗口 ID 是从程序中通过
xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);
或者无论是通过xprop获取窗口id,还是手动运行xdg-screensaver,都会创建两个进程:
[scameron@zuul wordwarvi]$ ps -efa | grep xdg
scameron 4218 1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron 4223 1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron 4313 3151 0 20:15 pts/1 00:00:00 grep xdg
[scameron@zuul wordwarvi]$
他们永远不会死,即使他们应该等待的程序死了,屏幕保护程序也永远不会重新启用。
[scameron@zuul wordwarvi]$ xdg-screensaver status
disabled
[scameron@zuul wordwarvi]$ ls -ltr /tmp | grep xdg
-rw------- 1 scameron scameron 15 2009-01-20 20:12 xdg-screensaver-scameron--0.0
[scameron@zuul wordwarvi]$
运行 xdg-screensaver resume window-id 不会恢复屏幕保护程序。
要重新启用屏幕保护程序,我必须手动杀死它们,并手动删除它留在 /tmp 中的文件:
[scameron@zuul wordwarvi]$ kill 4218 4223
[scameron@zuul wordwarvi]$ rm /tmp/xdg-screensaver-scameron--0.0
[scameron@zuul wordwarvi]$ xdg-screensaver status
enabled
[scameron@zuul wordwarvi]$
所以,好意,但似乎并没有真正奏效。
不,当然不希望每帧都运行它,但不希望它在运行时引起打嗝,仅此而已。考虑到合成 X 事件,我想象它经常足以让屏幕保护程序认为有活动。
看着 xdg-screensaver (这似乎是一个 shell 脚本,最终只是为我的进程做一个“等待”——很酷),它似乎是为了做我想做的事。我知道我不可能是唯一或第一个面临这个问题的人。