4

サイズ変更シグナル (SIGWINCH) を処理しようとしています。

void Server::resizeSignalHandler(int a)
{
signal(SIGWINCH, SIG_IGN);

endwin();
initscr();
refresh();
clear();

int x,y;
getmaxyx(stdscr, y, x);

wmove(upScreen, 0, 0);
wmove(downScreen, y/2, 0);
wresize(upScreen, y/2, x);
wresize(downScreen, y/2, x);
wclear(upScreen);
wclear(downScreen);
waddstr(upScreen, "test1");
waddstr(downScreen, "test2");
wrefresh(upScreen);
wrefresh(downScreen);
refresh();

signal(SIGWINCH, Server::resizeSignalHandler);

}
Server::Server()
{
//ncurses screen initialization
initscr();

if (!upScreen) {
    upScreen = newwin(0, 0, 1, 1);
}
if (!downScreen) {
    downScreen = newwin(0, 0, 1, 1);
}
//adjusting screen when user resize terminal
signal(SIGWINCH, Server::resizeSignalHandler);

//configuring screens
Server::resizeSignalHandler(0);

waddstr(Server::upScreen, "lalfasdfsafd as");
waddstr(downScreen, "supreme!");
wrefresh(Server::upScreen);
wrefresh(downScreen);
}

このコードをデバッグしていたとき、resizeSignalHandler の var x,y は常に同じでした (サイズは変わりませんでした)。また、ioctl でサイズを決定しようとしましたが、何も変わりませんでした。

私より前に多くの人がこの問題を抱えていたことがわかっ たhttp://www.mail-archive.com/arch@archlinux.org/msg11253.html、しかし時々そうではありません。mac os x 端末に代わるものはありますか。おそらく ncurses は xterm など専用です。

4

4 に答える 4

0

ioctl(1, TIOCGWINSZ, struct winsize*)よくわかりませんが、更新された端末パラメータを取得するには、を呼び出す必要があると思います。を参照してくださいman tty_ioctl

于 2012-04-18T09:32:32.247 に答える
-1

私は Mac マシンを持っていないので、これをテストすることはできません。しかし、疑似端末 bash は更新 $LINES および $COLUMNS で実行されていると思いますが、これらの更新は、プログラムが割り当てられている疑似端末に渡されません。これは、WINCH 信号がキャッチされていると言っているが、それらのパラメーターが更新されていないためです。 回避策は、シグナル ハンドラで"/usr/X11/bin/resize"/を実行することです。"/usr/bin/resize"おそらく、これで $LINES と $COLUMNS が適切に更新されるでしょう。

于 2012-04-18T09:22:28.447 に答える