Como menos sabe a resolução do terminal?

Como menos sabe a resolução do terminal?

Cada vez que alguém define um tamanho diferente para um console virtual, lessreconhece a resolução da janela (presumo que...); de acordo com isso, altera quantas linhas de texto deve visualizar. Como esse parâmetro é calculado?

Responder1

Se você está procurando uma maneira de verificar um script, você pode fazer um destes:

  • Execute tput colse tput lines, como sugere manatwork
  • verifique os valores de $LINES e $COLUMNS

Mas se você quiser os detalhes, aqui vamos nós:

Para terminais virtuais (xterm, et al), existe uma ioctl()chamada de sistema que informa o tamanho da janela. Se puder, lessuse esta chamada. Além disso, quando você altera o tamanho da janela, tudo o que está sendo executado naquela janela recebe um SIGWINCHsinal informando lessque deve verificar um novo tamanho de janela. Por exemplo, iniciei uma lessexecução (como ID do processo 16663), conectei-me a ela com stracee redimensionei a janela. Isto é o que eu vi:

$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1)                  = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0

Isso também é o que tput colseles tput linesfazem nos bastidores, se puderem. Para obter mais informações sobre esse método, consulte man tty-ioctle pesquise TIOCGWINSZ.

Para outros terminais, como aqueles conectados a portas seriais, não há como obter essas informações diretamente. Nesse caso, lesscomeça a procurar pistas nas variáveis ​​de ambiente.

  • LINESe COLUMNSmuitas vezes será definido para as dimensões do terminal. Na verdade, se bashconseguir zshencontrar as dimensões do terminal, ele próprio definirá automaticamente essas variáveis, para tornar mais fácil para programas não tão inteligentes verem o tamanho do terminal. No entanto, a maioria dos outros shells, incluindo dashe tcsh, não definem essas variáveis.
  • TERMgeralmente é definido como o tipo de terminal; nesse caso, o banco de dados terminfo pode conter o tamanho esperado do terminal. Se tput rowsnão for possível usar o IOCTL (por exemplo, se você estiver conectado por uma porta serial), ele retornará aos valores registrados aqui. Para um terminal cujo tamanho pode mudar, isso é apenas uma suposição e provavelmente está errado.

Para obter mais informações, consulte man tputo comando para controlar o terminal e man terminfouma lista de coisas que você pode instruir o terminal a fazer.

Responder2

Se você der uma olhada no código-fonte, conhecerá lessas chamadas ioctl()para recuperar o tamanho da janela no Linux.

#ifdef TIOCGWINSZ
    {
        struct winsize w;
        if (ioctl(2, TIOCGWINSZ, &w) == 0)
        {
            if (w.ws_row > 0)
                sys_height = w.ws_row;
            if (w.ws_col > 0)
                sys_width = w.ws_col;
        }
    }
#else
#ifdef WIOCGETD
    {
        struct uwdata w;
        if (ioctl(2, WIOCGETD, &w) == 0)
        {
            if (w.uw_height > 0)
                sys_height = w.uw_height / w.uw_vs;
            if (w.uw_width > 0)
                sys_width = w.uw_width / w.uw_hs;
        }
    }
#endif

Responder3

Não tenho certeza se esta é a informação que você está procurando. Eu acho que lessregistra um manipulador de sinal para SIGWINCH. Quando a dimensão do terminal muda, ele recebe um SIGWINCHsinal e testa as informações tty para a dimensão atual do terminal. http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html

informação relacionada