Bon[ jour | soir] !
Je cherche un moyen de lancer un script après un certain délais sans activité clavier ou souris (comme pour un économiseur d'écran). En fait, ça doit tourner en parallèle d'un économiseur.
Idéalement, ca prendrait en compte les événements en console et sous X.
J'ai fait quelque recherches mais j'ai pas trouvé mon bonheur...
Je suis allé jetter un oeil aux sources de xscreensaver: c'est assez gros et je ne suis pas un spécialiste C.
Auriez-vous un moyen simple d'y parvenir ?
# Re: Evénements clavier/souris
Posté par Paul Rouget . Évalué à 1.
oui :
xscreensaver-command -watch
Il te dit qd il BLANK et UNBLANK.
Tu l'ouvres en pipe avec perl ou en shell et ainsi tu peux savoir qd ton screensaver se met en route.
Fais des tests et tu comprendras tres vite.
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 2.
Le problème, c'est que je veux pas d'économiseur d'écran: l'utilisateur en utilise peut-être un : celui de kde ou xscreensaver...
J'ai vu cette possiblité mais elle implique que je lance xscreensaver au démarrage de x ou lorsque l'utilisateur se connecte et on ne peut lancer qu'une seule instance de xscreensaver !
Le "timetout" pour mon script peut être différent de celui de l'économiseur de l'utilisateur.
# Re: Evénements clavier/souris
Posté par Matthieu . Évalué à 1.
#!/usr/bin/perl
my $blanked = 0;
open (IN, "xscreensaver-command -watch |");
while () {
if (m/^(BLANK|LOCK)/) {
if (!$blanked) {
system "sound-off";
$blanked = 1;
}
} elsif (m/^UNBLANK/) {
system "sound-on";
$blanked = 0;
}
}
Note : les balises <pre></pre> rajoutent des lignes blanches entre chaques lignes....
# Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
/dev/input/event0 et /dev/input/event1 correspondent aux entrées-souris. Il suffit de les ouvrir et de mettre leur fds dans un select(), avec le bon timeout.
#include <sys/select.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int ev0;
int ev1;
int mfd;
int s;
struct timeval tv;
fd_set rfds;
char tmpbuf[1024];
ev0=open("/dev/input/event0");
if (!ev0)
perror("open() sur event0");
ev1=open("/dev/input/event1");
if (!ev1)
perror("open() sur event1");
read(ev1, tmpbuf, 1024); /* au cas où.... */
read(ev0, tmpbuf, 1024);
tv.tv_sec = 5; /* 5 secondes */
tv.tv_usec = 0;
FD_ZERO(&rfds);
FD_SET(ev0, &rfds);
FD_SET(ev1, &rfds);
if (ev1 > ev0)
mfd=ev1+1;
else
mfd=ev0+1;
s=select(mfd, &rfds, NULL, NULL, &tv);
/* printf("s=%d mfd=%d ev0=%d ev1=%d", s, mfd, ev0, ev1); */
if (s == -1)
perror("select()");
else if (!s)
printf("Pas touchai ni clavai ni souri !\n");
close(ev0);
close(ev1);
}
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 1.
Comme je l'ai dit, je ne suis pas un spécialiste C (ni programation linux).
J'ai essayé ceci:
[pat@poste25 home]$ gcc -Wall test.c -o test
test.c: In function `main':
test.c:17: warning: implicit declaration of function `open'
test.c:46: warning: control reaches end of non-void function
[pat@poste25 home]$ ./test
Segmentation fault
/dev/input n'existait pas
[pat@poste25 home]$ su -
[root@poste25 root]# modprobe evdev
[root@poste25 home]$ exit
[pat@poste25 home]$./test
Segmentation fault
/dev/input est vide !?
Est-ce qu'il faut le lancer en root ? (le résultat est le même...)
J'ai testé ca sur une mdk 9.1 (noyau 2.4.21)
Une idée ?
En tout cas merci beaucoup...!
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
$ uname -a
Linux localhost 2.6.5 #1 Sun Apr 4 13:23:09 CEST 2004 i686 unknown unknown GNU/Linux
$ lsmod
[...]
evdev 9632 0
evbug 2912 0
[...]
$ ls -al /dev/input/event*
crw-r--r-- 1 root root 13, 64 Jan 8 2001 /dev/input/event0
crw-r--r-- 1 root root 13, 65 Jan 8 2001 /dev/input/event1
[...]
Tu peux peut-être essayer de les mknod-er ? On peut remplacer event0 (souris, chez moi) par /dev/psaux, mais pour le clavier... je n'ai rien trouvé...
Sinon, voici une nouvelle version, qui doit résoudre les segfaults :'( (j'avais oublié les flags de open)
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
Et s/clavai/claviai/
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 0.
;)
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
:p
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 1.
FD_SET(ev0, &rfds);
Je dois encore investiguer pour le "/dev/input" vide..
j'ai essayé
[root@poste25 root]# mknod /dev/input/event0 c 13 64
[root@poste25 root]# mknod /dev/input/event1 c 13 65
[root@poste25 root]# ll /dev/input/even*
crw-r--r-- 1 root root 13, 64 avr 22 18:23 /dev/input/event0
crw-r--r-- 1 root root 13, 65 avr 22 18:23 /dev/input/event1
Sans résultat... (et sans savoir ce que je faisais :()
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
Que dit strace ?
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 1.
execve("./test", ["./test"], [/* 65 vars */]) = 0
uname({sys="Linux", node="poste25.soft.edu", ...}) = 0
brk(0) = 0x80497dc
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40013000
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=67573, ...}) = 0
old_mmap(NULL, 67573, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40014000
close(3) = 0
open("/lib/i686/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260X\1"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0755, st_size=1246500, ...}) = 0
old_mmap(NULL, 1256548, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40025000
mprotect(0x40152000, 23652, PROT_NONE) = 0
old_mmap(0x40152000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x12c000) = 0x40152000
old_mmap(0x40156000, 7268, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40156000
close(3) = 0
munmap(0x40014000, 67573) = 0
open("/dev/psaux", O_RDONLY) = 3
open("/dev/input/event1", O_RDONLY) = -1 ENOENT (No such file or directory)
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
[root@poste25 home]#
je crois pas que ca soit à cause du "No such file or directory"... Mais en fait j'en sais rien :(
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
Si evdev est bien présent dans le kernel, il devrait y avoir un fichier event[qqch] lié au clavier...
[^] # Re: Evénements clavier/souris
Posté par djapat . Évalué à 1.
néanmoins, si on le lance à la main, il faut faire un
sleep 1; test_events
sinon il sors tout de suite !! (je pense qu'il prend le return !!)
si on le lance en utilisateur normal: segmentation fault...
Il faudra que j'Estudie tout ça de plus près..
En tout cas merci !
[^] # Re: Evénements clavier/souris
Posté par cassecou . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.