我正在寻找一种体面的,非蹩脚的方式来抑制xscreensaver,kscreensaver或gnome-screensaver,它们可能正在运行,最好是以屏幕保护程序无关的方式,它绝对必须快速执行.
我已经阅读了xscreensaver常见问题解答(http://www.jwz.org/xscreensaver/faq.html).
我有一个基于gtk的游戏程序,它在混合多个音频通道的同时发出30帧/秒,并且由于它是由操纵杆控制的,有时候"屏幕保护程序"会启动.我把"the"放在引号中,因为有至少三种不同的流行屏保,xscreensaver,gnome-screensaver和kscreensaver,每种都有自己独特且笨重的方法,应用程序可能通过它们来抑制它们.
是否有人封装了代码以将所有这些禁止成快速的代码块?哦,它必须与GPL兼容.
目前,如果检测到任何屏幕保护程序并且操纵杆正在使用中,我的代码只是抱怨不合作的屏幕保护程序开发人员,除了建议用户手动禁用屏幕保护程序之外,实际上并没有尝试做任何事情,这是我唯一能做的事情.我认为这样做非常难看,我只是拒绝这么做.
只是想知道是否有其他人遇到过这个,以及他们做了什么,如果他们做了什么,如果它看起来像我看起来那样丑陋,或者如果那里有一些优雅的解决方案......似乎可能以某种方式合成X事件来欺骗屏幕保护程序,以为某些活动可能以通用的方式完成,但我真的不知道该怎么做(并希望你不需要root来做它.)
有任何想法吗?
谢谢,
- 史蒂夫
嗯,不幸的是,至少在Fedora核心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-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-screensaver.
你要求代码应该"快".这让我想知道你是否期望每一帧运行它 - 不要.xdg-screensaver解决方案允许您显式禁用或重新显示屏幕保护程序,而不是尝试每帧或类似的一次抑制它.