2012-02-08 17 views
5

Próbuję obecnie rozwiązać problem, który wystąpił w programie "matchbox-keyboard" (http://matchbox-project.org/), i mam nadzieję dla jakiejś pomocy. matchbox-keyboard jest klawiaturą ekranową, z której aktualnie korzystam w kiosku z ekranem dotykowym, aby umożliwić użytkownikom wprowadzanie podstawowych danych do wyszukiwania itp. Może być trochę stary, ale mimo to jest idealny do mojej aplikacji, ponieważ jest Klawiatura "na żądanie" (tzn. pojawia się tylko wtedy, gdy jest potrzebna), lekka i działa dobrze z menedżerem okien-matchbox, którego używam na urządzeniu. Jednak jedna z witryn, które musi odwiedzić kiosk, wymaga od użytkownika czasowego zalogowania się i z jakiegoś powodu klawiatura ekranowa znika, gdy użytkownik kliknie w polu hasła.Wykrywanie przy wpisywaniu pola hasła

Witryny, którą użytkownicy muszą odwiedzać, nie mogą być zmienione, więc postanowiłem spróbować zaadoptować klawiaturę matchbox, aby zmienić to zachowanie. W tym celu mam prześledzić problem z powrotem do niestandardowego Atom zdefiniowanego w kodzie, co następuje

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); 
} 

tego atomu jest następnie sprawdzane w Xevents, a następnie dane z xevent (xevent->xclient.data.l[0]) są używane do określenia, w jakim stanie umieścić klawiaturę. Rzeczą, której nie mogę zrozumieć jest to, jak wyświetlacz X wie, kiedy Xevent ma być typem "_MB_IM_INVOKER_COMMAND" i jak faktycznie ustawia wartość danych. W szczególności, jak/dlaczego ustawia wartość xevent->xclient.data.l[0] na 2 (MBKeyboardRemoteHide) po wprowadzeniu pola hasła.

Próbowałem szorowania kod odniesienia do najważniejszych obiektów wymienionych tutaj, a także czytania na xlib wydarzenia z przewodnikiem tutaj: http://tronche.com/gui/x/xlib/events/ i poszukiwania odpowiedzi na google, ale szczerze mówiąc to tylko nieco ponad moje głowa, a ja nie jestem w stanie opanować problemu. W tym momencie minął już od konieczności mojego projektu kioskowego i stał się bardziej ciekawostką z mojej strony (i czymś, co doprowadzi mnie do szału, dopóki się tego nie dowiem), więc jeśli ktoś mógłby mi pomóc uzyskać odpowiedzi, byłbym najbardziej wdzięczny.

========== Aktualizacja ==========

Dalsze badania/informacje:

problem nie wydaje się być realizacja przeglądarka specyficzny, jak Wypróbowałem wybraną stronę internetową, a także podstawową stronę testową HTML, która zawiera tylko pole tekstowe i hasło, w przeglądarce gecko (Firefox), a także w przeglądarce internetowej (Midori) iw obu przeglądarkach, na obu stronach, zachowanie było takie samo. Oto strona HTML test na odniesienie:

<head> 
</head> 
<body> 
    <form> 
    Name: <input type="text" name="firstname"><br> 
    PW: <input type="password" name="lastname"> 
    </form> 
</body> 
</html> 

Wydaje mi się, że pole hasło jest celowo odrzucając ostrość z jakiegoś powodu, przez kliknięcie pola bezpośrednio powoduje gtk-im metoda ostrości się nazywać . Podejrzewam, że jest to prawdopodobnie część implementacji GTK, prawdopodobnie związana z aktem, że pola hasła są zazwyczaj "ukryte". Być może robi się to, aby schowek na żądanie nie przechowywał haseł lub czegoś podobnego?

Podczas przeglądania listy zdarzeń/danych debugowania po kliknięciu pola hasła i pola tekstowego lista odebranych zdarzeń dla każdego typu pola jest bardzo podobna. Wiele wydarzeń jest tego samego typu, ale istnieje kilka różnic między nimi, które wciąż próbuję odkodować.Znam liczby zdarzeń są przeważnie bez znaczenia w tym kontekście, ale dla przykładu, oto różne listy zdarzeń na polu zakaz Hasło:

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 

i na polu Hasło:

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 

niestety jest to najlepiej, że moje informacje są w tej chwili, ponieważ moje umiejętności C są dość zardzewiałe.

Odpowiedz

4

Klawiatura typu matchbox instaluje metodę wprowadzania GTK (patrz katalog gtk-im). Jest odpowiedzialny za wysłanie wiadomości na klawiaturę.

Obecnie wysyła polecenie MBKeyboardRemoteHide gdy metoda wprowadzania dowiaduje się, że ostrość jest usuwany (patrz gtk-IM/IM-context.c).

Obsługa to tylko ClientMessage, która umożliwia klientom komunikację między sobą za pomocą własnego "protokołu".

Nie mogę wyjaśnić, dlaczego po kliknięciu w pole hasła nie zostanie wywołany fokus vinfo. Może to być częścią implementacji przeglądarki lub problemu o numerze GtkIMContext.

+0

Problem nie jest związany z implementacją przeglądarki, ponieważ próbowałem żądanej witryny, a także podstawową stroną testową HTML, która zawiera tylko pole tekstowe i hasło, w przeglądarce gecko (Firefox), a także przeglądarka webkit (Midori), a w obu przeglądarkach, na obu stronach, zachowanie było takie samo. Edytowanie mojego pytania w celu dodania dalszych informacji. – Andrew

Powiązane problemy