2010-09-29 16 views
8

प्रोग्रामेटिक रूप से जांचने का तरीका है (ioctl(), आदि के माध्यम से या/sys,/proc या/dev में फ़ाइल पढ़कर) स्क्रीन को खाली कर दिया गया है या नहीं लिनक्स कंसोल स्क्रीनसेवर द्वारा?यह जांचने के लिए कि क्या लिनक्स कंसोल स्क्रीनसेवर स्क्रीन को खाली कर दिया गया है

धन्यवाद और सादर,

गुंटर

उत्तर

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

धन्यवाद, यह चाल है। सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन "मॉनिटर चालू है ऑफ" काम के लिए आउटपुट की जांच करना। –

+1

यह ठीक है, लेकिन यह एक एक्स सर्वर पर उपलब्ध होने पर निर्भर करता है। यदि आपके पास अभी एक कंसोल है (जो इन दिनों दुर्लभ है, स्वीकार्य रूप से), यह काम नहीं करेगा। – Gabe

+0

मेरे मामले में यह ठीक है। मैं एक पूर्णस्क्रीन जीटीके-वेबकिट ब्राउज़र चला रहा हूं जो एक चाकू की तरह स्मृति को रिसाव करता है, इसलिए थोड़ी देर के लिए स्क्रीन बंद कर दी गई है, इसलिए मैं सुरक्षित रूप से ब्राउज़र को मार सकता हूं और फिर से शुरू कर सकता हूं ;-) बेशक यह अच्छा होगा कि उन रिसाव न हो पहली जगह में ... –

0

मैं उम्र में किसी भी डेस्कटॉप विकास नहीं किया है, लेकिन स्मृति मुझसे कहता है कि सबसे linux स्क्रीनसेवर xscreensaver द्वारा क्रियान्वित किया जा रहा था - हो सकता है की जाँच की प्रक्रिया चल रही है कि क्या , या किसी भी सिस्टम-स्टेट को सेट करने के लिए अपने प्रोजेक्ट-कोड के माध्यम से जा रहा है, या प्रोजेक्ट माइलिस्ट से पूछने से कुछ नतीजे मिलेंगे। पाठ्यक्रम KDE और Gnome के अब तक अलग स्क्रीनसेवर कार्यान्वयन हो सकता है - बहुत कम एकरूपता नहीं है जब यह GUIs 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

मैंने पाइथन में ग्टर के कोड को सीटीपीएस के साथ समकक्ष कार्यान्वित किया।

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 पर है।

संबंधित मुद्दे