N-PN White-Hat Project
[C] [NCURSES] Event Keyboard + Mouse - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages compilés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=25)
+--- Sujet : [C] [NCURSES] Event Keyboard + Mouse (/showthread.php?tid=3592)



[C] [NCURSES] Event Keyboard + Mouse - Junky - 10-03-2014

Bonjour,

Un petit programme fait sur le pouce afin de remonter les events ncurses (int). Ca ne sert pas forcément a grand chose, mais souvent lorsque l'on code, ont aiment bien savoir et connaître les retours des touches/clics.

J'avais fait ca a l'époque (lors du dev de pong) et je viens de retomber dessus. Donc même si ce n'est pas un code de ouf malade autant le partager. Qui sait peut-être qu'un jour il servira a quelqu'un.

Code C :

#include <curses.h>
 
int main() {
  int c;
 
  mmask_t Mask;
  (void) initscr();
  keypad(stdscr, TRUE);
  (void)immedok(stdscr,TRUE);
  (void)scrollok(stdscr,TRUE);
 

   // Ici on check si la mouse est prise en compte.
  if (!mousemask(ALL_MOUSE_EVENTS, &Mask)) {
     printw("Mouse mask failed\n");
     if ((int*) Mask != NULL)
        printw("Mouse mask returned\n");
     else
        printw("No mouse mask returned\n");
   }

   printw("q (valeur: 113 <img src="https://dev.n-pn.fr/forum/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" /> ) pour sortir.\n");
   do {
       c = wgetch(stdscr);
   
    printw(" :\n[+] KEY_EVENT_NUMBER: %d\n", c);

   } while (c != 'q');
   
   // on clear
   clear();

   //on ferme propre.
   endwin();
   
   return 0;
}
 


On compile de cette manière:
Code BASH :

(580) silentd@G3nt00:~$ gcc -o mouse mouse.c -lncurses
 


Junky,


RE: [C] [NCURSES] Event Keyboard + Mouse - gruik - 10-03-2014

si j'ai bien compris, pour détailler un peu;

- keypad() sert à activer le clavier, on le met à TRUE du coup wgetch() nous retournera un code approprié si on appuie sur la flèche vers le haut par exemple
- mousemask() c'est un peu le même principe, mais pour la souris, on lui demande de capturer ALL_MOUSE_EVENTS et on récupère l'activité dans "Mask" c'est ça ?
- wgetch() est de la même famille que getch() qu'on connait souvent déjà, sert à capturer une frappe clavier en mode non-bloquant


RE: [C] [NCURSES] Event Keyboard + Mouse - Junky - 10-03-2014

(10-03-2014, 16h59)gruik a écrit : si j'ai bien compris, pour détailler un peu;

- keypad() sert à activer le clavier, on le met à TRUE du coup wgetch() nous retournera un code approprié si on appuie sur la flèche vers le haut par exemple
- mousemask() c'est un peu le même principe, mais pour la souris, on lui demande de capturer ALL_MOUSE_EVENTS et on récupère l'activité dans "Mask" c'est ça ?
- wgetch() est de la même famille que getch() qu'on connait souvent déjà, sert à capturer une frappe clavier en mode non-bloquant

Pour les 2 premiers oui et oui

Pour wgetch() en faite oui aussi mais c'est un peu différent. Si on le décompose, on a le getch() et "w". En faite le w signifie windows. Il signifie qu'il attend un event dans la window créé.

Par défault il sont bloquant en effet (donc ici dans le prog il bloque la do {}while(); ), mais il est possible de les rendrent non-bloquant de cette manière:

Code C :

nodelay(WINDOW*,1); //0 pour bloquant
 


En gros ici tu va déclarer TOUTE la win en non bloquant.

Donc on peut imaginer un truc dans le genre:
Code C :

WINDOW *win=NULL;
win = newwin(int nlines, int ncols, int begin_y,int begin_x);

//et ensuite par exemple
win2 = newwin(int nlines, int ncols, int begin_y,int begin_x);

nodelay(win,1); // le wgecth() ne seront pas bloquant
nodelay(win1,0); // ici oui
 


la pour le coup l'exemple n'est pas significatif puisque je bosse avec 1 seul window et de plus a l'arrache. Je ne respect pas du tt les standarts ncusres.


Pour en revenir a mon "tool", normalement j'aurais du procéder un peu de la manière décrite juste au dessus mais la je ne déclare aucune fenêtre. ( a la bourrin Smile )
En faite j'aurais pu use directement des printf() a la place. Puisque je ne bosse pas avec de win.

Ceci est ce que l'on appel un code très très sale use pour des raisons perso et demandant a être valable pour hier... Smile


Je viens de faire un bout de code avec des threads qui montre comment fonctionne le wgetch() en bloquant ou non-bloquant:

Code C :

#include <ncurses.h>
#include <time.h>
#include <pthread.h>
void thread_func1(){
   
    WINDOW *win1 = NULL;
    int x = 0, y = 0, c = 0;
    keypad(stdscr, TRUE);
    win1 = newwin(80, 80, 0, 80);
    nodelay(win1,0);
    noecho();
    do {
        c = wgetch(win1);
        mvwaddstr((WINDOW *) win1, y, x, "Appui sur une touche sinon je ne fais rien");
        y++;
    } while (c != 'q');
}

void thread_func(){
   
    WINDOW *win = NULL;
    int x = 0, y = 0, c = 0;
    win = newwin(80, 80, 0, 0);
   nodelay(win,1);
    do {
            c = wgetch(win);
            mvwaddstr((WINDOW *) win, y, x, "Je suis pas bloquant!!! <img src="https://dev.n-pn.fr/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> \n");
            y++;
            sleep(1);
    } while (c != 'q');
}

int main(){
   
    initscr();

    pthread_t thread;
    pthread_t thread1;

    pthread_create(&thread, NULL, (void *)thread_func, NULL);
    pthread_create(&thread1, NULL, (void *)thread_func1, NULL);

    pthread_join(thread,NULL);
    pthread_join(thread1,NULL);
    endwin();

    return 0;
}

 



compilez le de cette manière:
Code C :

(537) silentd@G3nt00:~$ gcc -o toto toto.c -lncurses -lpthread
 


Le resultat est la. La ou le nodelay est positionné a 0, il ne se passe rien tant que l'on appui pas sur une touche du clavier. Pour l'autre osef il s'en fou il continue a tourner tranquillement.

En faite une manière très simple de voir si tu travailles ou pas sur des fenetres et de repérer le "w" dans la fonction. Et TT les fonction avec un "w" prennent en paramètre une fenêtre: (sauf le printw() :p )

Code C :


refresh();
wrefresh(WINDOW);
clear();
wclear(WINDOW);

//ect...

 


J'espère avoir été claire... Smile

EDIT: en faite pour le wgetch() (dans mon exemple) il prend en compte la stdscr c'est a dire "la sortie standart du screen". Je sais pas si c'est bien français... Smile
Junky,