NCurses sobre Mosh, altcharset

0

O programa mais simples que deve desenhar uma linha horizontal:

int main()  
{ initscr(); for (int i=0;i<10;i++) addch(ACS_HLINE); getch(); endwin(); }

funciona ok localmente, mas o resultado da conexão MOSH é qqqqqqqqqq.

Eu testei outros programas ncurses conhecidos dessa forma (através da conexão MOSH) e alguns deles funcionam bem, como: alsamixer, vim, tmux ... mas outros testados também mostraram "personagens feias", como: tetris game (bastet ), diálogo (mostrando diálogos de shell scripts).

Então o problema novamente para myprogram acima, tetris, dialog e outros é:

  • funciona localmente no xterm e nos terminais virtuais (term = linux) e tmux / screen.
  • funciona bem em SSH também.
  • mostra caracteres q e x em vez de linhas no MOSH client

Mosh é um programa muito útil que resolve desconexões ssh no laptop wifi. Cria seu próprio terminal e configura a variável TERM para xterm. Logo antes de iniciar o programa sobre mosh, TERM var é 'xterm', o comando locale mostra LANG = en_US.UTF8, LC_ALL="", fontes parecem ok (e os mesmos resultados com testes de fontes diferentes)

Alguém sabe como resolver ou depurar ainda mais esse problema?

Simulação mais simples:

sudo apt-get install mosh bastet    #<--install mosh and tetris
bastet                              #<--tetris works ok
mosh -- 127.0.0.1 bastet            #<--q and x chars instead of lines
    
por MetNP 17.01.2018 / 00:38

2 respostas

0

Está na página de manual do ncurses: o ambiente NCURSES_NO_UTF8_ACS pode ser definido para informar que o terminal não reconhece os códigos de desenho de linha no estilo VT100 usados. Além disso, o recurso U8 na descrição do terminal (usado com TERM=tmux , por exemplo) diz a mesma coisa.

    
por 17.01.2018 / 03:49
0

Após analisar o código-fonte do alsamixer (que funciona bem), descobrir que essa linha é muito importante:

setlocale(LC_ALL, "");

como exibido na documentação da biblioteca c . Sem a localidade 'C', o padrão é.

Então, meu programa agora se comporta bem com o MOSH também:

{ setlocale(LC_ALL, ""); initscr(); ... draw lines ... getch(); endwin(); }

Mas aceitarei qualquer outra resposta que a resolva fora de um programa. Como como forçar o tetris a fazer isso sem mudar o código-fonte.

    
por 17.01.2018 / 06:40