4 对窗口滚动的支持(harib15d)
在harib15c中,到最后一行的时候回车键就不管用了,原因很简单,因为下面没有更多的行了,这可不像个操作系统的样子啊。在别的操作系统中遇到这样的情况会怎样处理呢?窗口应该会向下滚动才对。那么我们来让“纸娃娃系统”也支持窗口滚动吧。
要实现窗口滚动,只要将所有的像素向上移动一行就可以了。元素移动这种操作大家应该已经习惯了吧?移动完成之后,还需要将最下面一行涂黑,否则上面一行的内容就会残留在那里。
本次的bootpack.c节选
void console_task(struct SHEET *sheet)
{
(中略)
int x, y;
(中略)
for (;;) {
io_cli();
if (fifo32_status(&task->fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据(通过任务A) */
if (i == 8 + 256) {
/*退格键*/
(中略)
} else if (i == 10 + 256) {
/* Enter */
/*用空格将光标擦除*/
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", 1);
/*从此开始 */ if (cursor_y < 28 + 112) {
cursor_y += 16; /*换行*/
} else {
/*滚动*/
for (y = 28; y < 28 + 112; y++) {
for (x = 8; x < 8 + 240; x++) {
sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) *
sheet->bxsize];
}
}
for (y = 28 + 112; y < 28 + 128; y++) {
for (x = 8; x < 8 + 240; x++) {
sheet->buf[x + y * sheet->bxsize] = COL8_000000;
}
}
sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
}
/*显示提示符*/
putfonts8_asc_sht(sheet, 8, cursor_y, COL8_FFFFFF, COL8_000000, ">", 1);
/*到此为止*/ cursor_x = 16;
} else {
/*一般字符*/
(中略)
}
}
(中略)
}
}
}
■■■■■
貌似完工了,测试一下,“make run”。
噢噢!窗口滚动了哟!
我们又成功了。一切顺利呀,如此顺利到底是好还是不好呢……当然是再好不过啦!