В настоящее время я пытаюсь отладить проблему, с которой я столкнулся в программе matchbox-keyboard (http://matchbox -project.org /), и надеюсь на некоторую помощь.matchbox-keyboard - это экранная клавиатура, которую я в настоящее время использую в сенсорном киоске, чтобы позволить пользователям вводить некоторые основные данные для выполнения поиска и т. д. Она может быть немного старой, но, тем не менее, она идеально подходит для моего приложения, потому что онаКлавиатура «по требованию» (т.е. она появляется только при необходимости), легкая и хорошо работает с matchbox-window-manager, который я использую на устройстве.Однако один из сайтов, которые должен посетить киоск, требует от пользователя временного входа в систему, и по какой-то причине экранная клавиатура исчезает всякий раз, когда пользователь нажимает в поле пароля.
Сайт, который должны посетить пользователине может быть изменено, поэтому я решил попробовать заплатить matchbox-клавиатуру, чтобы изменить это поведение.С этой целью я отследил проблему до пользовательского атома, определенного в коде, следующим образом:
typedef enum {
MBKeyboardRemoteNone = 0,
MBKeyboardRemoteShow,
MBKeyboardRemoteHide,
MBKeyboardRemoteToggle,
} MBKeyboardRemoteOperation;
============
void
mb_kbd_remote_init (MBKeyboardUI *ui)
{
Atom_MB_IM_INVOKER_COMMAND = XInternAtom(mb_kbd_ui_x_display(ui),
"_MB_IM_INVOKER_COMMAND", False);
}
Этот атом затем проверяется в Xevents, а затем данные из xevent (xevent->xclient.data.l[0]
) используются для определения, в какое состояние вводить клавиатуру. Что я не могу понять, так это то, как дисплей X узнаеткогда Xevent должен быть типом _MB_IM_INVOKER_COMMAND и как он фактически устанавливает значение данных.В частности, как / почему он устанавливает значение xevent->xclient.data.l[0]
равным 2 (MBKeyboardRemoteHide
), когда я ввожу поле пароля.
Я также пытался найти код для ссылок на упомянутые здесь критические объекты.читая о событиях Xlib из руководства здесь: http://tronche.com/gui/x/xlib/events/, и ища ответы в Google, но, честно говоря, это немного над моей головой, и я не могу разобраться в этом вопросе.На данный момент это перешло от необходимости для моего проекта киоска и стало больше любопытства с моей стороны (и что-то, что сводит меня с ума, пока я не выясню это), так что если кто-нибудь может помочь мне получить некоторые ответы, я был бысамые благодарные.
========== Обновление ==========
Дальнейшее тестирование / информация:
проблемане похоже на конкретную реализацию браузера, так как я попробовал свой желаемый веб-сайт, а также базовую тестовую HTML-страницу, содержащую только поле текста и пароля, в браузере геккона (Firefox), а также браузер веб-набора (Midori)и в обоих браузерах, на обеих страницах поведение было одинаковым.Вот тестовая HTML-страница для справки:
<head>
</head>
<body>
<form>
Name: <input type="text" name="firstname"><br>
PW: <input type="password" name="lastname">
</form>
</body>
</html>
Мне кажется, что поле пароля по какой-то причине намеренно отклоняет фокус, в результате чего щелчок по полю непосредственно приводит к тому, что фокус метода gtk-im становитсяназывается.Я подозреваю, что это, вероятно, часть реализации GTK, возможно, связанная с тем, что поля пароля обычно «скрыты».Возможно, это сделано для того, чтобы в буфере обмена по требованию не хранились пароли или что-то в этом роде?
При просмотре списка событий / отладочных выходных данных щелкните поле пароля и текстовое поле, список полученныхСобытия для каждого типа поля очень похожи.Многие события одного типа, но между ними есть несколько различий, которые я до сих пор пытаюсь декодировать.Я знаю, что в этом контексте номера событий в большинстве случаев не имеют смысла, но для иллюстрации приведем различные списки событий для поля, не являющегося паролем:
matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 1
matchbox-keyboard-ui.c:560,mb_kbd_ui_redraw() mark
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 37748776
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
и для поля пароля:
matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 2
matchbox-keyboard-ui.c:1230,mb_kbd_ui_event_loop() Hide timed out, calling mb_kbd_ui_hide
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35665943
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 39845918
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
К сожалению, это лучшее, что получает моя информация на данный момент, так как мои навыки С довольно ржавые.