В моем приложении Xlib мне нужно настроить клавиатуру так, чтобы она фокусировалась на конкретном компоненте, и я хотя бы делал это с XSetInputFocus
. По какой-то причине я всегда получаю ошибку BadMatch
, даже если мое окно видно (и на страницах руководства говорится, что причиной этой ошибки является окно, которое не отображается / не отображается). Когда я говорю, что он видим, я имею в виду, что вижу его на экране и знаю, что список запросов уже очищен.
Итак, вместо того, чтобы делиться своим огромным кодом, я нашел в интернете небольшую демонстрацию и попытался ее изменить. Я взял код обработки событий в Xlib, как показано в примере учебного пособия по Xlib , которое я нашел. Я попытался добавить следующую строку:
XSetInputFocus (display, win, RevertToNone, CurrentTime);
Прямо перед строкой
/* perform an events loop */
Я получил ошибку:
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 42 (X_SetInputFocus)
Serial number of failed request: 12
Current serial number in output stream: 12
Это точно такая же ошибка, которую я получил в своем приложении с точно такой же последовательностью событий:
- Создайте окно с
XCreateSimpleWindow
(которое должно быть InputOutput
окном)
- Используйте
XSelectInput
и выберите в маске, чтобы также получить KeyPressMask
)
- Карта окна (
XMapWindow
)
- Запросить фокусировку, используя
XSetInputFocus
, используя либо RevertToNone
, либо RevertToParent
(оба сбоя)
Я подозреваю, что это связано с тем, что мне нужно обрабатывать события создания окна, используя XNextEvent
, пока я не закончу обрабатывать переопределение окна, но в этом случае я не знаю, когда я должен ждать (какие события я должен получить, прежде чем пытаться это?). В настоящее время я делаю это перед первым вызовом XNextEvent
в моей программе.
Любая помощь будет высоко оценена. Заранее спасибо!