有没有一种好的方法可以在Linux中禁止屏幕保护程序?

2024-03-29

我正在寻找一种体面的、不蹩脚的方式来抑制 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 脚本,最终只是“等待”我的进程——很酷),它似乎就是为了做我想做的事情。我知道我不可能是唯一一个或第一个面临这个问题的人。


不,但是是的...

没有很好的干净的方法来做到这一点。在我看来,应该有一种由 X 服务器管理的机制,屏幕保护程序和感兴趣的应用程序都可以自愿使用该机制来协商在一个或多个程序运行时对任何屏幕保护程序的抑制。但据我所知,尚不存在这样的机制。 GNOME 和 KDE 似乎正在实施 DBUS 方法来解决这个问题,但在我看来,即使它变得广泛(它还没有广泛到足以在第 3 方代码中依赖它),这也不是正确的方法。

然而,xdg-screensaver 是一个 FreeDesktop 标准化 shell 脚本,您可以将其作为子进程运行来控制屏幕保护程序。它控制最流行的屏幕保护程序,操作系统供应商将负责更新/维护它,以便与更新的屏幕保护程序或将来更好的方法一起使用。与许多其他的拼凑不同,如果您的应用程序崩溃或通过某种忘记调用重新启用代码的路线退出,它会自动重新启用屏幕保护程序。有关如何使用它的详细信息,请参阅手册页。

作为 GTK+ 用户,最棘手的方面可能是创建子进程来运行 shell 脚本(如果您之前没有这样做过,您将需要找到有关使用 fork + exec 的教程)并获取 XWindow要提供给 xdg-screensaver 的应用程序主窗口的 ID。

您要求代码应该“快”。这让我想知道您是否希望每帧都运行它 - 不要。 xdg-screensaver 解决方案允许您显式禁用或重新启用屏幕保护程序,而不是尝试每帧或类似的方式抑制它一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种好的方法可以在Linux中禁止屏幕保护程序? 的相关文章

  • 如何使用GTK开发类似Eclipse的界面?

    我想使用 GTKMM 编写一个桌面应用程序 我希望界面由不同的面板组成 就像在 Eclipse 中一样 您有项目资源管理器 控制台 属性等 您应该能够拖动面板来更改其位置 关闭它们并弹出它们 不确定是否可以弹出 Eclipse 中的面板 但
  • 有人知道针对低内存使用进行优化的 java.util.Map 实现吗?

    我查看了通常的地方 apache commons google 但找不到一个 它应该是开源的 几乎正在寻找一个基于链接列表的 用例是 10 000 张地图 不一定有很多值 它不需要按比例放大 因为当它变得太大时我可以转换它 一些数字 大小使
  • RecyclerView SnapHelper 无法显示第一个/最后一个项目

    我有一个RecyclerView它附加到一个LinearSnapHelper捕捉到中心项目 当我滚动到第一个或最后一个项目时 这些项目不再完全可见 此问题如下图所示 怎么解决呢 一个迟到的答案只是用Java代码编写的 Create Cust

随机推荐