我正在寻找一种体面的、不蹩脚的方式来抑制 xscreensaver、kscreensaver 或 gnome-screensaver(无论哪一个可能正在运行),最好以与屏幕保护程序无关的方式,并且它绝对必须执行fast.
我读过xscreensaver 常见问题解答 http://www.jwz.org/xscreensaver/faq.html.
我有一个基于 gtk 的游戏程序,它在混合多个音频通道时每秒输出 30 帧,并且由于它是由操纵杆控制的,有时“the”屏幕保护程序会启动。我将“the”放在引号中,因为有至少三种不同的流行屏幕保护程序:xscreensaver、gnome-screensaver 和 kscreensaver,每种都有自己独特且笨拙的方法,应用程序可能会通过这些方法来抑制它们。
有没有人封装代码来抑制所有这些到一个fast代码块?哦,它必须兼容 GPL。
目前,如果检测到任何屏幕保护程序并且正在使用操纵杆,我的代码只是对不合作的屏幕保护程序开发人员发出可怜的抱怨,并且除了建议用户手动禁用屏幕保护程序之外,实际上并没有尝试做任何其他事情,这是我唯一可以做的事情我认为这样做是非常丑陋的,所以我干脆拒绝这样做。
只是想知道是否有其他人遇到过这种情况,他们做了什么,他们是否做了什么,是否像我看来的那样丑陋,或者是否有一些优雅的解决方案......似乎可能会以某种方式合成 X 事件来愚弄屏幕保护程序,让其认为某些活动可能以通用的方式实现这一点,但我真的不确定如何做到这一点(并希望您不需要 root 权限才能做到这一点) .)
有任何想法吗?
嗯,不幸的是,至少在 Fedora core 8 上,这似乎不起作用。
xdg-screensaver 脚本就在那里,似乎可以工作,但实际上不起作用。
一旦你执行“xdg-screensaver suspend window-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-screensaverresumewindow-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 脚本,最终只是“等待”我的进程——很酷),它似乎就是为了做我想做的事情。我知道我不可能是唯一一个或第一个面临这个问题的人。