linux - 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;
}
解决方案
当您的示例get 时,对minrowz
的调用会prefresh
更改,这会告诉 ncurses 开始显示 pad 中的相应行。但是垫子只有 10 行长,当 ncurses 到达垫子的末尾时,它会停止从该源显示。这恰好没有达到之前未触及的位置。
您可以提供一个比视口长的 pad,或者使用clrtoeol
()或clrtobot
() 之类的清除操作之一进行整理。
这不是特定于 ncurses 的;pads 的行为可以追溯到 1980 年代中期的 SVr3(请参阅手册中的便携性说明)。
推荐阅读
- javascript - 是否可以调试输入?
- python-3.x - 熊猫在彼此附近更改日期
- java - 如何仅从日期单元格中检索日期
- django - Angular 和 Django 文件上传:禁止 (403) CSRF 验证失败。请求中止
- mysql - MySQL 8 按数组中的值搜索 JSON 键
- javascript - 组件生命周期的“渲染”阶段
- python - 如何绕过 Python 中的列表别名
- bash - 如何使用 Mac 终端从不同长度的文件名中删除除最后 12 个字符之外的所有字符?
- azure-service-fabric - Service Fabric 是否提供分布式事务机制?
- java - 如何从firebase实时数据库中检索用户名