[英]How to route X11 Keyboard events into stdin like ghostscript does?
我正在尝试编写ghostscript的副本,但我不知道它们是如何制作的,因此您可以在图形窗口中键入内容,并且击键会显示在终端窗口中,就像您在此处键入它们一样。 因此,在收到KeyRelease事件后,可以将char装入stdin以便以普通文件读取代码读取吗? 还是我必须在stdin前面建立自己的内部缓冲区,以便可以将新字符破解? 或者,这是将键盘事件从应用程序窗口映射到Xterm的一种简单方法吗?
我愿意做这项工作,但我什至不知道我在这里寻找什么。 救命?!!
我不认为gs会这样做(至少在Linux上如此)。
我尝试将它从SSH会话运行到Linux机器,并将焦点切换到X11窗口,该窗口随渲染的图像(老虎)一起弹出,并且我在那按的键没有转到远程主机上的应用程序。
strace的(结尾)显示GS正在等待stdin-fd = 0的读取
read(3, " } if\n psuserparams readonly p"..., 4096) = 3258 brk(0x1124000) = 0x1124000 read(3, "", 4096) = 0 close(3) = 0 munmap(0x7f8ccaee5000, 4096) = 0 poll([{fd=4, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=4, revents=POLLOUT}]) writev(4, [{"+\2\1\0", 4}, {NULL, 0}, {"", 0}], 3) = 4 poll([{fd=4, events=POLLIN}], 1, -1) = 1 ([{fd=4, revents=POLLIN}]) read(4, "\1\1'\0\0\0\0\0\1\0\200\0\0\0\0\0\1\0\0\0\264\2\0\0008\0A\2\4\0\0\0", 4096) = 32 read(4, 0xc9bd54, 4096) = -1 EAGAIN (Resource temporarily unavailable) fstat(1, {st_mode=S_IFREG|0644, st_size=143204, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8ccaee5000 write(1, "GS>", 3GS>) = 3 read(0, ...unfinished ...
为了使按键(Ctrl-C)生效,我必须将焦点切换回ssh窗口。 当焦点是图像X11窗口时,我尝试了“退出”以及ctrl-C。
我不知道答案,但是我知道找到答案的方法。 在strace
下运行ghostscript并观察其作用。 与尝试阅读源代码相比,这通常要容易得多且提供更多信息。
尤里卡!
在文件gdevxini.c中
435 wm_hints.flags = InputHint;
436 wm_hints.input = False;
437 XSetWMHints(xdev->dpy, xdev->win, &wm_hints); /* avoid input focus */
编辑:现在我知道它看起来像什么,我可以找到一些文档:
输入成员用于将应用程序使用的输入焦点模型传达给窗口管理器。...从不期望任何键盘输入的应用程序...应将此成员设置为
False
。 --X Window系统:C库和协议参考,第282页
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.