Linux / X11input库,无需创build窗口

是否有一个很好的库,用于从鼠标/键盘/游戏杆收集在Linux的用户input,不强制你创build一个可见的窗口来做到这一点? SDL让你以合理的方式获得用户input,但是似乎强迫你创build一个窗口,如果你已经抽象了控制,那么控制机器就不必和渲染机器一样。 但是,如果控件和渲染机器是相同的,则会在显示器上形成一个丑陋的小SDL窗口。

编辑说明
渲染器有一个输出窗口,在正常使用情况下,该窗口是全屏幕,除非它们都在同一台计算机上运行,​​只是这样才有可能给控制器提供焦点。 实际上可以有多个渲染器在不同的计算机上显示不同的视图,这些视图都是由同一个控制器控制的,因此输出和输出的总的解耦(利用内置的X11客户/服务器的东西来显示更less可用)另外,一个渲染器的多个控制器应用程序也是可能的。 控制器和渲染器之间的通信是通过套接字进行的。

好的,如果你在X11下,你想得到kbd,你需要做一个抓取。 如果你不是,我唯一的好的答案就是从终端来的。

以下是您如何从键盘抓取所有内容,然后再次释放:

 / *演示代码,需要更多的错误检查,编译
  *用“gcc nameofthisfile.c -lX11”。

 / *降价奇怪的格式如下。 哎呀!  * /

#include <X11/Xlib.h>

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

    if(NULL ==(dpy = XOpenDisplay(NULL))){
       PERROR(argv的[0]);
      出口(1);
    }

    / *
     *你可能想把指针转到你知道的地方
     *与任何会排除事件的东西都没有关联。
     *(void)XWarpPointer(dpy,None,DefaultRootWindow(dpy),0,0,0,x,y);
     * /

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

    printf(“KEYBOARD GRABBED!命中'q'退出!\ n”
           “如果这个工作被打死或者你被卡住,使用Ctrl-Alt-F1 \ n”
           “切换到控制台(如果可能)并运行\ n”
           “ungrabs键盘。\ n”);


    / *一个非常简单的事件循环:从“man XEvent”开始获取更多信息。  * /
    / *另请参阅“apropos XGrab”以各种方式锁定访问权限
     *某些类型的信息。 走出或进入服务器* /
    for(;!quit;){
       XNextEvent(dpy,&ev);
      开关(ev.type){
         案例KeyPress:
             kc =((XKeyPressedEvent *)&ev) - > keycode;
             s = XKeysymToString(XKeycodeToKeysym(dpy,kc,0));
             / * s是NULL或一个静态的不返回字符串。  * /
             if(s)printf(“KEY:%s \ n”,s);
            如果(!strcmp(s,“q”))quit =〜0;
            打破;
         案例公开:
                / *通常,将剩余暴露量排除在外是个好主意
                 *避免访问Blinky的乐趣俱乐部。  * /
                while(XCheckTypedEvent(dpy,Expose,&ev))/ * empty body * /;
            打破;
         情况ButtonPress:
         案例ButtonRelease:
         案例KeyRelease:
          case MotionNotify:
         情况ConfigureNotify:
         默认:
            打破;
       }
    }

    XUngrabKeyboard(dpy,CurrentTime);

    if(XCloseDisplay(dpy)){
       PERROR(argv的[0]);
      出口(1);
    }

   返回0;
 }

从终端运行这个,所有的kbd事件应该打它。 我在Xorg下测试它,但是它使用了古老而稳定的Xlib机制。

希望这可以帮助。

注意X下的抓取。当你对他们不熟悉的时候,有时候开始一个时间延迟的过程是一个不错的主意,当你测试代码的时候,会让你的服务器脱钩,让它每隔几分钟就坐下来运行一次。 它节省了不必要的消耗或从服务器切换到外部复位状态。

从这里,我将留给你决定如何复用渲染。 阅读XGrabKeyboard文档和XEvent文档以开始。 如果在屏幕角落处有小窗户,则可以将指针卡入一个角落以选择一个控制器。 XWarpPointer可以将指针指向其中的一个以及代码。

还有一点:你可以抓住指针以及其他资源。 如果您坐在前面的盒子上有一个控制器运行,则可以使用键盘和鼠标输入在具有不同渲染器的开放套接字之间切换。 用这种方法,你不需要重新调整输出窗口的大小。 通过更多的工作,您可以使用SHAPE和COMPOSITE扩展实际上将alpha混合叠加放在顶部,以响应用户输入(可能被视为镀金百合),获得不错的叠加功能。

对于鼠标,您可以使用GPM 。

我不确定我的头顶是键盘还是操纵杆。

如果需要,直接从/dev文件中读取可能不会太糟糕。

希望能帮助到你