Início Tecnologia Uma introdução suave aos Ncurses para o terminalmente impaciente

Uma introdução suave aos Ncurses para o terminalmente impaciente

5
0

Considerado por muitos apenas uma saída monótona para texto seqüencial, o terminal da linha de comando é uma verdadeira tela para o desenvolvedor de software program criativo. Com o cursor como o pincel, interfaces gráficas inteiras podem ser construídas, ou mesmo um painel básico baseado em texto no qual os valores podem ser atualizados sem redesenhar a tela inteira repetidamente ou optar por uma solução muito mais pesada como uma GUI.

O NCURSses é uma das bibliotecas mais conhecidas e bastante portáteis da interface do usuário (TUI) usando esse controle de cursor e, mais, pode ser alcançado de uma maneira bastante indolor. Dito isto, para qualquer pessoa proveniente de uma estrutura gráfica de interface do usuário, os conceitos e terminologia com NCurses e similares podem ser confusamente diferentes, mas sobrepostos, para que o início possa ser um pouco angustiante.

Neste artigo, examinaremos a história dos Ncurses, como configurá -lo e como usá -lo com C e C ++, e muitos outros idiomas suportados por meio de ligações.

Ferramentas e maldições

O acrônimo Tui na verdade é o chamado retrônimo, pois os tuis eram simplesmente o modo de vida antes do advento dos gráficos acelerados por bitmandes, videocard. Para ativar mais do que apenas a saída básica de caracteres seqüenciais, o terminal teve que suportar comandos que moveriam o cursor pela tela, juntamente com os comandos que afetam a maneira como o texto é exibido. Essa sequência básica de mover o cursor e atualizar atributos ativos é o que está subjacente ao TUIS, com os conjuntos de caracteres suportados do sistema determinando o escopo dos caracteres exibidos.

Ncurses, abreviação de “novo curses“, É uma evolução do curses Biblioteca de Ken Arnold, como originalmente lançado em 1978 para o BSD Unix, onde viu usar com vários jogos como Por conta própria. Originalmente, period um clone livremente distribuível do Sistema V Launch 4.0 (SVR4) curses na época de seu lançamento em 1993, baseado em o existente pcurses pacote. Mais tarde, os Ncurses adotaram uma série de novos recursos ao longo de seu desenvolvimento subsequente por vários autores que o distinguiram de cursese resultaria em se tornar o novo padrão de fato em uma ampla gama de plataformas.

A versão atual é mantida por Thomas Dickey, e a biblioteca e os arquivos de desenvolvimento Ncurses estão prontamente disponíveis no seu gerente de pacotes native ou para obtain do Site Ncurses. Compilar e executar o aplicativo baseado em Ncurses é direto em Linux, BSD e MacOS, cortesia do libncurses e arquivos relacionados sendo prontamente disponíveis e geralmente já instalados. No Home windows, você pode usar a porta Mingw, com Msys2 fornecendo um emulador de terminal apropriado, bem como o Pacman Gerenciador de pacotes e acesso à mesma funcionalidade do NCURSses que nas outras plataformas.

Olá maldições

A funcionalidade principal de Ncurses pode ser acessada após incluir o ncurses.h cabeçalho. Existem duas extensões padrão no panel.h e menu.h Cabeçalhos para gerenciamento de pilhas de painéis e menus, respectivamente. Os painéis são efetivamente invocadores em torno de uma janela Ncurses que automatizam muito do malabarismo tedioso de várias janelas potencialmente sobrepostas. A extensão do menu é basicamente o que diz na lata e facilita a criação e o uso de menus.

Para um aplicativo Ncurses ‘Hi there World’, escrevíamos o seguinte:

Este aplicativo inicializa os ncurses antes de escrever o Hi there World! cordas para o canto superior esquerdo, em (2, 2) e o centro da janela do terminal, com o tamanho da janela do terminal sendo determinado dinamicamente com getmaxyx(). O mvprintw() e mvwprintw() trabalhar como printf()com ambos levando as coordenadas para mover o cursor para a posição indicada na ordem da linha (y), coluna (x). O further ‘W’ depois de ‘MV’ no nome da função indica que tem como alvo uma janela específica, que aqui está stdscrmas pode ser uma janela personalizada. Observe que os enfermeiros trabalham com y/x em vez do pedido X/Y recurring.

Em seguida, usamos atributos neste exemplo para adicionar algumas cores. Inicializamos um par, no índice 1, usando predefinido cores e ativar este atributo com attron() e o COLOR_PAIR Macro antes de imprimir o texto. Atributos Também pode ser usado para renderizar o texto como ousado, itálico, piscando, diminuído, revertido e muito mais estilos.

Finalmente, desligamos o atributo de cor e aguardamos um KeyPress com getch() Antes de limpar com endwin(). Este código também está disponível junto com um makefile para construí -lo em Este repositório do GitHub como hello_ncurses.cpp. Observe que no Home windows (msys2) o caminho de inclusão para o cabeçalho do Ncurses é diferente, e você deve compilar com o -DNCURSES_STATIC Defina para poder vincular.

Aqui o plano de fundo, conhecido como tela padrão (stdscr) é usado para escrever, mas também podemos segmentar essa superfície em janelas, que são efetivamente sobreposições sobre esse plano de fundo.

Aplicativo de várias janelas

O emulador USAGI Electric 1 (UE1) com o front-end Ncurses.
O emulador USAGI Electrical 1 (UE1) com o front-end Ncurses.

Há mais em um aplicativo NCurses do que apenas mostrar um texto bonito na tela. Também está lidando com a entrada do teclado e atualizando continuamente os valores na tela. Esses recursos são demonstrados em por exemplo, o emulador que escrevi recentemente Para o computador de 1 bits de 1 bits da USAGI Electrical 1 (UE1) de David Lovett. Este foi o meu primeiro projeto de Ncurses de todos os tempos e, como resultado, como resultado.

Usando a versão baseada em Quickbasic de David como base, escrevi uma porta C ++ que difere da versão QB, pois não há um loop grande, mas sim uma CPU separada (processor.cpp) PARTE que processe as instruções, enquanto o front-end (ue1_emu.cpp) contém o loop de processamento de entrada do usuário, bem como a funcionalidade específica do NCurses. Isso ajuda a manter o código do núcleo do processador o mais genérico possível. O manuseio de sinalizadores e argumentos da linha de comando é resolvido por outro projeto meu: Sarge.

Este front-end UE1 cria dois Ncurses Windows Com um tamanho específico, desenha uma caixa usando os caracteres padrão e atualiza as janelas para fazê -las aparecer. O texto padrão é desenhado com um ligeiro deslocamento na área da janela, exceto o ‘título’ na fronteira, que é simplesmente impressa em texto com espaços de liderança e à direita com um deslocamento da coluna, mas na linha zero.

Manuseando a entrada do usuário com getch() não funcionaria aqui, pois essa função é específica para stdscr e faria em primeiro plano aquela ‘janela’. Ergo, precisamos usar o seguinte: int key = wgetch(desc). Isso mantém a janela ‘Desc’ em foco e obtém a principal entrada a partir daí.

Durante cada ciclo da CPU, o update_display() a função é chamada, em que sucessiva mvwprintw() As chamadas são feitas para atualizar valores na tela, certificando-se de que os dados anteriores para evitar fantasmas, com clrtoeol() e parentes como a opção nuclear. O único uso de atributos é com cor e em negrito em torno do estado do processador, indicando um estado em execução em verde em negrito e parado com vermelho em negrito.

Finalmente, uma parte interessante e essential dos ncurses é o beep() função, que faz o que diz na lata. Para o UE1, é usado para indicar sucesso, tocando o sino do sistema (inspirado no Bendix G-15), que aqui fornece um bipe mais sutil, mas pode ser usado para, por exemplo, indicar uma execução de teste bem-sucedida. Há também o flash() Função que sem surpresa pisca o terminal para chamar a atenção do operador.

Uma toca de coelho muito mais profunda

Quando você se encontrar escrevendo um aplicativo baseado em NCurses no nível de, digamos, vim, você precisará de um pouco mais de ajuda para acompanhar todas as janelas separadas que você criará. É aqui que o Biblioteca do painel entra em jogo, que são basicamente invólucros para janelas que automatizam muitas coisas tediosas, como atualizações e acompanhamento da pilha de janelas.

As aplicações também adoram ter menus, que podem ser cuidadosamente criados e gerenciados usando os principais recursos de Ncurses ou simplificados com o Biblioteca de menus. Para o widget de entrada de dados favorito de todos, existe o Biblioteca de formuláriosque fornece não apenas os widgets, mas também fornece recursos de validação de campo. Se nada disso é suficiente para seus propósitos, há o package de desenvolvimento de maldições (CDK). Para fins menos intensivos, como apenas exibir uma caixa de diálogo de um script de shell, existe o dialog Utilitário que vem padrão no Linux e em muitas outras plataformas e fornece fácil acesso à funcionalidade Ncurses com muito pouco barulho.

Tudo isso serve para afirmar que o terreno coberto neste artigo apenas arranha a superfície, mesmo que seja suficiente para obter um pelo menos parcialmente na toca do coelho do NCurses e, esperançosamente, aprecie a utilidade dos tuis, mesmo no mundo da Gui de hoje.

Imagem do cabeçalho: ncurses-tetris por [Won Yong Jang].

fonte

DEIXE UMA RESPOSTA

Por favor digite seu comentário!
Por favor, digite seu nome aqui