2016-09-02 15 views
3

マウスホイールを使用するときにコードを実行したい。私は単純なサンプルアプリケーションを書いて、それは動作していません。私のアプリケーションがマウスホイールに反応しないのはなぜですか?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; 
} 

感謝:)

//これはバイパスstacksoverflow "いくつかの詳細を追加してください" にはいくつかのランダムなテキストです。

+0

マウスのボタンを押しても反応しますか? 'Button4'と' Button5'がスクロールホイールにどのように対応しているのですか? – yano

答えて

2

あなたのコードは正しいです。結果がすぐに表示されない理由は、fprintfが改行までデータをバッファするためです。あなたのデバッグ行をprintf("Scrolled up\n");のようなものに置き換えるとすぐに結果が表示されます。バッファリングを無効にするには、setbuf(stdout, NULL);を実行することもできます。

この関連する質問を参照してください:Why does printf not flush after the call unless a newline is in the format string?

関連する問題