X11: фокус ввода для всплывающих окон
Для развлечения и самообразования я занимаюсь написанием собственного инструментария X11. Вот что меня озадачивает.
У меня есть традиционный элемент отображения поля со списком,типичное поле со списком с выпадающим всплывающим списком, как и у всех популярных инструментов.
Для выпадающего всплывающего списка я создаю новое окно, дочернее по отношению к корневому окну, расположенное соответствующим образом под основным элементом отображения поля со списком.
Выпадающий всплывающий список-это окно в своем собственном полном праве, это реализует клавиатурную навигацию, чтобы выбрать отдельные записи в выпадающем списке.
Итак, я использую SetInputFocus, чтобы установить фокус ввода на всплывающее окно после его открытия.
Я нахожу, что когда я делаю это, оконный менеджер затем перерисовывает рамку главного окна, чтобы указать, что он больше не имеет фокуса ввода. Что технически верно, но я не вижу тех же результатов с более распространенными наборами инструментов, где в сопоставимой ситуации рамка главного окна показывает, что он все еще имеет фокус ввода.
Для всплывающего окна, в дополнение к настройке переопределения-перенаправления, я также делаю все, что могу придумать, чтобы сообщить оконному менеджеру, что происходит: устанавливаю идентификатор лидера группы окон в WM_HINTS всплывающего окна, устанавливаю WM_TRANSIENT_FOR и устанавливаю _NET_WM_WINDOW_TYPE в _NET_WM_WINDOW_TYPE_COMBO; ничего из этого, кажется, не работает (я проверил, что свойства заданы приблизительно, через xprop).
Похоже, что я должен сохранить ввод сфокусируйтесь в окне со списком и переадресуйте события нажатия клавиш и keyrelease на элементы отображения в раскрывающемся всплывающем окне, которое кажется неуклюжим. Может быть, я упускаю какое-то свойство, которое сообщит оконному менеджеру, что фокус ввода всплывающего окна связан с фокусом главного окна (кроме тех, о которых я упоминал), что будет держать рамку главного окна нарисованной, чтобы показать, что у него есть фокус ввода, когда фокус ввода на самом деле находится во всплывающем окне?
1 ответ:
Большинство X11 переопределяют-перенаправляют эксклюзивные всплывающие окна (меню, поля со списком,...) захватите клавиатуру и / или указатель с помощью пассивного или активного захвата.
См.
XGrabKey
,XGrabKeyboard
,XGrabButton
,XGrabPointer
в руководстве по программированию X11.Или, может быть, нет, потому что в руководстве совершенно непонятно, что это за функции и как их можно использовать. Поищите в интернете примеры использования, возможно, в других библиотеках виджетов. К сожалению, я не знаю простого информативного примера экспромтом.
Вовсе не обязательно вызывать
XSetInputFocus
, потому что все события клавиатуры и/или указателя сообщаются захватывающим клиентам.