Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ncurses child window not keeping fixed width

I have an ncurses program, with multiple child windows acting as columns. Each child window has a fixed width and the height of the parent terminal window.

However I've found that if the width of the terminal is reduced then one of the windows loses their fixed width and seems to "overflow" their previously set bounds, using the entire remaining width of the terminal.

This is hard to explain so I made a quick gif showing the problem: pls help

This is the code I've used for the above:

#include <ncurses.h>

int main() {
    WINDOW * winA, * winB;
    int i = 0, width = 30;

    initscr();

    // Suppress stdout
    noecho();

    // Enable keypad
    keypad(stdscr, true);

    // interrupt, quit, suspend, and flow control characters are all passed through uninterpreted
    raw();

    winA = newwin(0, width, 0, 0);
    winB = newwin(0, width, 0, width);

    timeout(50);

    while(getch() != 'q') {
        i = width * getmaxy(stdscr);

        werase(winA);
        werase(winB);

        while (i--) {
            waddstr(winA, "0");
            waddstr(winB, "1");
        }

        wnoutrefresh(stdscr);
        wnoutrefresh(winA);
        wnoutrefresh(winB);
        doupdate();
    }

    endwin();

    return 0;
}

Here is another screenshot showing the issue in my actual program. The terminal on the left is correct, the one on the right shows the result after resizing the window and triggering this issue:

enter image description here

How can I prevent windows from losing their fixed-width-ness when the terminal is resized to a small width?

like image 312
yuikonnu Avatar asked May 03 '18 23:05

yuikonnu


1 Answers

Rather than using windows for everything, you could use pads. Windows are limited to the screen-size, while pads are not.

When ncurses gets a SIGWINCH, it resizes stdscr and everything contained within stdscr, shrinking those windows as needed to fit in the new screen-size, or (if their margins match the old screen-size), increasing their size. That's automatic. Your program could check for KEY_RESIZE returned by getch and call wresize to change window sizes (and redraw their contents).

If you used pads, those do not get resized (pads are shown through a viewport that the caller can adjust).

like image 85
Thomas Dickey Avatar answered Oct 23 '22 14:10

Thomas Dickey