是否有一个好的库可用于从鼠标/键盘/操纵杆收集Linux中的用户输入,而不会强制您创建可见的窗口呢? SDL可让您以合理的方式获取用户输入,但似乎会迫使您创建一个窗口,如果您已抽象了控件,那么这将很麻烦,因此控制计算机不必与渲染计算机相同。但是,如果控制机器和渲染机器相同,则这将导致显示器顶部的SDL窗口很小。

编辑以澄清:
渲染器有一个输出窗口,在正常使用情况下,该窗口是全屏的,除非它们都在同一台计算机上运行,​​所以可以给 Controller 以焦点。实际上可能有多个渲染器在全部由同一 Controller 控制的不同计算机上显示相同数据的不同 View ,因此输入与输出完全脱钩(充分利用内置的X11客户端/服务器内容来减少显示次数)同样,一个渲染器也可以有多个 Controller 应用程序。 Controller 和渲染器之间的通信是通过套接字进行的。

最佳答案

好的,如果您使用的是X11,并且想要获取kbd,则需要进行抓取。
如果您不是,那么我唯一的好答案是来自终端的ncurses。

这是您从键盘上抓取所有东西并再次释放的方法:

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

/* Markdown 的怪异格式如下。啊! */
#include <X11/Xlib.h>
int main(int argc,char ** argv)
{
显示* dpy;
XEvent ev;
字符* s;
unsigned int kc;
int quit = 0;

如果(NULL ==(dpy = XOpenDisplay(NULL))){
perror(argv [0]);
导出(1);
}

/*
*您可能希望将指针扭曲到您知道的某个地方
*与会消耗事件的任何东西都不相关。
*(void)XWarpPointer(dpy,None,DefaultRootWindow(dpy),0,0,0,0,x,y);
*/

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

printf(“键盘已抓取!按'q'退出!\n“
“如果此工作被杀死或被卡住,请使用Ctrl-Alt-F1\n”
“切换到控制台(如果可能)并运行某些\n”
“取消键盘操作。\n”);

/*一个非常简单的事件循环:从“man XEvent”开始以获取更多信息。 */
/*另请参阅“apropos XGrab”以了解各种锁定访问权限的方法
*某些类型的信息。从服务器出来或进入服务器*/
为(;!quit;){
XNextEvent(dpy,&ev);
开关(ev.type){
案例KeyPress:
kc =(((XKeyPressedEvent *)&ev)->键码;
s = XKeysymToString(XKeycodeToKeysym(dpy,kc,0));
/* s为NULL或静态的非接触式返回字符串。 */
如果(s)printf(“KEY:%s\n”,s);
如果(!strcmp(s,“q”))quit =〜0;
打破;
案例揭露:
/*通常,最好将残留的暴露物排放到
*避免访问Blinky的娱乐俱乐部。 */
while(XCheckTypedEvent(dpy,Expose,&ev))/*空的主体*/;
打破;
案例ButtonPress:
case ButtonRelease:
案例KeyRelease:
案例MotionNotify:
案例ConfigureNotify:
默认:
打破;
}
}

XUngrabKeyboard(dpy,CurrentTime);

如果(XCloseDisplay(dpy)){
perror(argv [0]);
导出(1);
}

返回0;
}

从终端运行此命令,所有kbd事件都应命中它。我正在Xorg下测试
但是它使用了古老而稳定的Xlib机制。

希望这可以帮助。

谨慎对待X下的抢夺。当您不熟悉它们时,有时会很不错
启动一个延时过程的想法,当您
测试代码,让它每两分钟就可以坐着运行并取消锁定。
它节省了必须杀死服务器或从服务器切换到外部重置状态的麻烦。

在这里,我将留给您决定如何多路复用渲染。读
XGrabKeyboard文档和XEvent文档入门。
如果您在屏幕角落露出小窗户,则可能会卡纸
将指针放到一个角以选择一个 Controller 。 XWarpPointer可以
从代码中也将指针推向其中之一。

还有一点:您还可以获取指针和其他资源。如果您坐在前面的盒子上运行着一个 Controller ,则可以使用键盘和鼠标输入在带有不同渲染器的开放式 socket 之间切换。使用这种方法,您不再需要将输出窗口的大小调整为小于全屏大小。通过做更多的工作,您实际上可以使用SHAPE和COMPOSITE扩展名将Alpha混合的叠加放置在顶部,以响应用户输入获得不错的叠加功能(这可能算作百合的烫金)。

09-04 17:57