Usando callbacks
Os aplicativos que usam métodos de entrada devem fornecer funções de callback para que o Editor de Método de Entrada (IMED) possa se comunicar com o usuário. O tipo de método de entrada que você usa determina se callbacks são necessários ou não. Por exemplo, o método de entrada de byte único não precisa de callbacks, mas o método de entrada japonês os utiliza extensivamente com a facilidade de pré-edição. A pre-edição permite o processamento de caracteres antes de serem comprometidos com o aplicativo.
Quando você usa um método de entrada, apenas o aplicativo pode inserir ou excluir dados de pré-edição e rolar o texto. Consequentemente, o eco dos keystrokes é alcançado pelo aplicativo a pedido da lógica do método de entrada por meio de callbacks.
Ao entrar em um pressionamento de tecla, o aplicativo chama a subroutine IMFilter . Antes de retornar, o método de entrada pode chamar a função de callback de eco para inserção de novos teclados. Depois que um caractere foi composto, a subroutine IMFilter a devolve, e os keystrokes são excluídos.
Em vários casos, a lógica do método de entrada tem que chamar de volta o cliente. Cada um destes é definido por uma ação de callback. O cliente especifica qual callback deve ser chamado para cada ação.
Os tipos de callbacks são descritos da seguinte forma:
- Desenho de texto
O IMED usa callbacks de texto para desenhar qualquer texto de pré-edição atualmente sendo composto. Quando os callbacks são necessários, o aplicativo e o IMED compartilham um buffer de linha singela, onde a edição é realizada. O IMED também fornece informações do cursor que os callbacks então apresentam para o usuário.
Os callbacks do texto são os seguintes:
- IMTextDraw
- Pede o programa de aplicativos para desenhar a sequência de texto
- IMTextHide
- Informa o programa de aplicativos para ocultar a área de texto
- IMTextStart
- Notifica o programa de aplicação do comprimento do espaço de pré-edição
- IMTextCursor
- Solicita o programa de aplicativos para mover o cursor de texto
- Indicador (status)
O IMED usa callbacks indicadores para solicitar o status interno. A sub-rotina IMIoctl funciona com o comando IMQueryIndicatorString para recuperar a cadeia de texto que fornece o status interno. Os callbacks do indicador são semelhantes a callbacks de texto, exceto que em vez de compartilhar um buffer de linha singela, é usado um valor de status.
Os callbacks do indicador são os seguintes:
- IMIndicatorDraw
- Informa o programa de aplicativos para desenhar o indicador de status
- IMIndicatorHide
- Informa o programa de aplicativos para ocultar o indicador de status
- IMBeep
- Conta o programa de aplicativos para emitir um som sonoro
- Auxiliar
O IMED usa callbacks auxiliares para solicitar diálogos complexos com o usuário. Consequentemente, esses callbacks são mais sofisticados do que os callbacks de texto ou indicador.
Os callbacks auxiliares são os seguintes:
- IMAuxCreate
- Informa o programa de aplicativos para criar uma área auxiliar
- IMAuxDraw
- Conta o programa de aplicativos para desenhar uma área auxiliar
- IMAuxHide
- Conta o programa de aplicativos para ocultar uma área auxiliar
- IMAuxDestroy
- Conta o programa de aplicativos para destruir uma área auxiliar
A estrutura IMAuxInfo define o diálogo necessário pelo IMED.
O conteúdo da área auxiliar é definido pela estrutura IMAuxInfo , localizada na biblioteca /usr/include/im.h
Conteúdo da Subroutine Descrição IMTítulo Define o título da área auxiliar. Esta é uma sequência multibyte. Se title.lenfor 0, nenhum título exibe.IMMessage Define uma lista de mensagens a serem apresentadas. A partir da perspectiva dos aplicativos, a estrutura IMMessage deve ser tratada como texto informativo, de saída apenas. No entanto, alguns métodos de entrada utilizam a estrutura IMMessage para conduzir um diálogo com o usuário no qual os eventos de chave recebidos por meio da sub-rotina IMFilter ou IMLookupString são tratados como entrada para o método de entrada Nesses casos, o método de entrada pode tratar a estrutura IMMessage como uma lista selecionável ou uma área de prompt. Em qualquer dos dois casos, o aplicativo exibe apenas o conteúdo da mensagem. A sub-rotina IMProcessAuxiliary não precisará ser chamada se a estrutura IMSelection não contiver estruturas IMPanel e o campo IMButton for nulo.
O
message.nlineindica o número de mensagens contidas na estrutura IMMessage . Cada mensagem é assumida como uma única linha. Caracteres de controle, tais como \t, não são reconhecidos. O texto de cada mensagem é definido pela estrutura IMSTRATT , que consiste tanto de uma cadeia multibyte como de uma string de atributo. Cada atributo é mapeado um-para-um para cada byte na string de texto.IMButton Indica os possíveis botões que podem ser apresentados a um usuário. O campo IMButton informa ao aplicativo quais controles de interface do usuário devem ser fornecidos para o usuário final. O membro do botão é do tipo int e pode conter as seguintes máscaras: - IM_OK
- Apresentar o botão OK.
- IM_CANCELAR
- Apresentar o botão CANCELAR.
- IM_ENTER
- Apresentar o botão ENTER.
- IM_RETRY
- Apresentar o botão RETRY.
- IM_ABORT
- Apresentar o botão ABORT.
- IM_YES
- Apresentar o botão SIM.
- IM_NO
- Apresentar o botão NO.
- IM_HELP
- Apresentar o botão HELP.
- IM_PREV
- Apresentar o botão PREV.
- IM_NEXT
- Apresentar o botão NEXT.
O aplicativo deve usar a sub-rotina IMProcessAuxiliary para comunicar a seleção do botão..
IMSeleção Define uma lista de itens, como ideografados, que um usuário final pode selecionar. Essa estrutura é usada quando o método de entrada quer exibir um grande número de itens mas não quer controlar como a lista é apresentada ao usuário. A estrutura IMSeleção é definida como uma lista de estruturas IMPainel . Nem todos os aplicativos suportam estruturas IMSelection dentro da estrutura IMAuxInfo . Os aplicativos que suportam estruturas IMSelection devem executar a operação IM_SupportSelection usando a sub-rotinaIMIoctl imediatamente após a criação do objeto IMO. Além disso, nem todos os aplicativos suportam várias estruturas IMPainel . Por isso, os campos
panel_rowepanel_colficam restritos a uma configuração de 1 por todos os métodos de entrada.Cada estrutura IMPanel consiste em uma lista de campos
IMItemque devem ser tratados como uma lista de dois dimensionais, row/coluna cujas dimensões são definidas comoitem_rowvezesitem_col. Seitem_colfor 1, há apenas uma coluna. O tamanho da estrutura IMPanel é definido em termos de bytes. Cada item dentro da estrutura IMPanel é menor ou igual apanel->maxwidth.O aplicativo deve usar a sub-rotina IMProcessAuxiliary para comunicar uma ou mais seleções do usuário.. O valor IM_SELECIONADO indica qual item é selecionado. O valor IM_CANCELAR indica que o usuário deseja finalizar o diálogo auxiliar.
sugestão Usado pelo método de entrada para fornecer informações sobre o contexto da estrutura IMAuxInfo . Um valor de IM_AtTheEventindica que a estrutura IMAuxInfo está associada ao último evento transmitido para o método de entrada pela sub-rotina IMFilter ou IMLookupString . Outras sugestões são utilizadas para distinguir quando várias estruturas IMAuxInfo estão sendo exibidasstatus Utilizado pelo método de entrada para processamento interno. Este campo não deve ser usado por aplicativos. Cada estrutura IMAuxInfo é independente das outras. O método utilizado para exibir os membros é determinado pelo chamador do método de entrada. A estrutura IMAuxInfo é usada pelo retorno de chamadas do IMAuxDraw