2011-06-25 24 views
1

我想写一个ghostscript的克隆,我无法弄清楚它们是如何制作的,所以你可以在图形窗口中输入,并在终端窗口中显示按键,就好像你在那里输入的那样首先。因此,在收到KeyRelease事件后,我是否可以将char填充到标准输入中,以便用正常的文件读取代码读取?或者我必须在stdin前面创建自己的内部缓冲区,这样我才能在其中添加新的字符?还是将键盘事件从我的应用程序窗口映射到Xterm的一些简单方法?如何将X11键盘事件路由到stdin,如ghostscript呢?

我愿意做这项工作,但我甚至不知道我在找什么。帮帮我?!!

+0

是否真正的Ghostscript重定向按键事件,以它自己的'stdin'还是只是赶上按键和处理他们,如果他们从标准输入'来'? –

+1

不确定。我想这是在问之前要做的事情。 :( –

+0

“将它们发送到同一个地方”的方法是我怎么做,试图将东西加入到自己的stdin中,看起来像是一堆毫无意义的繁忙工作。无论如何,很容易被锁定错误的道路,问一个问题是一种快速的方式,让你的眼睛看清楚你的问题,并指出你错过的明显的东西。 –

回答

2

尤里卡!

文件中

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库和协议参考,p.282

2

我不知道答案,但我知道如何找到它。在strace下运行ghostscript并观察它在做什么。这通常比试图阅读源代码更容易和更丰富。

+0

'strace'的确是这项工作的工具。谢谢。 –

3

我不认为gs这样做(至少在linux上)。

我试着从SSH会话运行到我的linux系统,然后把焦点切换到X11窗口,弹出渲染图像(老虎),我按下的按键没有去远程主机上的应用程序。

strace的(的端部)示出了GS等待标准输入 - 与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 ... 

我不得不切换焦点回到SSH窗口,以使按键(按Ctrl - C)生效。当焦点是图像X11窗口时,我尝试过“退出”以及按Ctrl-C。

+0

我的天啊!你是对的!它必须是窗口管理器的一个功能。我猜,使用KDE,由于ghostscript不需要任何输入事件,图形窗口不能接受焦点。通过进入窗口特定的选项,我能够强制接受焦点,并且足够肯定,打字没有效果。谜团已揭开。谢谢! –