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 有时,他们解决了这个问题(更改 /etc/profile ;O(原文如此!)) ,但有时不是。是否有任何替代 mac os x 终端,也许 ncurses 专用于 xterm 和类似的。

4

4 回答 4

1

那是因为你得到的值getmaxyx是由监听的信号处理程序自己更新的SIGWINCH。您需要使用以下内容保存指向旧信号的指针:

old_callback = signal(SIGWINCH, Server::resizeSignalHandler);

然后调用它resizeSignalHandler

old_callback(a);
于 2015-10-20T21:24:06.863 回答
1

getmaxyx(...)由于自定义SIGWINCH信号处理程序,给出了错误(未更新)的终端尺寸。

您可以使用ioctl(fileno(stdout), TIOCGWINSZ, struct winsize*)获取更新的终端参数。但这不会更新getmaxyx(...).

要更新getmaxyx(...)数据,您应该调用resize_term(size.ws_row, size.ws_col)

因此信号处理程序代码应如下所示:

void on_terminal_resize(int n) {
    struct winsize size;

    if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) {
        resize_term(size.ws_row, size.ws_col);
    }
    // Your code goes here...
    signal(SIGWINCH, on_terminal_resize);
}
于 2016-01-16T11:39:31.353 回答
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 回答