Как определить при вводе поля пароля

В настоящее время я пытаюсь отладить проблему, с которой я столкнулся, с программой 'matchbox-keyboard' (http://matchbox-project.org/), и я Надеюсь на помощь. matchbox-keyboard - это экранная клавиатура, которую я в настоящее время использую в киоске с сенсорным экраном, чтобы пользователи могли вводить базовый ввод для выполнения поиска и т. д. Она может быть немного старой, но, тем не менее, идеально подходит для моего приложения, потому что это Клавиатура «по требованию» (т.е. появляется только при необходимости), легкая и хорошо работает с оконным менеджером спичечных коробок, который я использую на устройстве. Однако один из сайтов, который должен посетить киоск, требует от пользователя временного входа в систему, и по какой-то причине экранная клавиатура исчезает всякий раз, когда пользователь щелкает поле пароля.

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

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 display знает, когда Xevent должен быть типом _MB_IM_INVOKER_COMMAND, и как он фактически устанавливает значение данных. В частности, как / почему он устанавливает значение xevent-> xclient.data.l [0] равным 2 ( MBKeyboardRemoteHide ), когда я ввожу поле пароля.

Я попытался просмотреть код на предмет ссылок на упомянутые здесь критические объекты, а также почитать о событиях Xlib из руководства здесь: http://tronche.com/gui/x/xlib/events/ и поиск ответов в Google, но, честно говоря, это просто немного выше моей головы, и я не могу понять эту проблему. На данный момент он перестал быть необходимостью для моего проекта киоска и стал с моей стороны все более любопытным (и чем-то, что сводит меня с ума, пока я не выясню это), поэтому, если бы кто-нибудь мог помочь мне получить некоторые ответы, я был бы самый благодарный.

========== Обновление ==========

Дальнейшее тестирование / информация:

проблема, похоже, не связана с реализацией браузера, поскольку я пробовал желаемый веб-сайт, а также базовая тестовая HTML-страница, которая имеет только текстовое поле и поле пароля, в браузере gecko (Firefox), а также в браузере webkit (Midori), и в обоих браузерах на обеих страницах поведение было то же.Вот тестовая HTML-страница для справки:




    
Name:
PW:

Мне кажется, что поле пароля намеренно отклоняет фокус по какой-то причине, в результате чего щелчок по полю вызывает непосредственный вызов метода gtk-im focus-out. Я подозреваю, что это, вероятно, часть реализации 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

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

5
задан Andrew 20 February 2012 в 22:40
поделиться