首页 > 解决方案 > Linux Ncurses Pad Smearing(文本滚动尝试)

问题描述

我正在尝试使用下面的代码来尝试学习如何使用和控制滚动板。当按下 Z 键时,键盘会向上滚动,这很好。问题是它这样做时会“涂抹”。当它向上滚动时,底线“9-9-9-9-9-”将自身复制到它在移动时接触到的每个部分。我该如何阻止它这样做?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <ncurses.h>

int main() {

    int key=0, a=0, b=0, c=0, d=0, e=0, f=0;
    WINDOW *mypad;

    initscr();          /* Start curses mode        */
    cbreak();           /* Line buffering disabled, Pass on everything to me */
    timeout(0);         /* wait for user input */   
    noecho();
    keypad(stdscr, TRUE);       /* I need those nifty Function keys     */
    start_color();

    mypad = newpad(10, 10);

    waddstr(mypad, "0-0-0-0-0-");
    waddstr(mypad, "1-1-1-1-1-");
    waddstr(mypad, "2-2-2-2-2-");
    waddstr(mypad, "3-3-3-3-3-");
    waddstr(mypad, "4-4-4-4-4-");
    waddstr(mypad, "5-5-5-5-5-");
    waddstr(mypad, "6-6-6-6-6-");
    waddstr(mypad, "7-7-7-7-7-");
    waddstr(mypad, "8-8-8-8-8-");
    waddstr(mypad, "9-9-9-9-9-");


    prefresh(mypad, 0, 0, 0, 3, 9, 12);
    scrollok(mypad, TRUE);

    a=0;
    b=0;
    c=0;
    d=3;
    e=9;
    f=12;

    key=-1;
    while(key!='q')
    {
        key = wgetch(mypad);
        if(key=='a') { a--; }
        if(key=='z') { a++; }
        if(key=='s') { b--; }
        if(key=='x') { b++; }
        if(key=='d') { c--; }
        if(key=='c') { c++; }
        if(key=='f') { d--; }
        if(key=='v') { d++; }
        if(key=='g') { e--; }
        if(key=='b') { e++; }
        if(key=='h') { f--; }
        if(key=='n') { f++; }

        prefresh(mypad, a, b, c, d, e, f);
    }

    delwin(mypad);
    endwin();

    return 0;
}

标签: linuxscrollncursespad

解决方案


当您的示例get 时,对minrowz的调用会prefresh更改,这会告诉 ncurses 开始显示 pad 中的相应行。但是垫子只有 10 行长,当 ncurses 到达垫子的末尾时,它会停止从该源显示。这恰好没有达到之前未触及的位置。

您可以提供一个比视口长的 pad,或者使用clrtoeol()clrtobot() 之类的清除操作之一进行整理。

这不是特定于 ncurses 的;pads 的行为可以追溯到 1980 年代中期的 SVr3(请参阅手册中的便携性说明)。


推荐阅读