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
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
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 ;-)
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
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 .
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...
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 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.