9 votes

Comment vérifier si l'économiseur d'écran de la console Linux a un écran vide ?

Existe-t-il un moyen de vérifier par programme (via ioctl(), etc.) ou en lisant un fichier dans /sys, /proc ou /dev) si l'écran a été effacé par l'économiseur d'écran de la console Linux ?

Merci et meilleures salutations,

Günter

10voto

Ok, j'ai vérifié le code source de xset . Les parties du code concernées sont les suivantes

#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");
            }
        }
    }
}

Juste au cas où quelqu'un d'autre en aurait besoin ;-)

7voto

Daenyth Points 11297

Vous pouvez analyser la sortie de xset q con DISPLAY réglé, mais ce n'est pas joli.

$ 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

1voto

BlueSkyDetector Points 11

J'ai fait une implémentation équivalente du code de Günter en Python avec ctypes.

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

L'échantillon d'appel est sur mon github .

0voto

vstoyanov Points 616

Je n'ai pas fait de développement de bureau depuis des années, mais ma mémoire me dit que la plupart des écrans de veille sous linux étaient exécutés par xscreensaver - peut-être que vérifier si le processus est en cours d'exécution, ou parcourir son code source pour voir si un état système est défini, ou demander sur la liste des projets pourrait donner quelques résultats. Bien sûr, KDE et Gnome pourraient avoir des implémentations d'économiseurs d'écran séparées maintenant - il y a très peu d'uniformité quand il s'agit d'interfaces graphiques sous Linux, malheureusement...

0voto

stamp Points 120

J'utilise ce script pour lire les informations DPMS. Cela fonctionne très bien ! Il est écrit en PHP, mais vous pouvez voir l'idée comment il fonctionne.

<?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}'");
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X