bug-ncurses
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Why doesn't ncurses use my Terminfo file's `cols` and `lines`?


From: Stefan Monnier
Subject: Re: Why doesn't ncurses use my Terminfo file's `cols` and `lines`?
Date: Thu, 22 Jun 2023 10:11:09 -0400
User-agent: Gnus/5.13 (Gnus v5.13)

> It's in the manpage - setupterm:

Thanks.

>        The  terminfo  variables lines and columns are initialized by setupterm
>        as follows:
>
>        •   If use_env(FALSE) has been called, values  for  lines  and  columns
>            specified in terminfo are used.
>
>        •   Otherwise,  if  the  environment variables LINES and COLUMNS exist,
>            their values are used.  If these environment variables do not exist
>            and  the program is running in a window, the current window size is
>            used.  Otherwise, if the environment variables do  not  exist,  the
>            values for lines and columns specified in the terminfo database are
>            used.

The program is running in a real terminal started from getty started
from systemd.

> Also, use_tioctl and use_env.  But aside from adding use_tioctl in 2012

Aha!  Last time I used that terminal was around year 2000.

>       https://invisible-island.net/ncurses/NEWS.html#t20120714
>
> the rules for initialization haven't changed for a long time (barring bugs
> of course).  That "current window size" refers to information from a
> TIOCGWINSZ ioctl.

In the `strace tput lines` I see that the right terminfo file is read
and it ends with:

    ioctl(0, TCGETS, {c_iflag=ICRNL|IXON|IXOFF|IUTF8, 
c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, 
c_cflag=B19200|CS8|CREAD|HUPCL|CLOCAL, 
c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE, ...}) = 0
    ioctl(0, TIOCGWINSZ, {ws_row=24, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
    statx(1, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, 
STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, 
stx_mode=S_IFREG|0644, stx_size=6357, ...}) = 0
    write(1, "24\n", 324
    )                     = 3
    exit_group(0)                           = ?
    +++ exited with 0 +++

So, IIUC this line:

    ioctl(0, TIOCGWINSZ, {ws_row=24, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0

says that `tput` queried the kernel about TIOCGWINSZ and the kernel
replied with 80x24.  So, IIUC this is a kernel bug?

I see that's what `stty cols NN rows MM` can override this, so, I should
figure out how to get systemd/getty to do that setup to work around
the problem.

> In a quick check, if I disable the TIOCGWINSZ call in ncurses, and test
> your terminfo, ncurses does set lines/cols as you expect.  If your terminal
> is connected directly to a serial port, I would not expect stty to give a
> size -- but if it's through some intermediate application (even something
> such as ssh, which "should" not helpfully provide a size), then that could
> be providing a size.

Indeed, it's weird that the kernel returns 80x24 for a real terminal
connected via a USB<->RS232 adapter.  Then again, I guess such setups
are getting extremely rare.

Thanks,


        Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]