私はncurses
プログラムを書いていて、端末のサイズ変更に正しく応答するようにしようとしています。プログラムで端末の寸法を正しく読み取ることができますが、ncurses
新しい寸法を正しく処理していないようです。これは (やや長い) サンプルプログラムです:
#include <ncurses.h>
#include <string.h>
#include <signal.h>
#include <sys/ioctl.h>
void handle_winch(int sig){
struct winsize w;
ioctl(0, TIOCGWINSZ, &w);
COLS = w.ws_col;
LINES = w.ws_row;
wresize(stdscr, LINES, COLS);
clear();
mvprintw(0, 0, "COLS = %d, LINES = %d", COLS, LINES);
for (int i = 0; i < COLS; i++)
mvaddch(1, i, '*');
refresh();
}
int main(int argc, char *argv[]){
initscr();
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = handle_winch;
sigaction(SIGWINCH, &sa, NULL);
while(getch() != 27) {}
endwin();
return 0;
}
実行すると、端末の寸法が正しく取得されていることがわかります。しかし、*
画面全体に文字を描画することになっている 2 行目は機能しません。ウィンドウを水平方向にサイズ変更して大きくしてみてください。s の行は*
大きくなりません。
ここで何が問題なのですか?curses モードを一時的に終了できることは承知していますが、よりクリーンなソリューションを希望します。ありがとう!