• STATISTIQUES
  • Il y a eu un total de 2 membres et 7832 visiteurs sur le site dans les dernières 24h pour un total de 7 834 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] apprendre-a-manipuler
    Site d'apprentissage de la manipulation d'autrui.
    Hacking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] w3challs
    Ce site propose différents types de défis informatiques: piratage, craquage, cryptographie, stég...
    Hacking
    [EN] Hack This Site
    Hack This Site est considéré comme un réel terrain d'entraînement légal pour le...
    Hacking
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] CS Tutoring Center
    Site de challenge spécialisé dans les challenges de programmation C++ et java cependant, d'autres langages pe...
    Challenges
    [FR] NewbieContest
    Nous vous proposons une série de challenges regroupant plusieurs domaines allant de l'exploitation de fail...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] [NCURSES] Event Keyboard + Mouse
10-03-2014, 16h10
Message : #1
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 203
Inscription : Mar 2013
[C] [NCURSES] Event Keyboard + Mouse
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  ) 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,
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (3) -1 (0) Répondre
10-03-2014, 16h59
Message : #2
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C] [NCURSES] Event Keyboard + Mouse
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
+1 (0) -1 (0) Répondre
10-03-2014, 19h31 (Modification du message : 10-03-2014, 19h34 par Junky.)
Message : #3
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 203
Inscription : Mar 2013
RE: [C] [NCURSES] Event Keyboard + Mouse
(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!!!  \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,
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (2) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut