2010-09-29 88 views

回答

6

您可以DISPLAY组解析的xset q输出,但它不是漂亮。

$ xset q 
Keyboard Control: 
    auto repeat: on key click percent: 0 LED mask: 00000000 
    XKB indicators: 
    00: Caps Lock: off 01: Num Lock: off 02: Scroll Lock: off 
    03: Compose:  off 04: Kana:  off 05: Sleep:  off 
    06: Suspend:  off 07: Mute:  off 08: Misc:  off 
    09: Mail:  off 10: Charging: off 11: Shift Lock: off 
    12: Group 2:  off 13: Mouse Keys: off 
    auto repeat delay: 250 repeat rate: 30 
    auto repeating keys: 00ffffffdffffbbf 
         fadfffefffedffff 
         9fffffffffffffff 
         fff7ffffffffffff 
    bell percent: 50 bell pitch: 400 bell duration: 100 
Pointer Control: 
    acceleration: 20/10 threshold: 4 
Screen Saver: 
    prefer blanking: yes allow exposures: yes 
    timeout: 0 cycle: 600 
Colors: 
    default colormap: 0x20 BlackPixel: 0 WhitePixel: 16777215 
Font Path: 
    /usr/share/fonts/misc,/usr/share/fonts/100dpi:unscaled,/usr/share/fonts/75dpi:unscaled,/usr/share/fonts/TTF,/usr/share/fonts/Type1,/usr/share/fonts/misc/,/usr/share/fonts/TTF/,/usr/share/fonts/Type1/,/usr/share/fonts/100dpi/,/usr/share/fonts/75dpi/,built-ins 
DPMS (Energy Star): 
    Standby: 1200 Suspend: 1800 Off: 0 
    DPMS is Enabled 
    Monitor is On 
Font cache: 
    Server does not have the FontCache Extension 
+0

谢谢,这是诀窍。不是最优雅的解决方案,但检查“Monitor is on | off”的输出是有效的。 – 2010-10-02 04:54:37

+1

这很好,但它依赖于可用的X服务器。如果你只是有一个控制台(当然这很少见),但它不会起作用。 – Gabe 2010-10-02 05:16:35

+0

在我的情况下,它很好。我正在运行一个全屏的Gtk-WebKit浏览器,它像筛网一样泄漏内存,所以在屏幕关闭一段时间后,我可以安全地杀死并重新启动浏览器;-)当然,不会有这些泄漏首先... – 2010-10-02 09:53:20

0

我没有做过任何的青睐台式机的发展,但记忆告诉我,大多数Linux屏保正由执行的xscreensaver - 也许检查过程是否正在运行,或者通过源代码查看是否设置了任何系统状态,或者询问项目maillist会产生一些结果。 当然KDE和Gnome现在可能有独立的屏幕保护程序的实现 - 很少有一致性,当涉及到Linux图形用户界面,可惜......

9

好的,检查了xset source code。相关的代码部分是

#include <X11/extensions/dpms.h> 
... 
Display* dpy = XOpenDisplay(NULL); 
... 
int dummy; 
CARD16 standby, suspend, off; 
BOOL onoff; 
CARD16 state; 

printf("DPMS (Energy Star):\n"); 
if (DPMSQueryExtension(dpy, &dummy, &dummy)) 
{ 
    if (DPMSCapable(dpy)) 
    { 
     DPMSGetTimeouts(dpy, &standby, &suspend, &off); 
     printf (" Standby: %d Suspend: %d Off: %d\n", 
       standby, suspend, off); 
     DPMSInfo(dpy, &state, &onoff); 
     if (onoff) 
     { 
      printf(" DPMS is Enabled\n"); 
      switch (state) 
      { 
      case DPMSModeOn: 
       printf(" Monitor is On\n"); 
       break; 
      case DPMSModeStandby: 
       printf(" Monitor is in Standby\n"); 
       break; 
      case DPMSModeSuspend: 
       printf(" Monitor is in Suspend\n"); 
       break; 
      case DPMSModeOff: 
       printf(" Monitor is Off\n"); 
       break; 
      default: 
       printf(" Unrecognized response from server\n"); 
      } 
     } 
    } 
} 

万一别人需要这个;-)

0

我使用这个脚本读取DPMS信息。它很棒!它用PHP编写,但你可以看到它的工作原理。

<?php 
if (!$pid = exec('pidof X')) 
    return !trigger_error(E_USER_WARNING,'Could not find pid of X'); 

if (!$data = file_get_contents("/proc/$pid/cmdline")) 
    return !trigger_error(E_USER_WARNING,"Cound not read pid info (/proc/$pid/cmdline)"); 

$data = explode(chr(0),$data); 
foreach($data as $key => $line) { 
    if ($line == "-auth") { 
     $auth = $data[$key+1]; 
     break; 
    } 
} 

if (!isset($auth)) 
    return !trigger_error(E_USER_WARNING,'Could not find XAUTHORITY in xinit process environment'); 

echo exec("export DISPLAY=:0; export XAUTHORITY={$auth}; export PATH=\${PATH}:/usr/X11R6/bin; xset -q | grep \"Monitor is\" | awk '{print $3}'"); 
?> 
0

我用ctypes在Python中做了等效的Günter代码实现。

import ctypes 
import struct 

ctypes.cdll.LoadLibrary('libXext.so') 
libXext = ctypes.CDLL('libXext.so') 

DPMSFAIL = -1 
DPMSModeOn = 0 
DPMSModeStandby = 1 
DPMSModeSuspend = 2 
DPMSModeOff = 3 


def get_DPMS_state(display_name_in_byte_string=b':0'): 
    state = DPMSFAIL 
    if not isinstance(display_name_in_byte_string, bytes): 
     raise TypeError 
    display_name = ctypes.c_char_p() 
    display_name.value = display_name_in_byte_string 
    libXext.XOpenDisplay.restype = ctypes.c_void_p 
    display = ctypes.c_void_p(libXext.XOpenDisplay(display_name)) 
    dummy1_i_p = ctypes.create_string_buffer(8) 
    dummy2_i_p = ctypes.create_string_buffer(8) 
    if display.value: 
     if libXext.DPMSQueryExtension(display, dummy1_i_p, dummy2_i_p)\ 
      and libXext.DPMSCapable(display): 
      onoff_p = ctypes.create_string_buffer(1) 
      state_p = ctypes.create_string_buffer(2) 
      if libXext.DPMSInfo(display, state_p, onoff_p): 
       onoff = struct.unpack('B', onoff_p.raw)[0] 
       if onoff: 
        state = struct.unpack('H', state_p.raw)[0] 
     libXext.XCloseDisplay(display) 
    return state 

调用示例在my github