2012-02-08 14 views
5

Actualmente estoy tratando de solucionar un problema que he estado experimentando con el programa 'matchbox-keyboard' (http://matchbox-project.org/), y estoy esperando para algo de asistencia. matchbox-keyboard es un teclado en pantalla que estoy usando actualmente en un kiosco con pantalla táctil para permitir a los usuarios ingresar información básica para hacer búsquedas, etc. Puede que sea un poco viejo, pero no obstante es ideal para mi aplicación porque es una Teclado 'bajo demanda' (es decir, solo aparece cuando es necesario), liviano y funciona bien con el gestor de ventana de caja de cerillas, que estoy usando en el dispositivo. Sin embargo, uno de los sitios que el kiosco debe visitar requiere que el usuario inicie sesión temporalmente y, por alguna razón, el teclado en pantalla desaparece cada vez que el usuario hace clic en el campo de contraseña.Cómo detectar al ingresar un campo de contraseña

El sitio que los usuarios deben visitar no se puede cambiar, así que me decidí a probar y aplicar parches al teclado de caja de fósforos para cambiar este comportamiento. Con ese fin, he rastreado la cuestión a un átomo personalizado definido en el código, de la siguiente manera

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

este átomo luego se verifica en Xevents, y luego se utilizan los datos del xevent (xevent->xclient.data.l[0]) para determinar en qué estado colocar el teclado. Lo que no puedo entender es cómo sabe la pantalla X cuando se supone que Xevent debe ser un tipo '_MB_IM_INVOKER_COMMAND', y cómo realmente establece el valor de los datos. Específicamente, cómo/por qué establece el valor de xevent->xclient.data.l[0] en 2 (MBKeyboardRemoteHide) cuando ingreso un campo de contraseña.

He intentado buscar en el código las referencias a los objetos críticos mencionados aquí, así como leer eventos Xlib de la guía aquí: http://tronche.com/gui/x/xlib/events/, y buscar respuestas en google, pero sinceramente esto es solo un poco más de mi cabeza, y no puedo entender el problema. En este momento ha pasado de ser una necesidad para mi proyecto de quiosco y se ha convertido en una curiosidad más de mi parte (y algo que me volverá loco hasta que lo descubra), así que si alguien puede ayudarme a obtener algunas respuestas, estaría muy agradecido.

actualización ========== ==========

La prueba adicional/información:

el problema no parece ser la aplicación de navegador específico, como se Probé mi sitio web deseado, así como una página HTML de prueba básica que tiene solo un campo de texto y contraseña, en un navegador gecko (Firefox), así como un navegador webkit (Midori), y en ambos navegadores, en ambas páginas, el comportamiento fue el mismo. Aquí está la página HTML de prueba de referencia:

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

Me parece que el campo de contraseña, está rechazando intencionadamente enfoque por algún motivo, por el cual clic en el campo provoca directamente la GTK-im método de enfoque de salida que se llama . Mi sospecha es que es probablemente una parte de la implementación de GTK, posiblemente relacionada con el hecho de que los campos de contraseña suelen estar "ocultos". Quizás esto se hace para evitar que el portapapeles bajo demanda almacene contraseñas o algo por el estilo.

Al examinar la lista de eventos/salida de depuración al hacer clic en el campo de contraseña y en el campo de texto, la lista de eventos recibidos para cada tipo de campo es muy similar. Muchos de los eventos son del mismo tipo, pero hay algunas diferencias entre ellos que aún estoy intentando descifrar.Sé que los números de evento son en su mayoría sin sentido en este contexto, pero por ejemplo, esto es las diferentes listas de eventos para el campo no contraseña:

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 

y para el campo de contraseña:

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 

Por desgracia, esta es la lo mejor es mi información en este momento, ya que mis habilidades C están bastante oxidadas.

Respuesta

4

matchbox-keyboard instala un método de entrada GTK (consulte el directorio gtk-im). Este es el responsable de enviar el mensaje al teclado.

En este momento se envía este comando MBKeyboardRemoteHide cuando se informa al método de entrada que se quitó el enfoque (consulte gtk-im/im-context.c).

En términos de XEvent manejando esto es solo un ClientMessage que permite a los clientes comunicarse entre ellos usando su propio "protocolo".

Lo que no puedo explicar es por qué cuando se hace clic en el campo de la contraseña no se llama al focus_in vfunc. Esto podría ser parte de la implementación del navegador o un problema GtkIMContext.

+0

el problema no parece ser específico de la implementación del navegador, ya que probé el sitio web deseado, así como una página HTML de prueba básica que solo tiene un campo de texto y contraseña, en un navegador gecko (Firefox), así como navegador webkit (Midori), y en ambos navegadores, en ambas páginas, el comportamiento fue el mismo. Editando mi pregunta para incluir más información. – Andrew

Cuestiones relacionadas