2008-09-08 50 views
7

是否有一個很好的庫用於從鼠標/鍵盤/遊戲杆中收集Linux中的用戶輸入,這不會強制您創建可見窗口? SDL可讓您以合理的方式獲得用戶輸入,但似乎強制您創建一個窗口,如果您已抽象控制,那麼控制機器不必與渲染機器相同,這很麻煩。但是,如果控件和渲染機器相同,則會在顯示器上形成一個醜陋的小SDL窗口。沒有創建窗口的Linux/X11輸入庫

編輯要澄清
渲染器有一個輸出窗口,在其正常使用的情況下,該窗口是全屏幕,當他們是在同一臺計算機上運行,​​只是這樣就可以給除控制器重點。實際上,可以有多個渲染器在不同的計算機上顯示不同視圖,這些視圖都是由同一個控制器控制的,因此可以將輸入和輸出徹底解耦(利用內置的X11客戶端/服務器來顯示更少的內容可用)另外,一個渲染器的多個控制器應用程序也是可能的。控制器和渲染器之間的通信是通過套接字進行的。

+0

我刪除了導致上面澄清的「答案」...我認爲澄清需要保留,但它足夠覆蓋我的僞回答,可能是一條評論,可以完全刪除。 – 2008-09-15 16:37:48

回答

7

OK,如果你是X11下,你想要得到的大骨節病,你需要做一個搶。 如果你不是,我唯一的好答案是來自終端的ncurses。

這裏是你如何抓住一切從鍵盤和再次釋放:從終端

 
/* Demo code, needs more error checking, compile 
* with "gcc nameofthisfile.c -lX11". 

/* weird formatting for markdown follows. argh! */ 

#include <X11/Xlib.h>

 
int main(int argc, char **argv) 
{ 
    Display *dpy; 
    XEvent ev; 
    char *s; 
    unsigned int kc; 
    int quit = 0; 

    if (NULL==(dpy=XOpenDisplay(NULL))) { 
     perror(argv[0]); 
     exit(1); 
    } 

    /* 
    * You might want to warp the pointer to somewhere that you know 
    * is not associated with anything that will drain events. 
    * (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y); 
    */ 

    XGrabKeyboard(dpy, DefaultRootWindow(dpy), 
       True, GrabModeAsync, GrabModeAsync, CurrentTime); 

    printf("KEYBOARD GRABBED! Hit 'q' to quit!\n" 
      "If this job is killed or you get stuck, use Ctrl-Alt-F1\n" 
      "to switch to a console (if possible) and run something that\n" 
      "ungrabs the keyboard.\n"); 


    /* A very simple event loop: start at "man XEvent" for more info. */ 
    /* Also see "apropos XGrab" for various ways to lock down access to 
    * certain types of info. coming out of or going into the server */ 
    for (;!quit;) { 
     XNextEvent(dpy, &ev); 
     switch (ev.type) { 
     case KeyPress: 
      kc = ((XKeyPressedEvent*)&ev)->keycode; 
      s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0)); 
      /* s is NULL or a static no-touchy return string. */ 
      if (s) printf("KEY:%s\n", s); 
      if (!strcmp(s, "q")) quit=~0; 
      break; 
     case Expose: 
       /* Often, it's a good idea to drain residual exposes to 
       * avoid visiting Blinky's Fun Club. */ 
       while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ; 
      break; 
     case ButtonPress: 
     case ButtonRelease: 
     case KeyRelease: 
     case MotionNotify: 
     case ConfigureNotify: 
     default: 
      break; 
     } 
    } 

    XUngrabKeyboard(dpy, CurrentTime); 

    if (XCloseDisplay(dpy)) { 
     perror(argv[0]); 
     exit(1); 
    } 

    return 0; 
} 

運行這一點,所有的大骨節病的事件應該打。我在Xorg 下測試它,但它使用了可敬的,穩定的Xlib機制。

希望這會有所幫助。

小心X下抓鬥當你是新來的他們,有時候這是一個好主意 開始時間延遲進程,ungrab服務器,當你 測試代碼,讓它坐和運行,每隔幾分鐘就開始一次。 它可以節省不必要的操作或從服務器切換到外部重置狀態。

從這裏,我將留給你決定如何多路複用renderes。閱讀 XGrabKeyboard文檔和XEvent文檔即可開始使用。 如果您有小窗口暴露在屏幕角落,您可以將指針插入一個角落以選擇控制器。 XWarpPointer可以通過 將指針指向其中的一個以及代碼。

還有一點:你可以抓住指針以及其他資源。如果您有一個控制器在您坐的前面的盒子上運行,您可以使用鍵盤和鼠標輸入在具有不同渲染器的開放套接字之間切換。用這種方法,你不需要再把輸出窗口的大小調整到小於全屏。通過更多的工作,您可以使用SHAPE和COMPOSITE擴展實際上將頂層混合疊加層放在頂層,以響應用戶輸入(這可能被視爲鍍金百合),獲得不錯的疊加功能。

+0

Brian答案由GPM回答我的問題,但我只能選擇1個答案。 – rck 2008-09-12 20:07:44

2

對於鼠標,您可以使用GPM

我不確定我的頭頂是鍵盤還是操縱桿。

如果需要的話,直接從那裏讀取/dev文件可能不會太壞。

希望它可以幫助