我正在寻找一种体面的,不跛脚的方式来禁止xscreensaver,kscreensaver或gnome-screensaver,哪些可能正在运行,最好是以屏幕保护程序的方式,而且它绝对肯定必须执行得很快.
我有一个基于gtk的游戏程序,在混合多个声道的同时混合30帧/秒,由于它是由操纵杆控制的,有时候“屏幕保护程序”将会启动.我将“the”引入引号,因为有最少三个不同的流行屏幕保护程序,xscreensaver,gnome-screensaver和kscreensaver,每个都有自己独特和klunky的方法,应用程序可能会阻止它们.
有没有人封装代码来禁止所有这些进入快速的代码块?哦,它必须是GPL兼容的.
目前,我的代码只是悄悄地关于不操作的屏幕保护程序开发者,如果检测到任何屏幕保护程序,并且操纵杆正在使用,并且实际上并没有尝试除了建议用户手动禁用屏幕保护程序之外的任何其他操作,作为唯一的其他事情想想做的是如此难以置信的丑陋,我只是拒绝这样做.
只是想知道其他人是否遇到这种情况,他们做了什么,如果他们做了任何事情,如果它像我看来一样丑陋,那么它将会是如此,或者如果有一些优雅的解决方案呢?似乎也许合成X事件不知何故愚弄屏幕保护程序认为有一些活动可能会以通用的方式做的伎俩,但我真的不知道如何做(并希望你不需要根本做到这一点.)
有任何想法吗?
谢谢,
– 史蒂夫
嗯,不幸的是,至少在Fedora核心8上,这似乎没有起作用.
xdg-screensaver脚本在那里,似乎是打算工作,它实际上不起作用.
一旦你做了“xdg-screensaver suspend window-id”,那么窗口id就是从程序内部得到的
xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);
或者窗口id是否通过xprop获得,并且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脚本,最终只是为我的过程做了一个“等待” – 酷),似乎是做我想做的.我知道我不可能是唯一或第一个面对这个问题.
谢谢!
– 史蒂夫