Leitura adicional

Leitura adicional

A pergunta é feita aqui:

Se eu pretendo realmente implementar essa mudança, qual biblioteca/programa preciso investigar? Qual parte da 'pilha de terminais' é responsável pelo comportamento de anexar novas linhas ao buffer do terminal?

Eu costumava pensar que estaria dentro de um código-fonte do Terminals, e depois no shell e agora parece que é possivelmente VTE?

Alguma indicação?

Responder1

Os emuladores de terminal não são implementados de forma idêntica. O que você precisa alterar depende muito especificamente de qual emulador de terminal você pretende modificar.

Em termos gerais, isso pode ser implementado em dois locais: na parte de emulação que interpreta e executa sequências de impressão e controle como modificações em alguma forma de representação na memória do estado de exibição do terminal, ou na parte de realização que renderiza esse estado de exibição. em algum tipo de dispositivo de saída.

A primeira seria uma tarefa altamente complexa. Os softwares aplicativos, tanto aqueles que fornecem interfaces de usuário textuais em tela inteira quanto aqueles que apenas fazem coisas como fornecer uma única linha editável, fazem suposições sobre odireção do progresso. Eles assumem todos os tipos de coisas, como as direções de , , , , RI, IND, CUD, CUUe assim por diante. (Em teoria, em um dispositivo compatível com ECMA-48:1991, as direções de progressão de linha e movimento implícito são comutáveis. Não conheço nenhum emulador de terminal Unix ou Linux que realmente implemente isso. O mundo tem operado principalmente com a premissa de que é 't.) No final, suspeito que alguém passaria por todas as várias consequências e efeitos indiretos para descobrir que implementou o último método da maneira mais difícil.

Porque o último é uma tarefa relativamente fácil. Para diversão, acabei de implementá-lo em meu emulador de terminal. Era uma opção de linha de comando para um sinalizador booleano em dois dos realizadores e algumas expressões condicionais para realizar transformações coordenadas em vários lugares. É certo que a janela visível realizada é sempre um múltiplo inteiro do tamanho da célula do caractere nesses realizadores, o que evitou algumas complexidades extras.

Dito isto: depois de usá-lo e lutar contra o hábito de anos de leitura de cima a baixo, e depois experimentar apenas oinicialproblemas com aplicativos que esperam pequenas coisas (como um sinal de intercalação sendo um Poor Man'sacimaseta e til sendo o sublinhado do Pobre Homem), coloquei uma nota de advertência na página do manual. Estou pensando em deixar o mecanismo para o próximo lançamento, apenas para que as pessoas possam, a partir de agora, tentar um terminal errado e chegar à conclusão de que simnãoquerem isso, apesar do que alegaram, afinal. ☺

Leitura adicional

Responder2

O que éexatocomportamento que você gostaria de alcançar?

Primeiro, presumo que você deseja tertodosas linhas na ordem inversao tempo todo.

Observe que, na minha opinião, na maioria dos casos, isso resultaria em um comportamento terrivelmente incomum e contra-intuitivo (se não totalmente quebrado), possivelmente algo que você desistiria de usar em breve.

cat'ing um arquivo de texto mostraria suas linhas de baixo para cima, não a direção em que você normalmente lê o texto. No seu editor e visualizador de texto favorito, as linhas também seriam invertidas. Nos aplicativos, a barra superior ficaria na parte inferior e a barra inferior na parte superior. No alsamixer, os controles de volume ficariam pendurados na parte superior. Caracteres de desenho de caixa (por exemplo, em alsamixer, comandante da meia-noite etc.) desmoronariam nos cantos. As teclas para cima e para baixo moveriam o cursor na direção oposta em muitos aplicativos.

Isso pode ser conseguido modificando a fonte do seu emulador de terminal favorito (ou VTE, caso você use um emulador baseado em VTE, como o GNOME Terminal).

Basicamente, o emulador de terminal rastreia o conteúdo lógico (qual célula de caractere contém qual letra com quais atributos gráficos) e os converte em pixels visíveis ao usuário (glifos bem renderizados). Isso precisaria ficar de cabeça para baixo. Eu procuraria os locais onde ocorre a conversão entre as coordenadas baseadas em caracteres e as coordenadas baseadas em pixels, que são todos os locais onde ocorre uma multiplicação ou divisão pela altura da célula. Essas fórmulas precisariam ser ajustadas. Por exemplo, se você vir um y_pixel = top_padding + row * cell_height, talvez ele se torne um y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height, ou algo assim.

No VTE, a rolagem super suave (rolagem por pixel com o touchpad), além da maneira como o preenchimento inferior extra (no caso de não alinhamento da grade, por exemplo, janela maximizada) é preenchido com conteúdo na rolagem suave causará dor de cabeça extra.

Depois de concluir a renderização básica, você também precisará garantir que os eventos do mouse enviados aos aplicativos sejam invertidos corretamente, assim como os eventos do mouse que rastreiam a seleção. A barra de rolagem também deve ser invertida.

Como segunda etapa, você pode adicionar uma entrada de menu ou introduzir uma nova sequência de escape personalizada (provavelmente um novo número privado DEC) que permite alternar entre o padrão e esse comportamento invertido. Observe que alterar o modo viraria imediatamente tudo (todo o conteúdo e histórico da tela) de cabeça para baixo ou para trás. É útil poder restaurar o comportamento original, especialmente se isso puder ser feito automaticamente em um script wrapper na frente, digamos, de seu editor preferido. No caso de VTE e de um emulador baseado em VTE, uma entrada de menu gráfico exigiria uma nova API entre os dois componentes, portanto, é mais um motivo para optar por uma sequência de escape.

Se você quiser algo mais refinado do que isso, por exemplo, a saída de cada comando aparece na ordem "normal" enquanto a sequência de comandos está "de cabeça para baixo", então se torna uma história muito mais complexa que não pode ser feita no emulador em por si só, precisaria de ajuda (por meio de sequências de escape recém-projetadas) para saber quais partes lógicas inverter. Minha recomendação pessoal é esquecer, não acho isso razoavelmente viável.

informação relacionada