Как обнаружить при вводе поля пароля - PullRequest
5 голосов
/ 09 февраля 2012

В настоящее время я пытаюсь отладить проблему, с которой я столкнулся в программе 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

К сожалению, это лучшее, что получает моя информация на данный момент, так как мои навыки С довольно ржавые.

1 Ответ

4 голосов
/ 10 февраля 2012

matchbox-keyboard устанавливает метод ввода GTK (см. Каталог gtk-im). Это ответственно за отправку сообщения на клавиатуру.

В настоящее время она отправляет эту команду MBKeyboardRemoteHide, когда методу ввода сообщается, что фокус удален (см. Gtk-im / im-context.c).

С точки зрения обработки XEvent это просто ClientMessage, который позволяет клиентам общаться между собой, используя свой собственный "протокол".

Я не могу объяснить, почему, когда вы щелкаете в поле пароля, вы не вызываете focus_in vfunc. Это может быть частью реализации браузера или проблемой GtkIMContext.

...