Journal Evénements clavier/souris

Posté par  .
Étiquettes : aucune
0
22
avr.
2004
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  . Évalué à 1.

    >Auriez-vous un moyen simple d'y parvenir ?
    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  . Évalué à 2.

      Et si l'utilisateur utilise l'économiseur de kde ?
      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  . Évalué à 1.

    Dans le man xscreensaver-command, y'a un exemple en perl... ça tombe bien non ?


    #!/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  . Évalué à 1.

    Avec le module evdev :
    /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  . Évalué à 1.

      Ca semble l'idéal (programe simple) !!
      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  . Évalué à 1.

        Chez moi: Slackware-current, kernel 2.6.5

        $ 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)

        # cat pastouchai2.c
        #include <sys/select.h>
        #include <stdio.h>
        #include <sys/time.h>
        #include <sys/types.h>
        #include <unistd.h>
        #include <sys/stat.h>
        #include <fcntl.h>

        int main() {
        int ev0;
        int ev1;
        int mfd;
        int s;
        struct timeval tv;
        fd_set rfds;

        ev0=open("/dev/psaux",O_RDONLY);
        if (!ev0)
        perror("open() sur psaux");
        ev1=open("/dev/input/event1",O_RDONLY);
        if (!ev1)
        perror("open() sur event1");

        tv.tv_sec = 1; /* 1 seconde */
        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);
        return 0;
        }
        • [^] # Re: Evénements clavier/souris

          Posté par  . Évalué à 1.

          J'oubliais: en root, bien entendu.

          Et s/clavai/claviai/
        • [^] # Re: Evénements clavier/souris

          Posté par  . Évalué à 1.

          j'ai toujours un segfault, apparemmant à cette ligne:
          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  . Évalué à 1.

            Très étrange...

            Que dit strace ?
            • [^] # Re: Evénements clavier/souris

              Posté par  . Évalué à 1.

              [root@poste25 home]# strace ./test
              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  . Évalué à 1.

                O_o

                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  . Évalué à 1.

                  OK: j'ai testé avec un noyau 2.6.3: ca marche !
                  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 !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.