使用ncurses调整终端大小和滚动问题

问题描述 投票:6回答:4

我正在使用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;
}
c linux ncurses
4个回答
7
投票
  1. 您无法通过ncurses调整终端窗口的大小。您提到的功能调整了curses绘制的终端窗口部分的大小。这个想法是,当用户调整窗口大小时,您捕获到SIGWINCH信号并在处理程序中调用resizeterm [[从应用程序外部(可能使用鼠标)。

  2. 这是预期的行为,尽管在ncurses和Unix标准/ POSIX中记录很少。 NetBSD's curses docs明确声明:

    如果

    n

  3. 为正,则stdscr向上滚动。 n行丢失从stdscr的顶部和n空白行插入在底部。如果n为负,然后向下滚动stdscrn空行是插入stdscr的顶部,然后n行从底部丢失。因此,您必须手动保存输入并在滚动时重新打印。

3
投票
POSIX不涉及这种情况,因为curses文档不是POSIX的一部分。开放小组碰巧维护了两个文档:

  • SIGWINCH手册页中所述,您不应从信号处理程序中调用该函数,因为它会调用“不安全”函数。 “不安全”功能的主题在多个地方进行了讨论。在gcc的resizeterm中会做一个开始。

    关于文档,@ larsmans似乎引用了resizeterm,但未引用ncurses和“ POSIX”的类似链接。对于它的价值:

  • [scroll(3)(由于它旨在涵盖不同的实现,所以必定更笼统)]
  • 返回OP的问题:

      示例程序未显示OP对scroll(3)ncurses的使用。没有说明,但是大概是OP调整了终端窗口的大小,并且程序没有响应。 X/Open的手册页足够清晰,以使ncurses不会导致终端尺寸调整。对于
    1. that(在某些终端上),可以使用resizetermresize_term的实用程序)的resizeterm选项。如果成功,则将调整终端的大小,然后发送-s。ncurses为此提供了预定义的信号处理程序,但在application级别,建议使用resize处理。 resize中有几个程序可以执行此操作。
    2. 在窗口中移动线
    3. up
    4. 必然会移动窗口的某些[[out”。这意味着将行从窗口中移入到已离开的行中。一个“窗口”就是这样:有限的数据视图。对于不同尺寸的视图,建议开发人员使用“垫”(请参见xterm)。滚动手册页中的注释提到了空白(替换行)的颜色问题。由应用程序决定是否将替换项留空或用应用程序的数据填充替换项。诅咒不会自动执行此操作(甚至对于打击垫也是如此)。
  • 无法从ncurses调整终端窗口的大小,但是可以调整xterm系统调用的终端的大小。

    0
    投票

    请勿使用相对路径调用程序。如果此示例为suid + root,则用户只需在PATH中创建名为“ resize”的可执行文件即可升级特权。调用外部程序时,请始终使用绝对路径。

    © www.soinside.com 2019 - 2024. All rights reserved.