Forum Programmation.c Souris trop bavarde avec Ncurses

Posté par  . Licence CC By‑SA.
Étiquettes :
3
7
mai
2024

Bonjour,

Je travaille sur un programme Ncurses avec lequel on peut interagir avec la souris. Je souhaite en particulier pouvoir suivre les mouvements de souris même lorsque l'on n'appuie sur aucun bouton. Pour ça, j'utilise une séquence de contrôle XTerm qui active le tracking de tous les évènements de la souris :

printf("\033[?1003h\n");

(documentation)

Je teste avec le programme suivant, qui affiche la position de la souris, ainsi que les évènements de la souris (bstate) :

//gcc -o bstates bstates.c -lncurses -Wall
#include <ncurses.h>
#include <stdio.h>

int main()
{
initscr();
cbreak();
keypad(stdscr, TRUE);
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
printf("\033[?1003h\n"); // Active le tracking de tous les évènements de la souris, y compris les mouvements
addstr("Echap pour quitter\n");

int c = 0; 
while (c != 27) {        
    c = wgetch(stdscr);

    char buffer[512];
    size_t max_size = sizeof(buffer);
    if (c == ERR)
        snprintf(buffer, max_size, "Rien");

    else if (c == KEY_MOUSE) {
        MEVENT event;
        if (getmouse(&event) == OK)
            snprintf(buffer, max_size, "ligne = %02d, colonne = %03d, bstate = 0x%028b",
                     event.y, event.x, event.bstate);
        else
            snprintf(buffer, max_size, "Erreur");
    }
    else
        snprintf(buffer, max_size, "Touche %d (%s)", c, keyname(c));

    move(0, 0);
    insertln();
    addstr(buffer);
    clrtoeol();
}

printf("\033[?1003l\n"); // Désactive le tracking
endwin();
return 0;

}

Les mouvements sont suivis convenablement, mais après avoir testé une gamme étendue de clics ou Ctrl/Alt/Maj + clic, des évènements fantômes apparaissent : je vois les bits de poids faible s'allumer et s'éteindre sans faire autre chose que bouger la souris. Je voudrais que, lorsque je bouge simplement la souris, tous les bits soient à 0, ou au moins qu'ils arrêtent de bouger.

Quelqu'un saurait m'aiguiller pour comprendre ce qui se passe et comment corriger le problème ?

J'utilise Gnome Terminal en version 3.44, et Ncurses en version 6.3.

  • # Commentaire supprimé

    Posté par  . Évalué à -1 (+0/-2). Dernière modification le 07 mai 2024 à 12:09.

    Ce commentaire a été supprimé par l’équipe de modération.

  • # aucune idée

    Posté par  (site web personnel) . Évalué à 3 (+1/-0).

    A priori je commencerais par essayer de reproduire le problème avec xev pour essayer de comprendre si c'est au niveau de ncurses ou plus bas. Puis peut-être avec un autre ordinateur/souris. Mais en fin de compte je suspecte que tu vas juste devoir filtrer toi même ces événements fantômes.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: aucune idée

      Posté par  . Évalué à 1 (+0/-0).

      Xev offre le comportement attendu, pas de clics fantômes.

      Le même script écrit en Python manifeste le même problème. J'ai tenté d'autres émulateurs de terminal (Mate Terminal, Konsole), idem. J'ai aussi essayé avec Zsh pour voir, et ça ne change rien :/

      Je ne vois pas bien comment je pourrais filtrer ces évènements : ce ne sont pas juste des bits qui restent coincés à 1, il y a des changements de valeurs, et dans les deux sens.

      • [^] # Re: aucune idée

        Posté par  (site web personnel) . Évalué à 3 (+1/-0).

        Bon bah l'étape suivante c'est de comprendre ce que xev fait de différent.

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Reset

    Posté par  . Évalué à 2 (+1/-0).

    A mon avis ces valeurs de bit sont simplement celles qui sont dans la variable "event" avant l'appel de "getmouse".

    Ni le compilateur C, ni la fonction "getmouse" ne mettent ces bit à 0.

    Donc un memset sur event résoudra le problème ( même si ce n'est sûrement pas la solution la plus optimisée )

    • [^] # Re: Reset

      Posté par  . Évalué à 2 (+1/-0).

      Il y a des bits qui passent spontanément à 0, et d'autres qui passent spontanément à 1. J'ai quand même testé ta suggestion pour être sûr, sans succès.

Envoyer un commentaire

Suivre le flux des commentaires

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