我已经阅读了xscreensaver常见问题(http://www.jwz.org/xscreensaver/faq.html).
我有一个基于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脚本,最终只是为我的过程做了一个“等待” – 酷),似乎是做我想做的.我知道我不可能是唯一或第一个面对这个问题.
谢谢!
– 史蒂夫
解决方法
没有很好的干净的方法来做到这一点.在我看来,应该有一个由X服务器管理的机制,屏幕保护程序和感兴趣的应用程序可以在一个或多个程序的运行时间内自愿使用协商来抑制任何屏幕保护程序.但是我的知识还没有这样的机制. GNOME和KDE希望对这个问题实施一个DBUS方法,但是在我看来,即使它变得普遍(在第三方代码中尚不足以依赖它),这不是正确的方法.
但是,xdg-screensaver是一个FreeDesktop标准化的shell脚本,可以作为子进程运行来控制屏幕保护程序.它控制着最受欢迎的屏幕保护程序,操作系统供应商将负责更新/维护它,以便与更新的屏幕保护程序一起使用,或者更好的方式在未来完成此操作.与许多其他kludges不同,如果您的应用程序通过一些忘记调用重新启用代码的路由崩溃或退出,它将自动重新启用屏幕保护程序.有关如何使用它的详细信息,请参阅手册页.
作为GTK用户,您可能会为此创建子进程来运行shell脚本(如果尚未完成此操作之前,您将需要找到有关使用fork exec的教程)并获取XWindow ID的应用程序的主窗口给予xdg屏保.
你要求代码应该是“快”.这让我想知道你是否希望每帧运行 – 不要. xdg-screensaver解决方案允许您明确禁用或重新启动屏幕保护程序,而不是尝试每帧或任何类似的操作来抑制它.