我使用ncurses库在C编程(这是第一次),我有两个问题.我在ubuntu上使用默认终端(gnome终端).
1)我需要调整终端的大小.我使用了resizeter()和resize_term(),但是它们都失败了.
2)我使用scrollok()函数,问题是我丢失了滚动的行(当我回到wscrl()时,有空白行).
#include <ncurses.h>
int main() {
WINDOW *win, *win2;
int i;
char c;
initscr();
cbreak();
noecho();
win=newwin(8,20,1,1);
box(win,0,0);
win2=newwin(6,18,2,2);
scrollok(win2,1);
wrefresh(win);
wrefresh(win);
for(i=0;i<15;i++){
c=wgetch(win2);
if(c=='u'){
wscrl(win2,-1);
wrefresh(win2);
}
else{
wprintw(win2,"%c\n",c);
wrefresh(win2);
}
}
delwin(win);
delwin(win2);
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您无法从ncurses调整终端窗口的大小.您提到的功能调整了curses绘制的终端窗口部分的大小.当用户从应用程序外部调整窗口大小时(可能使用鼠标),您的想法是捕获SIGWINCH信号并resizeterm在处理程序中调用.
这是预期的行为,尽管在ncurses和Unix标准/ POSIX中记录不足.NetBSD的curses文档明确说明了这一点:
如果n为正,则
stdscr向上滚动. n条线从顶部丢失stdscr,n条空白线插入底部.如果 n为负,则stdscr向下滚动. Ñ空行被插入在顶部stdscr和 Ñ线从底部丢失.
因此,您必须手动保存输入并在滚动时重新打印.
POSIX 不涵盖这种情况,因为curses 文档不是POSIX 的一部分。Open Group 恰好维护以下两者的文档:
signal.h(注意SIGWINCH没有)正如 手册页中所述resizeterm,您不应从信号处理程序中调用该函数,因为它调用“不安全”函数。“不安全”函数的主题在多个地方进行了讨论;gcc文档中的内容就可以作为开始。
关于文档,@larsmans 似乎引用了scroll(3),但没有引用 ncurses 和“POSIX”的类似链接。物有所值:
回到OP的问题:
resizetermnor的使用resize_term。没有说明,但大概 OP 调整了终端窗口的大小,并且程序没有响应。的手册页resizeterm非常清楚,ncurses 不会导致终端调整大小。为此(在某些终端上),可以使用(的实用程序)-s选项。如果成功,则会调整终端的大小,然后发送一个. ncurses 有一个预定义的信号处理程序,但在应用程序级别,处理是推荐的方式。ncurses-examples中有几个程序可以执行此操作。resizextermSIGWINCHKEY_RESIZE