Interfaces de Terminal Incríveis em C#: Do Sofrimento do C/ncurses à Magia do Terminal.Gui

andresn
: ~/blog/
$

Eu tenho uma confissão a fazer: eu sou absolutamente fascinado por aplicações de terminal (TUIs). Existe algo de mágico em softwares que rodam inteiramente no prompt de comando, mas que entregam uma interface rica com menus, botões, janelas e caixas de diálogo.

Durante muito tempo, minha escola para construir esse tipo de sistema foi a linguagem C combinada com a clássica biblioteca ncurses.

Se você já tentou essa abordagem, sabe exatamente do que estou falando: é um trabalho hercúleo. Gerenciar manualmente o redimensionamento da tela, calcular a posição exata de cada caractere na matriz do terminal, lidar com strings brutas e gerenciar memória em C para fazer um simples menu dropdown funcionar… era um processo lento, propenso a falhas e exaustivo.

Foi então que descobri o Terminal.Gui no ecossistema C#. E, honestamente? Foi uma solução perfeita.


O que é o Terminal.Gui?

O Terminal.Gui (também conhecido como gui.cs) é um toolkit de código aberto que permite criar interfaces textuais ricas para o terminal usando o ecossistema .NET. O grande trunfo dele é ser multiplataforma (roda identicamente no Windows, Linux e macOS) e ser totalmente orientado a objetos e eventos.

Em vez de sofrer com ponteiros e matrizes de caracteres, você lida com conceitos modernos como Views, Windows, Labels, Buttons e TextFields.


A Diferença Prática: Menos Código, Mais Resultado

Para se ter uma ideia do nível de abstração, veja como é simples inicializar a aplicação, desenhar uma janela centralizada e colocar um botão de “Sair” funcional usando C# e Terminal.Gui:

using Terminal.Gui;

Application.Init();

// Cria a janela principal que ocupa toda a tela
var janela = new Window("Meu App de Terminal") {
    X = 0,
    Y = 0,
    Width = Dim.Fill(),
    Height = Dim.Fill()
};

// Cria um botão centralizado na tela
var botaoSair = new Button("Sair") {
    X = Pos.Center(),
    Y = Pos.Center()
};

// Define o comportamento do clique (Eventos!)
botaoSair.Clicked += () => {
    Application.RequestStop();
};

janela.Add(botaoSair);
Application.Run(janela);
Application.Shutdown();

Fazer isso em C com ncurses, garantindo que o botão fique perfeitamente centralizado mesmo se o usuário esticar a janela do terminal, exigiria dezenas de linhas de lógica matemática e captura manual de sinais do sistema operacional. No C#, o gerenciamento de layout (Dim e Pos) resolve tudo de forma declarativa.

Por que o Terminal.Gui foi a Solução Perfeita?

  1. Orientação a Eventos (Estilo Desktop): Adicionar um comportamento a um botão é tão simples quanto fazer botao.Clicked += () => { ... }. Adeus loops infinitos complexos para checar coordenadas do clique do mouse no terminal.

  2. Suporte Nativo a Mouse e Teclado: O framework já vem com suporte completo a rolagem de scroll, cliques do mouse, seleção de texto e navegação por teclado (como a tecla Tab para pular de campo) sem que você precise configurar nada.

  3. Produtividade do C#: Você tem o poder do LINQ, injeção de dependência, tipagem forte e gerenciamento de memória automático (Garbage Collector) trabalhando juntos para criar uma aplicação de terminal.

  4. Customização de Cores: Mudar o esquema visual do seu app de “Matrix (Verde e Preto)” para um tema “Dracula” ou clássico azul do “Norton Commander” é extremamente simples com os esquemas de cores nativos.

Conclusão

Se você, assim como eu, ama a estética e a velocidade do terminal, mas não tem mais paciência (ou tempo) para sofrer com as complexidades do baixo nível do C e da ncurses, o Terminal.Gui é um caminho sem volta.

Ele une o melhor dos dois mundos: a nostalgia e a leveza das interfaces em modo texto com a robustez e a velocidade de desenvolvimento do C# moderno.