Uso de devoluciones de llamada
Las aplicaciones que utilizan métodos de entrada deben proporcionar funciones de devolución de llamada para que el editor de métodos de entrada (IMED) pueda comunicarse con el usuario. El tipo de método de entrada que utiliza determina si las devoluciones de llamada son necesarias. Por ejemplo, el método de entrada de un solo byte no necesita devoluciones de llamada, pero el método de entrada japonés las utiliza habitualmente con el recurso de preedición. La preedición permite el procesamiento de caracteres antes de que se confirmen en la aplicación.
Cuando se utiliza un método de entrada, solo la aplicación puede insertar o suprimir datos de preedición y desplazarse por el texto. Por consiguiente, la aplicación obtiene el eco de las pulsaciones a petición de la lógica del método de entrada mediante devoluciones de llamada.
Cuando se entra una pulsación, la aplicación llama a la subrutina IMFilter. Antes de volver, el método de entrada puede llamar a la función de devolución de llamada de eco para insertar nuevas pulsaciones. Una vez que se haya compuesto un carácter, la subrutina IMFilter lo devuelve y las pulsaciones se suprimen.
En varios casos, la lógica del método de entrada tiene que devolver la llamada al cliente. Cada uno de ellos se define mediante una acción de devolución de llamada. El cliente especifica a qué devolución de llamada se debe llamar para cada acción.
Los tipos de devoluciones de llamada se describen de la siguiente manera:
- Dibujo de texto
El IMED utiliza devoluciones de llamada de texto para dibujar cualquier texto de preedición que se esté componiendo actualmente. Cuando se necesitan las devoluciones de llamada, la aplicación y el IMED comparten un almacenamiento intermedio de una sola línea, donde se realiza la edición. El IMED también proporciona información de cursor que las devoluciones de llamada presentan al usuario.
Las devoluciones de llamada de texto son las siguientes:
- IMTextDraw
- Solicita al programa de aplicación que dibuje la serie de texto
- IMTextHide
- Indica al programa de aplicación que oculte el área de texto
- IMTextStart
- Notifica al programa de aplicación la longitud del espacio de preedición
- IMTextCursor
- Solicita al programa de aplicación que mueva el cursor de texto
- Indicador (estado)
El IMED utiliza devoluciones de llamada de indicador para solicitar el estado interno. La subrutina IMIoctl funciona con el mandato IMQueryIndicatorString para recuperar la serie de texto que proporciona el estado interno. Las devoluciones de llamada de indicador son similares a las devoluciones de llamada de texto, solo que en lugar de compartir un almacenamiento intermedio de una sola línea, se utiliza un valor de estado.
Las devoluciones de llamada de indicador son las siguientes:
- IMIndicatorDraw
- Indica al programa de aplicación que dibuje el indicador de estado
- IMIndicatorHide
- Indica al programa de aplicación que oculte el indicador de estado
- IMBeep
- Indica al programa de aplicación que emita un sonido de pitido
- Auxiliar
El IMED utiliza devoluciones de llamada auxiliares para solicitar diálogos complejos con el usuario. Por consiguiente, estas devoluciones de llamada son más sofisticadas que las devoluciones de llamada de texto o de indicador.
Las devoluciones de llamada auxiliares son las siguientes:
- IMAuxCreate
- Indica al programa de aplicación que cree un área auxiliar
- IMAuxDraw
- Indica al programa de aplicación que dibuje un área auxiliar
- IMAuxHide
- Indica al programa de aplicación que oculte un área auxiliar
- IMAuxDestroy
- Indica al programa de aplicación que destruya un área auxiliar
La estructura IMAuxInfo define el diálogo que necesita el IMED.
El contenido del área auxiliar se define mediante la estructura IMAuxInfo, que se encuentra en la biblioteca /usr/include/im.h.
Contenido de subrutina Descripción IMTitle Define el título del área auxiliar. Se trata de una serie de varios bytes. Si title.lenes 0, no se muestra ningún título.IMMessage Define una lista de mensajes que se deben presentar. Desde la perspectiva de las aplicaciones, la estructura IMMessage debe tratarse como texto informativo y solo de salida. Sin embargo, algunos métodos de entrada utilizan la estructura IMMessage para llevar a cabo un diálogo con el usuario en el que los sucesos clave recibidos por medio de la subrutina IMFilter o IMLookupString se tratan como entrada al método de entrada. En tales casos, el método de entrada puede tratar la estructura IMMessage como una lista seleccionable o un área de solicitud. En cualquier caso, la aplicación solo muestra el contenido del mensaje. No es necesario llamar a la subrutina IMProcessAuxiliar si la estructura IMSelection no contiene estructuras IMPanel y el campo IMButton es nulo.
message.nlineindica el número de mensajes contenidos en la estructura IMMessage. Se presupone que cada mensaje es una sola línea. Los caracteres de control, como \t, no se reconocen. El texto de cada mensaje lo define la estructura IMSTRATT, que consta de una serie de varios bytes y una serie de atributos. Cada atributo se correlaciona de forma individual con cada byte de la serie de texto.IMButton Indica los posibles botones que se pueden presentar a un usuario. El campo IMButton indica a la aplicación qué controles de interfaz de usuario se deben proporcionar para el usuario final. El miembro del botón es de tipo int y puede contener las siguientes máscaras: - IM_OK
- Presenta el botón OK.
- IM_CANCEL
- Presenta el botón CANCEL.
- IM_ENTER
- Presenta el botón ENTER.
- IM_RETRY
- Presenta el botón RETRY.
- IM_ABORT
- Presenta el botón ABORT.
- IM_YES
- Presenta el botón YES.
- IM_NO
- Presenta el botón NO.
- IM_HELP
- Presenta el botón HELP.
- IM_PREV
- Presenta el botón PREV.
- IM_NEXT
- Presenta el botón NEXT.
La aplicación debe utilizar la subrutina IMProcessAuxiliar para comunicar la selección del botón.
IMSelection Define una lista de elementos, como los ideográficos, que puede seleccionar un usuario final. Esta estructura se utiliza cuando el método de entrada desea mostrar un gran número de elementos, pero no desea controlar cómo se presenta la lista al usuario. La estructura IMSelection se define como una lista de estructuras IMPanel. No todas las aplicaciones soportan estructuras IMSelection dentro de la estructura IMAuxInfo. Las aplicaciones que dan soporte a estructuras IMSelection deben realizar la operación IM_SupportSelection utilizando la subrutina IMIoctl inmediatamente después de la creación de IMObject. Además, no todas las aplicaciones soportan varias estructuras IMPanel. Por lo tanto, los campos
panel_rowypanel_colestán restringidos a un valor de 1 por todos los métodos de entrada.Cada estructura IMPanel consta de una lista de campos
IMItemque se deben tratar como una lista bidimensional de filas/columnas cuyas dimensiones se definen comoitem_rowvecesitem_col. Siitem_coles 1, solo hay una columna. El tamaño de la estructura IMPanel se define en términos de bytes. Cada elemento de la estructura IMPanel es menor o igual quepanel->maxwidth.La aplicación debe utilizar la subrutina IMProcessAuxiliary para comunicar una o más selecciones de usuario. El valor IM_SELECTED indica qué elemento está seleccionado. El valor IM_CANCEL indica que el usuario desea terminar el diálogo auxiliar.
hint Lo utiliza el método de entrada para proporcionar información sobre el contexto de la estructura IMAuxInfo. Un valor de IM_AtTheEventindica que la estructura IMAuxInfo está asociada con el último suceso pasado al método de entrada mediante las subrutinas IMFilter o IMLookupString. Se utilizan otras sugerencias para distinguir cuándo se están mostrando varias estructuras IMAuxInfo.estado Lo utiliza el método de entrada para el procesamiento interno. Este campo no debe ser utilizado por las aplicaciones. Cada estructura IMAuxInfo es independiente de las demás. El método utilizado para mostrar los miembros lo determina el interlocutor del método de entrada. La devolución de llamada de IMAuxDraw utiliza la estructura IMAuxInfo.