Pergunta

Estou trabalhando em um aplicativo de console simples para molhar meus pés com maldições novamente. Estou tendo um problema por portar meu aplicativo do XP para o AIX. Aqui está uma amostra de código de código.

int main(void)
{
    WINDOW *_window = initscr(); 
    int _rows;
    int _cols;

    cbreak();

    /* Accept all keys */ 
    keypad(_window, true);

    /* Don't echo things that are typed */ 
    noecho();

    /* Get the screen dimensions */ 
    getmaxyx(_window, _rows, _cols);

    /* Don't display cursor */ 
    curs_set(0);

    for (;;)
    {
        printw("Press a Key ");
        refresh();
        int key = wgetch(_window);
        printw("%d \n", key);
    }

    endwin();

    return 0;
}

Quando executo isso no XP, recebo a seguinte saída de um downarrow seguido por um Ctrl-DownArrow.

Press a Key 258
Press a Key 481
Press a Key

Sugerindo 258 é o código para a seta para baixo e 481 para seta Ctrl-Down.

Executando esse mesmo teste em AIX.

Press a Key 1858
Press a Key 27
Press a Key 79
Press a Key 66
Press a Key

O 1858 é a seta para baixo e o 27/29/66 é a resposta para a seta Ctrl-Down. Reconheço que o 27/29/66 é provavelmente uma das sequências de fuga padrão. Eu esperava que as maldições o mapeiam para um único valor. O lado XP possui um CTL_DOWN definido no arquivo Curses.h. O lado AIX não.

Então minha pergunta aqui é

É um encantamento que eu perdi aqui, que mapeará magicamente esses três personagens em um número inteiro único e agradável? Ou tenho que escrever uma classe de algum tipo, para lidar com a ocultação das teclas específicas da plataforma em algo que meu aplicativo real pode usar?

Meus olhos estão disparados ao pesquisar as coisas online do AIX. Qualquer ajuda para me apontar na direção correta seria apreciada.

Outras informações aleatórias

Estou executando o XP Pro, com os mais recentes pacotes de serviços MSVC 6, com o serviço de serviço 6. A biblioteca de maldições é pdcurses

O outro compilador é IBM XL C/C ++ Enterprise Edition v8.0 O compilação usa

xlc ++ -g App.cpp -lcurses

Estou usando o PDCurses33 no PC e as maldições nativas no AIX.

Foi útil?

Solução 2

Re: [PDCurses] Alt + Shift + N (por exemplo) no Windows

LM sex, 12 de julho de 2002 08:13:53 -0700

Em 7/7/2002 18:10:00, Jeremy Smith escreveu:

Eu encontrei um pouco de problema. Eu uso a função de maldições getch () no meu programa, para chaves como 'n' ou alt+'n', mas como faço para detectar essas combinações:

Ctrl+n alt+shift+n ctrl+alt+n ctrl+alt+shift+n

Eu imagino que deve haver algum tipo de bandeira para retornar Shift+Alt+2 como um código de chave real (que é diferente do turno, Alt ou 2), mas não sei como. :-(

Eu verifiquei o cabeçalho do arquivo em busca de maldições.H e elas parecem listar todos os códigos de varredura padrão que você pode voltar de um teclado, incluindo algumas combinações ALT e algumas das combinações de controle.

Então eu verifiquei a implementação do Windows para obter um personagem. Em pdckbd.c, a rotina win32_kbhit chama ReadConsoleinput. As teclas de mudança, alt, controle e outras chaves são retornadas dessa função no DWControlkeyState. O PDC_GET_BIOS_KEY relata qual a tecla é pressionada usando as duas tabelas KPTAB (KPTAB e EXT_KPTAB); portanto, se a combinação não estiver na tabela, você provavelmente não estará vendo. Você poderá adicionar algumas definições às tabelas se algo estiver faltando. Há também algum código na mesma rotina que define os estados (Button_Shift, button_control, button_alt), mas isso parece ser para entrada do mouse. Assim, você pode verificar essas teclas na estrutura do mouse_status. Isso refere -se apenas à implementação do Windows. Toda plataforma tem uma maneira única de descobrir quais chaves são pressionadas.

No DOS de 16 bits, eu costumava alterar o estado de turno, o Caps Lock e o Num Lock alterando as configurações no endereço hexadecimal 417. Isso funciona apenas para programas de modo real. Muitos dos novos compiladores do Windows nem permitem acessar mais biografias ou memória diretamente com funções. A localização de 16 bits no Hex 417 e Hex 418 indica que o turno direito foi pressionado definindo o bit mais alto no endereço 417, o turno esquerdo, definindo o segundo bit mais alto no byte, a tecla Ctrl, definindo o próximo alto e a chave alt pela próxima mais alta depois disso. O endereço 418 mantém o status de se as teclas Alt e de controle direita ou esquerda e não foram pressionadas.

Parece que você pode ter que fazer algumas modificações em sua versão específica de maldições para obter exatamente o que deseja. Curses é uma interface de usuário muito portátil, portanto, geralmente suporta o menor denominador comum de recursos em algumas plataformas.

A propósito, lembro -me de ler que havia trabalho em andamento para um novo padrão de maldições que incluía suporte internacional de personagens. Alguém já ouviu mais alguma coisa sobre esse esforço?

Muitas felicidades.

Laura Michaelshttp://www.distasis.com

Parece que preciso fazer minha própria decodificação de teclado.

Outras dicas

Você pode tentar usar as bibliotecas de "NCurses" de código aberto, em vez da biblioteca fornecida pela AIX, que foi fortemente voltada para as bibliotecas específicas de hardware e software da IBM.

Não me lembro exatamente se existe uma versão compatível com XLC por aí, então você pode ter que criar a biblioteca da fonte ou da troca para 'GCC'. Thier também é uma versão do Ncurses para o Windows, para que você possa apoiar suas alterações na versão original do seu código.

Eu tenho uma lembrança de vauge do NCURSE suportando nomes lógicos como up_arrow etc. em vez de números para as teclas de controle. O problema depenfing na plataforma, emulação de terminal, configurações do NLS etc. Uma seta para cima simples pode voltar como 'up_arrow', 'esc_up', 'cntrl_k'.

Lembro -me de mapear vários traços -chave para uma 'intenção' lógica como 'significa_up' na última vez que tive que portar um aplicativo de maldições para outra plataforma (e isso foi um AIX relativmente fácil da porta Solaris).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top