题
是否有一个良好图书馆使用,用于收集用户输入在Linux从鼠/键盘操纵杆,不强迫你去创建一个可见的窗口来这样做吗?SDL可以让你得到用户输入合理的方式,但似乎力创建一个窗口,这是很麻烦,如果你有抽象的控制,使控制机的不同呈现的机器。但是,如果控制和呈现的机器都是相同的,这种结果在一个丑陋的小SDL窗口上显示。
编辑要澄清:
渲染具有一个输出窗口,在其正常使用的情况下,这一窗口的完整的画面,除非他们都是在相同的计算机上运行,只要它能够得到控制器的焦点。有可能实际上是多呈示器显示不同的看法相同的数据不同的计算机上的所有控制,由相同的控制器,因此,总分离的输入输出(使利用建立在X11客户/服务器的东西对于显示少可用的)此外,多种控制应用程序的一个渲染也是可能的。之间的通信的控制器和渲染是通过插座。
解决方案
好吧,如果你在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; }
跑这来自一个终端和所有大骨节病的活动应该打。我测试这下你 但是它使用古老的、稳定的Xlib机制。
希望这会有所帮助。
小心抓住下X.当你新到他们,有时候这是一个很好的 思想开始的时间延迟的过程,这将ungrab服务器时,你在 测试代码,让它坐下运行,并ungrab每隔几分钟。它存有杀或离开服务器的外部重置状态。
从这里,我将它留给你来决定如何复renderes.阅读 该XGrabKeyboard文档和XEvent docs开始。如果你有小窗户暴露在屏幕的角落,你可以堵塞 指针到一个角落里选择一个控制器。XWarpPointer可以 把指针指向他们中的一个,以及从代码。
多一点:你可以抓住的指针,以及,其他资源。如果你有一个控制器上运行框前,你坐,你可以使用鼠标和键盘输入到开关之间开座不同的呈示器。你不应该需要调整产出窗口低于全屏幕上了这种方法,永远。有更多的工作,你其实可以降alpha-混复盖上使用形状及复合材料的扩展得到一个不错的复盖功能响应用户输入(可能数为镀金的百合).
其他提示