buffer e diálogo de tela

1

Eu estava tentando usar um buffer de tela diferente para o meu script usando tput. Abaixo está um pequeno script que estou executando.

tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
  echo Yes
else
  echo No
fi

Após a execução do script, há uma parte em branco na tela (conforme mostrado abaixo na imagem), que é igual às linhas ocupadas pelos prompts antes de executar o script. Idealmente, tput deveria ter alternado para a segunda tela. buffer e após a execução deve ter retornado ao primeiro buffer de tela. O script muda para a segunda tela, mas depois de voltar deixa um espaço em branco que não deveria estar lá.

    
por g4ur4v 14.03.2013 / 07:44

2 respostas

3

É um problema com a implementação dialog do link .

Na inicialização, ele faz um smcup + rmcup , acredito, porque a rotina de inicialização ncurses faz com que smcup e dialog cancelem isso. Então, se você fizer o seu smcup de antemão, ele não terá efeito, porque o rmcup irá cancelá-lo.

Uma solução é adicionar a opção --keep-tite , que diz para não fazer isso, então dialog fará o smcup no início e rmcup na saída como outros ncurses aplicativos se o terminal suportar isso.

A partir dos seus comentários, parece que você tem outro problema: você está em um terminal que não oferece suporte a uma tela alternativa, então, faça o que fizer, não será possível usar a tela alternativa, pois ela não existe.

O que você pode fazer é usar um terminal diferente que tenha uma tela alternativa como o putty ou os Unix do Cygwin no X Server do Cygwin. Ou execute um terminal X no servidor remoto para se conectar e exibir no seu X Server. Ou execute um emulador de terminal baseado em terminal dentro do seu terminal que suporte uma tela alternativa como o GNU screen .

    
por 14.03.2013 / 08:58
1

O problema é mais complicado do que o sugerido. Comece com o script:

tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
  echo Yes
else
  echo No
fi

Existe apenas uma tela alternativa (e você não pode tratá-la como uma pilha). O tput smcup (tecnicamente "iniciar o modo de endereçamento do cursor") é frequentemente usado com xterm e semelhantes para alternar para a tela alternativa. Na verdade, há mais de uma sequência de controle implementada no xterm para esse propósito (veja Por que a tela clara ao executar o vi? ), e alguns não são reconhecidos pelas semelhantes. Em um dos comentários, MobaXterm é dito ser o terminal real neste caso. Isso é baseado em (usa código de) PuTTY, que por acaso manipula o código 1049 no terminfo do MobaXterm.

Então ...

  • o script muda para a tela alternativa
  • limpa isso (novamente: xterm limpa a tela alternativa na etapa anterior)
  • roda o diálogo, ainda usando a tela alternativa.
  • quando o diálogo é encerrado, ele envia a sequência rmcup , voltando à tela normal, cujo conteúdo será o mesmo de antes do início do script
  • a tela é apagada. Normalmente, isso faz com que o cursor seja movido para o canto superior esquerdo da tela e depois limpo, mas (veja abaixo)
  • finalmente, tput rmcup é usado. Isso pede ao emulador de terminal para voltar da tela alternativa.

Como o terminal já está no modo normal, essa última linha pode ser interpretada em uma de (pelo menos) duas maneiras:

  • pode ser ignorado
  • alguma parte das operações realizadas no switch do modo alternativo para o normal pode ser executada.

Neste caso, parece que o último: parte é executado. PuTTY (e em uma verificação rápida, xterm) restaura a posição do cursor do primeiro uso de tput smcup , porque o prompt está no meio da tela (em vez de no topo, onde clear deixaria isso). OP notou uma lacuna porque havia vários comandos já feitos naquela janela antes de executar o script - o cursor retorna para a posição original, mas os comandos sumiram devido ao clear antes do tput rmcup .

    
por 30.10.2015 / 01:29