我正在使用ncurses库在C中编程(这是第一次),我有两个问题。我在使用默认终端(gnome终端)的ubuntu。
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;
}
您无法通过ncurses调整终端窗口的大小。您提到的功能调整了curses绘制的终端窗口部分的大小。这个想法是,当用户调整窗口大小时,您捕获到SIGWINCH
信号并在处理程序中调用resizeterm
[[从应用程序外部(可能使用鼠标)。
如果n
stdscr
向上滚动。 n行丢失从stdscr
的顶部和n空白行插入在底部。如果n为负,然后向下滚动stdscr
。 n空行是插入stdscr
的顶部,然后n行从底部丢失。因此,您必须手动保存输入并在滚动时重新打印。signal.h
(请注意,缺少signal.h
)]SIGWINCH
手册页中所述,您不应从信号处理程序中调用该函数,因为它会调用“不安全”函数。 “不安全”功能的主题在多个地方进行了讨论。在gcc的resizeterm
中会做一个开始。关于文档,@ larsmans似乎引用了resizeterm
,但未引用ncurses和“ POSIX”的类似链接。对于它的价值:
scroll(3)
(由于它旨在涵盖不同的实现,所以必定更笼统)]scroll(3)
或ncurses的使用。没有说明,但是大概是OP调整了终端窗口的大小,并且程序没有响应。 X/Open的手册页足够清晰,以使ncurses不会导致终端尺寸调整。对于resizeterm
(resize_term
的实用程序)的resizeterm
选项。如果成功,则将调整终端的大小,然后发送-s
。ncurses为此提供了预定义的信号处理程序,但在application级别,建议使用resize
处理。 resize
中有几个程序可以执行此操作。xterm
)。滚动手册页中的注释提到了空白(替换行)的颜色问题。由应用程序决定是否将替换项留空或用应用程序的数据填充替换项。诅咒不会自动执行此操作(甚至对于打击垫也是如此)。xterm
系统调用的终端的大小。请勿使用相对路径调用程序。如果此示例为suid + root,则用户只需在PATH中创建名为“ resize”的可执行文件即可升级特权。调用外部程序时,请始终使用绝对路径。