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.len es 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.nline indica 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_row y panel_col están restringidos a un valor de 1 por todos los métodos de entrada.

    Cada estructura IMPanel consta de una lista de campos IMItem que se deben tratar como una lista bidimensional de filas/columnas cuyas dimensiones se definen como item_row veces item_col. Si item_col es 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 que panel->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_AtTheEvent indica 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.