Как направить события клавиатуры X11 в стандартный ввод, как это делает ghostscript? - PullRequest
1 голос
/ 25 июня 2011

Я пытаюсь написать клон ghostscript, и я не могу понять, как они это делают, чтобы вы могли печатать в графическом окне, и нажатия клавиш отображаются в окне терминала, как если бы вы набирали их там начать с. Итак, получив событие KeyRelease, могу ли я как-нибудь вставить символ в стандартный ввод, чтобы его можно было прочитать с помощью обычного кода для чтения файлов? Или я должен сделать свой собственный внутренний буфер перед стандартным вводом, чтобы я мог взломать в него новые символы? Или это какой-то простой способ отобразить события клавиатуры из окна моего приложения в Xterm?

Я готов сделать работу, но я даже не знаю, что я здесь ищу. Помощь? !!

Ответы [ 3 ]

3 голосов
/ 26 июня 2011

Я не думаю, что GS делает это (по крайней мере, на Linux).

Я попытался запустить его на моем linux box из сеанса SSH и переключил фокус на окна 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 ...

Мне пришлось переключить фокус обратно в окно ssh, чтобы нажатие клавиши (Ctrl-C) вступило в силу. Я пробовал "выйти" так же, как и Ctrl-C, когда в фокусе было окно X11 изображения.

2 голосов
/ 10 октября 2011

Эврика!

в файле 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 System: Справочник по библиотекам и протоколам C, с.282

2 голосов
/ 25 июня 2011

Я не знаю ответа, но я знаю, как его найти. Запустите ghostscript под strace и посмотрите, что он делает. Обычно это намного проще и информативнее, чем пытаться читать исходники.

...