Resize current window with Curses

Hi.

I am beginning with Unix C Curses Library and i would like to know if it's possible to resize my current window.

In other words, i am working with a Putty Client over my Windows system and with a telnet/ssh connection to linux. I want to build a small linux application using C Curses library and i want to fix the size (rows and columns) of my current Putty window.

Is it possible?

First of all, thanks for your help

A little googling found me this. You may or may not need to tweak your terminal types, etc. for curses to realize putty's terminal supports resizing, but it definitely does.

Ok, thanks Corona.

I had been looking for that this morning and i had found 'resize_term' but my first tests didn't make it.

I 'll read more about this and i 'll do more tests.

I 'll report about any advances.

---------- Post updated at 04:59 PM ---------- Previous update was at 04:26 PM ----------

Oh !!! I just find this post:

No, I really think you need to call resizeterm(). The ioctl only changes what size is reported, not what size the window is, so isn't very useful. How the terminal is actually resized from the user end is terminal-specific and nothing to do with the kernel, hence part of curses.

What value is resizeterm returning? It may not think your terminal's resizable. Curses also provides the function is_term_resized() to tell if curses thinks the terminal is even capable of resizing. What does 'env | grep TERM' show? If TERM is not xterm it probably won't try to resize it even if the terminal supports it.

---------- Post updated at 10:50 AM ---------- Previous update was at 10:09 AM ----------

(posted from PM with permission)

Even if it's not as easy as Spanish for you, your english is quite good.

I really don't know curses. I'm just using google, reading documentation, and suggesting things I do by habit. It certainly seems possible to resize terminals with curses -- both PuTTY and curses support it.

Whenever a function doesn't work, first check its return value. Whether curses believes its succeeded or not will help you figure out what's gone wrong. curses might not even be trying to resize the terminal if it doesn't believe its resizable.

Another thing to check is the manual page, see 'man resizeterm'. That's where I found that resizeterm and resize_term are different functions -- you should be calling resizeterm -- and where I found the mention of is_term_resized.

You might also find Writing Programs with NCURSES useful.

I have found this Linux Redhat command "resize -s Rows Columns" and :b: it works in my PuTTY terminal, so,... Curses should work too, i hope so.:slight_smile:

I've been toying with curses a little and have found that it believes it has resized it when in fact it has not. When the program exits Putty has spammed "PuTTYPuTTYPuTTYPuTTYPuTTYPuTTY" messages to console no matter what I do, meaning curses is sending it some weird ^e control codes instead of the esc-codes one would expect of an xterm!

Looking up the actual esc codes, I made this shell function:

function resize # call resize x y
{
        echo -e "\x1b[8;${2};${1}t"
}

it acts as expected, so curses seems to be giving bananas resize codes for this for some reason.

---------- Post updated at 12:36 PM ---------- Previous update was at 12:04 PM ----------

On further testing my code was messed up. But whether the call succeeds or not, it seems that it doesn't actually send any codes to resize the window! This may be another one of those strange curses things where it's "supposed to do that" until you do the right voodoo. Or it may be a bug. With curses it's sometimes hard to tell the difference...

Hi.

Well, i finally haven�t got to resize my xterm terminal with C library Curses, so i have had to do it with "resize command" such as:

sprintf (vx_sttorden, "resize -s %d %d >/dev/null", 
         p_nuRows, p_nuColumns);

ret = system (vx_sttorden);

Thanks for all.

How about:

printf("\x1b[8;%d;%dt", rows, cols);

to avoid the extra process.

Ohhhh, it�s very good !!! It works very fine, but ..... i don�t undestand it. Never i have used 'printf' with that format.

May you explain me ? where could i find that documentation about that sequence?

But ..... unfortunately ... i would like to save the initial status, so, when program exits, restore it. Now, i execute 'resize' to get current values and then i execute 'resize' to change the window to the size i want. Finally, the program restore those values.

printf's only doing what you'd expect it to, converting %d into digits and printing the rest literally: ESC[8;25;80t where ESC is an ASCII 0x1b -- or as you'd do that in a C string, \x1b. xterm-compatible terminals understand that sequence as 'resize to 80 columns 25 rows'.

There's an equivalent command for 'report the number of columns and rows': ESC[18t. This will cause the terminal itself to print ESC[8;24;80t back to you(assuming your term's 80x24 that is). These escape sequences are how the 'resize' command works.

Of course, in hardcoding them you're abandoning all pretenses of portability. But then, you already did so when you insisted the terminal had to be able to resize itself :wink:

There's a gigantic list of the escape sequences xterm understands here. The VT100 DEC-based sequences are going to be portable to most terminal programs, but only the xterm ones can do things like move and resize the window.

Ok, again, it�s very good, i 'll have a look at this link, it seems very interesting.

To get initial values of the screen size, i can use 'getmaxyx' to obtain them, and finally execute printf sentence to change size or restore initial status.

   void init ()
   {
      getmaxyx(stdscr, nRows, nColumns);
   }

   void draw (int nRows, int nColumns)
   {
      printf("\x1b[8;%d;%dt", nRows, nColumns);
   }

Thanks.