Пересылка ключевых событий ncurses в окно X11

Пользовательский интерфейс моего приложения состоит из двух окон: консоли (обрабатывается ncurses) и окно X11 для графики. Я хотел бы обрабатывать ключевые события централизованно. То есть, независимо от того, какое из двух окон активно, один и тот же цикл обработки событий должен обрабатывать все ключевые события. У меня уже есть цикл событий для событий X11. Осталось только переслать все события консоли в окно X11.

Основной строительный блок для достижения этой пересылки найден Вот. Единственное, что мне нужно, это уметь переводить из значения, возвращенного getch() до X11 keycode, Примерно после четырех часов поиска в Интернете, я нашел этот код, который является частью QEMU. Тем не менее, когда я сравниваю отображение, оно дает с выводом xev, два не совпадают. Например, для Home ключ, xev дает 110, а упомянутое отображение дает 71 | 0x0100, то есть 327. Это два разных вида keycodes? Что мне не хватает?

0

Решение

Хм, смешивание структур приложений, почти по определению, сложно.

Я думаю, что лучший способ достичь того, чего вы хотите, — это иметь два отдельных процесса или потока: один для консоли, а другой для приложения X11. В каждом у вас будет соответствующий обработчик цикла событий. Чтобы объединить их вместе, используйте канал IPC, либо канал, либо сокет. Вы должны иметь возможность сделать сокет / канал входом для обработчика цикла событий X11 с его собственным обратным вызовом. Вы можете иметь select () на стороне консоли, ожидающей сокета или STDIN; это позволяет вам вызывать getch (), когда готово нажатие клавиши или чтение из сокета, когда X11 отправил что-то через сокет. Если вы использовали что-то вроде ZeroMQ вместо сокета, даже лучше.

Итак, что бы вы отправили через сокет? Вам нужно будет определить свою собственную структуру событий для передачи между консолью и приложением X11. Каждая сторона будет заполнять и отправлять одну из них, когда ей нужно что-то отправить другой. Типы событий, которые вам нужно описать, включают в себя такие вещи, как выход, нажатие клавиши (+ данные нажатия клавиши) и т. Д.

Скорее всего, вы бы устроили конец X11 так, чтобы обратный вызов чтения сокета считывал структуру из сокета, интерпретировал ее и решал, какой обратный вызов должен быть вызван напрямую. Если ваши нажатия клавиш предназначены только для выбора пунктов меню, кнопок и т. Д., Это может быть неплохим (но не блестящим) способом избежать проблемы отображения.

Это означает наличие двух обработчиков цикла событий, сокета и двух процессов / потоков. Но это позволяет избежать смешения двух в одну вещь. Это также означает, что ваша консоль может быть на совершенно другой машине! Если бы вы использовали zeromq, вы могли бы легко подключить несколько приложений к приложению X11 в конфигурации PUSH / PULL; возможно абсурдно, но возможно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]