2016-09-02 2 views
3

Je veux exécuter du code lorsque l'utilisateur utilisera la molette de la souris. J'ai écrit l'exemple d'application simple et cela ne fonctionne pas. Pourquoi mon application ne réagit pas sur la molette de la souris?Comment réagir à la roulette de la souris dans Xlib?

#include <X11/Xlib.h> 
#include <X11/X.h> 
#include <X11/Xutil.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    Display *d; 
    Window w; 
    XEvent e; 
    char *msg = "Hello, World!"; 
    int s; 

    d = XOpenDisplay(NULL); 
    if (d == NULL) { 
     fprintf(stderr, "Cannot open display\n"); 
     exit(1); 
    } 

    s = DefaultScreen(d); 
    w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, 
          BlackPixel(d, s), WhitePixel(d, s)); 
    XSelectInput(d, w, ExposureMask | ButtonPressMask); 
    XMapWindow(d, w); 

    while (1) { 
     XNextEvent(d, &e); 
     if (e.type == Expose) { 
     XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); 
     XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg)); 
     } 
     if (e.type == ButtonPress){ 
     switch (e.xbutton.button){ 
      case Button4: 
       printf("Scrolled up"); 
       break; 
      case Button5: 
       printf("Scrolled down"); 
       break; 
      default: 
       printf("cos"); 
     } 
     } 
    } 

    XCloseDisplay(d); 
    return 0; 
} 

Merci :)

// Ceci est un texte aléatoire pour contourner stacksoverflow "s'il vous plaît ajouter quelques détails".

+0

-t-il réagir à toute pression sur le bouton de la souris? Comment savez-vous que Button4 et Button5 correspondent à la molette de défilement? – yano

Répondre

2

votre code est correct, la raison pour laquelle vous ne voyez pas les résultats immédiatement est parce que fprintf tamponne les données jusqu'à la nouvelle ligne. Remplacez vos lignes de débogage avec quelque chose comme printf("Scrolled up\n"); et vous verrez les résultats immédiatement. Vous pouvez également faire setbuf(stdout, NULL); pour désactiver la mise en mémoire tampon.

Voir cette question liée SO: Why does printf not flush after the call unless a newline is in the format string?