2011-03-11 83 views
0

我有一個小問題,抓住關鍵事件公佈,從走在我的遊戲停止我的性格..KeyRelease事件不會發送

我試圖做到這一點:

switch (xev.type) 
    { 
     case Expose: 
     { 
      XGetWindowAttributes(dpy, win, &gwa); 
      glViewport(0, 0, gwa.width, gwa.height); 
     } 
     break; 

     case KeyPress: 
      { 
       int key = XLookupKeysym(&xev.xkey, 0); 
       if (key == XK_Escape) 
       { 
        glXMakeCurrent(dpy, None, NULL); 
        glXDestroyContext(dpy, glc); 
        XDestroyWindow(dpy, win); 
        XCloseDisplay(dpy); 

        running = false; 
        return 0; 
       } 
       else 
       { 
        input->setKey(key, true); 
       } 
      } 
      break; 

     case KeyRelease: 
      { 
       unsigned short is_retriggered = 0; 

       if (XEventsQueued(dpy, QueuedAfterReading)) 
       { 
        XEvent nev; 
        XPeekEvent(dpy, &nev); 

        if (nev.type == KeyPress && nev.xkey.time 
          == xev.xkey.time && nev.xkey.keycode 
          == xev.xkey.keycode) 
        { 
         // delete retriggered KeyPress event 
         XNextEvent(dpy, &xev); 
         is_retriggered = 1; 
        } 
       } 

       if (!is_retriggered) 
        input->setKey(XLookupKeysym(&xev.xkey, 0), false); 
      } 
      break; 
    } 

但我只得到重新觸發的重要發佈事件,這是我不想要的。 (即使發佈/重新發佈會有相同的結果,但將來可能會出現問題) 當我物理釋放密鑰時,沒有事件被捕獲。

哦,和輸入 - > setkey的()基本設置在一個std一個布爾爲true(或false)::地圖,沒有什麼特別的

+0

您是否在應用程序中正確註冊了所需的事件(如果您使用的是XI2,則爲「XISelectEvents」)? – j4x 2011-03-11 20:41:47

+0

修復它,謝謝:) – Brammie 2011-03-11 22:53:38

回答

1

註冊的KeyReleaseMask解決了這個問題。

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);