4 对窗口滚动的支持(harib15d)

在harib15c中,到最后一行的时候回车键就不管用了,原因很简单,因为下面没有更多的行了,这可不像个操作系统的样子啊。在别的操作系统中遇到这样的情况会怎样处理呢?窗口应该会向下滚动才对。那么我们来让“纸娃娃系统”也支持窗口滚动吧。

要实现窗口滚动,只要将所有的像素向上移动一行就可以了。元素移动这种操作大家应该已经习惯了吧?移动完成之后,还需要将最下面一行涂黑,否则上面一行的内容就会残留在那里。

本次的bootpack.c节选

  1. void console_task(struct SHEET *sheet)
  2. {
  3. (中略)
  4. int x, y;
  5. (中略)
  6. for (;;) {
  7. io_cli();
  8. if (fifo32_status(&task->fifo) == 0) {
  9. (中略)
  10. } else {
  11. (中略)
  12. if (256 <= i && i <= 511) { /*键盘数据(通过任务A) */
  13. if (i == 8 + 256) {
  14. /*退格键*/
  15. (中略)
  16. } else if (i == 10 + 256) {
  17. /* Enter */
  18. /*用空格将光标擦除*/
  19. putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", 1);
  20. /*从此开始 */ if (cursor_y < 28 + 112) {
  21. cursor_y += 16; /*换行*/
  22. } else {
  23. /*滚动*/
  24. for (y = 28; y < 28 + 112; y++) {
  25. for (x = 8; x < 8 + 240; x++) {
  26. sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) *
  27. sheet->bxsize];
  28. }
  29. }
  30. for (y = 28 + 112; y < 28 + 128; y++) {
  31. for (x = 8; x < 8 + 240; x++) {
  32. sheet->buf[x + y * sheet->bxsize] = COL8_000000;
  33. }
  34. }
  35. sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
  36. }
  37. /*显示提示符*/
  38. putfonts8_asc_sht(sheet, 8, cursor_y, COL8_FFFFFF, COL8_000000, ">", 1);
  39. /*到此为止*/ cursor_x = 16;
  40. } else {
  41. /*一般字符*/
  42. (中略)
  43. }
  44. }
  45. (中略)
  46. }
  47. }
  48. }

■■■■■

貌似完工了,测试一下,“make run”。

4 对窗口滚动的支持(harib15d) - 图1

噢噢!窗口滚动了哟!

我们又成功了。一切顺利呀,如此顺利到底是好还是不好呢……当然是再好不过啦!