Skip to content

set_term() does not refresh curses.LINES, COLS or COLORS #155976

Description

@fedonman

Bug description:

curses.LINES, curses.COLS, curses.COLORS and curses.COLOR_PAIRS are copied into the module namespace when a terminal is initialized, and set_term() does not refresh them, so after a switch they describe a different terminal. curses.newwin(curses.LINES, curses.COLS) then sizes a window for the wrong screen, and a colour checked against curses.COLORS is rejected by init_pair(). screen.use() behaves the same way.

import curses, fcntl, os, struct, termios

def screen(kind, rows, cols):
    slave = os.openpty()[1]
    fcntl.ioctl(slave, termios.TIOCSWINSZ, struct.pack('HHHH', rows, cols, 0, 0))
    return curses.newterm(kind, slave, slave)

small = screen('xterm', 18, 60)              # 8 colours
curses.start_color()
big = screen('xterm-256color', 32, 120)      # 256 colours
curses.start_color()
curses.set_term(small)

print('current screen', small.stdscr.getmaxyx(), curses.ncurses_version)
print('LINES, COLS   ', (curses.LINES, curses.COLS))
print('COLORS        ', curses.COLORS)
try:
    curses.init_pair(1, curses.COLORS - 1, 0)
except ValueError as exc:
    print('init_pair     ', exc)
$ ./python repro.py
current screen (18, 60) curses.ncurses_version(major=6, minor=6, patch=20251231)
LINES, COLS    (32, 120)
COLORS         256
init_pair      Color number is greater than COLORS-1 (7).

Expected: (18, 60) and 8, the values of the screen that is current. Doc/library/curses.rst calls LINES "the height of the screen" and COLORS "the maximum number of colors the terminal can support", with nothing about them following one screen only.

set_term() does call the internal update_lines_cols(), but that helper re-reads the ncurses LINES/COLS globals, which set_term() leaves alone, and nothing copies COLORS/COLOR_PAIRS, whose C value did change.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions