pythonncursespython-curses

curses fails when calling addch on the bottom right corner


I am starting to learn curses in Python. I am using Python 3.5 on Mac OS X. When I try to write in the bottom-right corner, the program crashes with the following error:

$ python ex_curses.py
[...]
  File "ex_curses.py", line 19, in do_curses
    screen.addch(mlines, mcols, 'c')
  _curses.error: add_wch() returned ERR

The example program is:

import curses

def do_curses(screen):
    curses.noecho()
    curses.curs_set(0)
    screen.keypad(1)

    (line, col) = 12, 0
    screen.addstr(line, col, "Hello world!")
    line += 1
    screen.addstr(line, col, "Hello world!", curses.A_REVERSE)

    screen.addch(0, 0, "c")

    (mlines, mcols) = screen.getmaxyx()
    mlines -= 1
    mcols -= 1
    screen.addch(mlines, mcols, 'c')

    while True:
        event = screen.getch()
        if event == ord("q"):
            break
    curses.endwin()

if __name__ == "__main__":
    curses.wrapper(do_curses)

I have a feeling that I'm missing something obvious, but I don't know what.


Solution

  • That is expected behavior (a quirk) because addch attempts to wrap to the next line after adding a character. There is a comment in lib_addch.c dealing with this:

    The _WRAPPED flag is useful only for telling an application that we've just
    wrapped the cursor.  We don't do anything with this flag except set it when
    wrapping, and clear it whenever we move the cursor.  If we try to wrap at
    the lower-right corner of a window, we cannot move the cursor (since that
    wouldn't be legal).  So we return an error (which is what SVr4 does).
    Unlike SVr4, we can successfully add a character to the lower-right corner
    (Solaris 2.6 does this also, however).