Terminal çözünürlüğünü daha az nasıl biliyor?


14

Birisi sanal konsol için farklı bir boyut ayarladığında less, pencere çözünürlüğünü tanır (bunu varsayıyorum ...); buna göre, kaç satır metin görselleştirmesi gerektiğini değiştirir. Bu parametre nasıl hesaplanır?


Hmm ... tamam, yine de yürütülen prosedürü nerede bulabilirim?
Giuseppe Crinò

Yanıtlar:


22

Bir komut dosyasından kontrol etmenin bir yolunu arıyorsanız, aşağıdakilerden birini yapabilirsiniz:

  • Koşun tput colsve tput linesinsanlığın önerdiği gibi
  • $ LINES ve $ COLUMNS değerlerini kontrol edin

Ancak ayrıntıları istiyorsanız, işte başlıyoruz:

Sanal terminaller (xterm, et al) ioctl()için pencerenin ne büyüklükte olduğunu söyleyen bir sistem çağrısı vardır. Mümkünse, lessbu çağrıyı kullanır. Ayrıca, pencerenin boyutunu değiştirdiğinizde, o pencerede çalışan her ne olursa olsun, yeni bir pencere boyutunu kontrol etmesi gerektiğini bildiren bir SIGWINCHsinyal alır less. Örneğin, çalışmayı başlattım less(işlem kimliği 16663 olarak), ona bağlandım straceve pencereyi yeniden boyutlandırdım. Ben de öyle gördüm:

$ 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

Bu aynı zamanda ne tput colsve tput linesonlar yapabilirsen, perde arkasındaki ilişki. Bu yöntem hakkında daha fazla bilgi için, bkz man tty-ioctl. TIOCGWINSZ.

Bununla birlikte, seri bağlantı noktalarına bağlı olanlar gibi diğer terminaller için bu bilgiyi doğrudan almanın bir yolu yoktur. Bu durumda, lessortam değişkenlerinde ipuçları aramaya başlar.

  • LINESve COLUMNSgenellikle terminal boyutlarına ayarlanır. Aslında, terminal boyutlarını bulursa bashveya zshbulabilirse, o kadar akıllı olmayan programların terminal boyutunu görmesini kolaylaştırmak için bu değişkenleri otomatik olarak ayarlar. Bununla birlikte, dashve dahil olmak üzere diğer kabukların çoğu tcshbu değişkenleri ayarlamaz.
  • TERMgenellikle terminal tipine ayarlanır, bu durumda terminfo veri tabanı terminalin beklenen boyutunu içerebilir. Eğer tput rowsIOCTL kullanamaz (örneğin bir seri bağlantı noktası üzerinden bağlıysa,), burada kaydedilen değerlere geri düşecek. Boyutu değişebilen bir terminal için bu sadece bir tahmindir ve muhtemelen yanlıştır.

Daha fazla bilgi man tputiçin, terminali kontrol etme komutuna bakın man terminfove terminalin yapmasını söyleyebileceğiniz şeylerin listesi için.


Terminfo veritabanı burada belirtilenleri yapmaz. Daha az bilgi içeren @ warl0ck tarafından verilen cevap daha doğrudur.
Thomas Dickey

@ThomasDickey Haklısın; sahip olduğu tek şey beklenen değerlerdir. Cevabım düzeltildi; Teşekkürler.
Jander

7

Kaynak koduna bakarsanız, Linux'ta pencere boyutunu almak için lessçağrıları bilirsiniz ioctl().

#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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.