繁体   English   中英

如何将X11键盘事件像ghostscript一样路由到stdin中?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM