Ncurses - 为什么垂直终端调整大小(收缩)会在底部添加空行?

时间:2017-05-28 14:13:41

标签: c++ scroll ncurses

我正在尝试学习使用C ++编写代码的ncurses。我使用Linux Mint和g ++进行编译。我写了下面的代码。我有两个使用newwin()创建的子窗口,它们始终保持其大小。我想要的是当我缩小窗口然后不扩展任何东西来改变。当我水平收缩然后展开时,窗口边缘按预期绘制,没有任何损坏。但是当我垂直做同样的事情时,它看起来像是一个滚动,并在下面添加了空白行。为什么当变化是垂直的时候会发生这种情况,但是当它是水平的时候一切都很好?

#include <ncurses.h>
#include <signal.h>


WINDOW * mainWin;
WINDOW * sideWin;
void resizeHandler(int);

int main()
{
    int mainwinStartX = 0;
    int mainwinStartY = 0;
    int mainwinWidth;
    int mainwinHeight;
    int sidewinStartX;
    int sidewinStartY = 0;
    int sidewinWidth;
    int sidewinHeight;
    signal(SIGWINCH, resizeHandler);

    initscr();
    noecho();
    refresh();

    // Prepairing mainWin sizes
    mainwinWidth = float(2)/3 * COLS;
    mainwinHeight = LINES;
    // Prepairing side win sizes
    sidewinStartX = mainwinWidth;
    sidewinWidth = COLS - mainwinWidth;
    sidewinHeight = LINES;
    // creating window objects
    mainWin = newwin(mainwinHeight, mainwinWidth, mainwinStartY, mainwinStartX);
    sideWin = newwin(sidewinHeight, sidewinWidth, sidewinStartY, sidewinStartX);
    box(mainWin, 0, 0);
    box(sideWin, 0, 0);
    wrefresh(mainWin);
    wrefresh(sideWin);
    while (getch() != 'x'){}
    endwin();
    return 0;
}


void resizeHandler(int sigNumber){}

2 个答案:

答案 0 :(得分:1)

ncurses有意或无意更新 stdscr 以外的窗口布局。 wresize的手册页中描述了该行为:

  

这是curses库的扩展。它重新分配存储空间   一个ncurses窗口,用于将其尺寸调整为指定值。 如果   任何尺寸都大于当前值,即窗口的数据   充满了具有当前背景再现的空白(如   由 wbkgdset 设置合并到其中

ncurses不会尝试猜测应用程序的首选布局。 resizeterm手册页指出应用程序应检查从KEY_RESIZE返回的 wgetch 并更新布局:

  

KEY_RESIZE 警告应用程序屏幕大小已更改,并且应重新绘制特殊功能(如打击垫)   这不能自动完成。

给定的示例程序有几个问题:

  • 它指的是不需要的resize-handler(未显示)(因为initscr分配了一个 - 请参阅 initscr Signal Handlers >手册页)
  • 此处显示的片段:
    box(mainWin, 0, 0);
    box(sideWin, 0, 0);
    wrefresh(mainWin);
    wrefresh(sideWin);
    while (getch() != 'x'){}

不会重新显示mainWinsideWin中的框,因为:

  • 与ncurses&#39;信号处理程序,getch的循环将重新绘制stdscr,消灭其他窗口。
  • 使用其他信号处理程序,ncurses不知道屏幕大小已经改变,你会得到不可预测的结果。

可能看到那些窗口的部分覆盖;我只看到整个窗口被(空白)stdscr覆盖。

答案 1 :(得分:0)

实际上对我有用的代码:

Notice: Undefined index: language in D:\xampp\htdocs\vtiger7\includes\runtime\BaseModel.php on line 31
 Notice: Undefined index: action in D:\xampp\htdocs\vtiger7\include\utils\ListViewUtils.php on line 677
 Notice: Undefined index: file in D:\xampp\htdocs\vtiger7\include\utils\ListViewUtils.php on line 677

我使用了Thomas建议的KEY_RESIZE,并且必须在终端窗口的每个“resize”键事件上删除并重新创建窗口。