On 24Feb2019 14:30, boB Stepp <robertvst...@gmail.com> wrote:
On Sun, Feb 24, 2019 at 1:39 AM Cameron Simpson <c...@cskk.id.au> wrote:
It looks like the resizeterm() function updates the curses _internal_
records of what it believes the physcial terminal size to be.  When you
physically resize a terminal the processes within it receive a SIGWINCH
signal, and those which pay attention to that signal should then consult
the terminal to find out its new size.

The curses library notices this signal, and calls resizeterm() to update
its own internal idea of the terminal size so that it knows how to draw
correctly on the screen. It does _not_ change the terminal; it changes
curses' beliefs _about_ the terminal.
[...]
The is_term_resized() function looks up the current physical size and
reports False if that matches curses current beliefs, and True if it
does not match, meaning that the physical size has changed since curses
last set up its beliefs [...]

What you say makes sense and supports much of what I had concluded
from my coding experiments.  However, I still cannot get the function
call, curses.resizeterm(), to do anything meaningful, which suggests
that I still do not truly understand its usage.

Likely so. The important thing you may be missing is that curses _itself_ calls resizeterm() automatically when it gets a SIGWINCH, so in normal situations you do not need to call this function.

Because of this, getmaxyx() is always correct for the size of the terminal.

Secondarily, resizeterm() does not make a change to the terminal itself.

Note that is_term_resized(y,x) is a _test_: it asks whether curses' idea of the screen size does not match (y,x). (y,x) is a pair of numbers that _you_, the programmer, is keeping track of.

If you set it once at the start of the programme:

   max_y, max_x = stdscr.getmaxyx()

and never update it then is_term_resized(max_y, max_x) will report True if the terminal has changed size. If you update the (max_y,max_x) values regularly from getmaxyx() then they will always match and is_term_resized will always report False.

I created the
following script to test things out:
[...]

I've modified your script. Please try the script appended below. The short answer is that resizeterm() is _not_ normally useful to you, the programmer; it will only be useful if curses does not get to notice terminal size changes - _then_ you could use it to provide that facility.

The script below is like yours: 'q' to quit, other keys to refresh and retest. Notice that the version below does not update (max_y,max_x) or call resizeterm(); initially you want to see what is_term_resized() does. It also shows you what got tested.

Cheers,
Cameron Simpson <c...@cskk.id.au>

#!/usr/bin/env python3

import curses

def start_cli(stdscr):
   max_y, max_x = stdscr.getmaxyx()
   stdscr.clear()
   stdscr.border()
   stdscr.addstr(2, 2, "This is the beginning!")
   stdscr.refresh()
   while True:
       char = chr(stdscr.getch())
       if char in 'Qq':
           return
       tested = "is_term_resized(max_x=%d, max_y=%d)" % (max_x, max_y)
       internal = "getmaxyx() => y=%d, x=%d" % stdscr.getmaxyx()
       resized = curses.is_term_resized(max_y, max_x)
       result = "%s => %s" % (tested, resized)
       stdscr.clear()
       stdscr.addstr(max_y//2, max_x//2, result)
       stdscr.addstr(max_y//2 + 1, max_x//2, internal)
       if curses.is_term_resized(max_y, max_x):
           ##max_y, max_x = stdscr.getmaxyx()
           stdscr.addstr(max_y//2 + 2, max_x//2, "You resized the terminal!")
           ##stdscr.addstr(max_y//2 + 2, max_x//2, "Resizing your window -- 
NOW!")
           ##curses.resizeterm(max_y, max_x)
       else:
           stdscr.addstr(max_y//2 + 2, max_x//2, "Not resized.")
       stdscr.border()
       stdscr.refresh()

if __name__ == '__main__':
   curses.wrapper(start_cli)
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to