Cyril Rabat


Gestion de la souris avec ncurses

 14/01/2016     21/01/2016      Programmation C      Programmation de base      ncurses   

Récupération des évènements de la souris avec ncurses

   Cet article présente comment il est possible de récupérer les évènements de la souris (type de clic, position) avec ncurses.

Mots-clefs :   ncurses     gestion souris   

L'archive suivante contient l'ensemble des fichiers de cet article :

 souris.zip

Les fonctions de base de ncurses

Le fichier C suivant contient la définition de plusieurs fonctions nécessaires pour l'activation du mode ncurses. Pour la gestion de la souris, la fonction ncurses_souris permet d'activer la souris et la fonction souris_getpos permet de récupérer la position de la souris, ainsi que le type de bouton cliqué.

#include "ncurses.h"
 
#include <ncurses.h>   /* Pour toutes les fonctions/constantes ncurses */
#include <stdlib.h>    /* Pour exit, EXIT_FAILURE */
 
/**
 * Initialisation de ncurses.
 */
void ncurses_initialiser() {
  initscr();	        /* Demarre le mode ncurses */
  cbreak();	        /* Pour les saisies clavier (desac. mise en buffer) */
  noecho();             /* Desactive l'affichage des caracteres saisis */
  keypad(stdscr, TRUE);	/* Active les touches specifiques */
  refresh();            /* Met a jour l'affichage */
  curs_set(FALSE);      /* Masque le curseur */
}
 
/**
 * Fin de ncurses.
 */
void ncurses_stopper() {
  endwin();
}
 
/**
 * Initialisation des couleurs.
 */
void ncurses_couleurs() {
  /* Verification du support de la couleur */
  if(has_colors() == FALSE) {
    ncurses_stopper();
    fprintf(stderr, "Le terminal ne supporte pas les couleurs.\n");
    exit(EXIT_FAILURE);
  }
 
  /* Activation des couleurs */
  start_color();
 
  /* Definition de la palette */
  init_pair(1, COLOR_BLUE, COLOR_BLACK);
  init_pair(2, COLOR_RED, COLOR_BLACK);
  init_pair(3, COLOR_GREEN, COLOR_BLACK);
}
 
/**
 * Initialisation de la souris.
 */
void ncurses_souris() {
  if(!mousemask(ALL_MOUSE_EVENTS, NULL)) {
    ncurses_stopper();
    fprintf(stderr, "Erreur lors de l'initialisation de la souris.\n");
    exit(EXIT_FAILURE);
  }
 
  if(has_mouse() != TRUE) {
    ncurses_stopper();
    fprintf(stderr, "Aucune souris n'est détectée.\n");
    exit(EXIT_FAILURE);
  }
}
 
/**
 * Recupere la position x et y de la souris.
 * @param[out] x la position en x
 * @param[out] y la position en y
 * @param[out] bouton l'évenement associé au clic
 * @return OK si reussite
 */
int souris_getpos(int *x, int *y, int *bouton) {
  MEVENT event;
  int resultat = getmouse(&event);
 
  if(resultat == OK) {
    *x = event.x;
    *y = event.y;
    *bouton = event.bstate;
  }
  return resultat;
}
 

 Télécharger le fichier

Le programme principal

Le programme suivant se contente d'attendre les évènements de la souris puis les affiche à l'écran. Seuls le clic et le double-clic avec le bouton 1 ou 2 de la souris sont gérés.

/**
 * Ce programme illustre l'utilisation de la souris dans un environnement
 * ncurses. Lorsque l'utlisateur clique sur la souris, un message est affiché
 * à l'écran avec les coordonnées du caractère cliqué.
 * @author Cyril Rabat
 * @version 21/01/2016
 **/
 
#include <stdlib.h>     /* Pour EXIT_SUCCESS */
#include <ncurses.h>    /* Pour printw, attron, attroff, COLOR_PAIR, getch */
 
#include "ncurses.h"
 
int main() {
  int sourisX, sourisY, bouton, ch;
 
  /* Initialisation de ncurses */
  ncurses_initialiser();
  ncurses_souris();
  scrollok(stdscr, TRUE);
  printw("Pressez F2 pour quitter. Cliquez avec la souris sur le terminal...\n");
 
  /* Routine principale */
  while((ch = getch()) != KEY_F(2)) {
    switch(ch) {
      case KEY_MOUSE:
        if(souris_getpos(&sourisX, &sourisY, &bouton) == OK) {
	  if(bouton & BUTTON1_CLICKED)
	    printw("Clic bouton 1 a la position (%d, %d)\n", sourisX, sourisY);
	  if(bouton & BUTTON2_CLICKED)
	    printw("Clic bouton 2 a la position (%d, %d)\n", sourisX, sourisY);
	  if(bouton & BUTTON1_DOUBLE_CLICKED)
	    printw("Double-clic bouton 1 a la position (%d, %d)\n", sourisX, sourisY);
	  if(bouton & BUTTON2_DOUBLE_CLICKED)
	    printw("Double-clic bouton 2 a la position (%d, %d)\n", sourisX, sourisY);
	  refresh();
	}
    }
  }
 
  /* Arrêt de ncurses */
  ncurses_stopper();
 
  return EXIT_SUCCESS;
}
 

 Télécharger le fichier

Compilation et exécution

Le Makefile suivant permet de compiler le programme précédent :

 makefile

Pour compiler le programme précédent, tapez la commande suivante :

    make

Pour exécuter le programme, tapez la commande suivante :

    ./exemple

Articles connexes


Version de cette page Mercredi 16 Décembre 2015

© Cyril Rabat 2016

Connexion

Mot de passe perdu

Dernières nouvelles

Aucune pour le moment

Contact

Courriel :
cyril.rabat [at] univ-reims.fr

Téléphone :
+33-326-91-33-81

Fax :
+33-326-91-33-97

Facebook :
lien Facebook direct