3 切换输入窗口(harib14c)

命令行窗口这东西,如果不能在里面输入字符的话就毫无用处了,因此我们得让它能接受字符输入才行。不过现在无论我们输入什么字符,都会跑到任务A的窗口中去,所以为了能够往命令行窗口中输入字符,我们要让系统在按下“Tab”键的时候,将输入窗口切换到命令行窗口上去。

虽说是切换窗口,其实我们只是先将窗口标题栏的颜色改一改而已啦(苦笑)。真正负责输入切换的部分我们下一节再写,改变先从表面工夫开始吧。

■■■■■

要改变窗口标题栏颜色,最好将make_window8中描绘窗口标题栏的代码,和描绘窗口剩余部分的代码区分开来,我们将这个函数改写一下。

本次的bootpack.c节选

  1. void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act)
  2. {
  3. boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, xsize - 1, 0 );
  4. boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, xsize - 2, 1 );
  5. boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, 0, ysize - 1);
  6. boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, 1, ysize - 2);
  7. boxfill8(buf, xsize, COL8_848484, xsize - 2, 1, xsize - 2, ysize - 2);
  8. boxfill8(buf, xsize, COL8_000000, xsize - 1, 0, xsize - 1, ysize - 1);
  9. boxfill8(buf, xsize, COL8_C6C6C6, 2, 2, xsize - 3, ysize - 3);
  10. boxfill8(buf, xsize, COL8_848484, 1, ysize - 2, xsize - 2, ysize - 2);
  11. boxfill8(buf, xsize, COL8_000000, 0, ysize - 1, xsize - 1, ysize - 1);
  12. make_wtitle8(buf, xsize, title, act);
  13. return;
  14. }
  15. void make_wtitle8(unsigned char *buf, int xsize, char *title, char act)
  16. {
  17. static char closebtn[14][16] = {
  18. "OOOOOOOOOOOOOOO@",
  19. "OQQQQQQQQQQQQQ$@",
  20. "OQQQQQQQQQQQQQ$@",
  21. "OQQQ@@QQQQ@@QQ$@",
  22. "OQQQQ@@QQ@@QQQ$@",
  23. "OQQQQQ@@@@QQQQ$@",
  24. "OQQQQQQ@@QQQQQ$@",
  25. "OQQQQQ@@@@QQQQ$@",
  26. "OQQQQ@@QQ@@QQQ$@",
  27. "OQQQ@@QQQQ@@QQ$@",
  28. "OQQQQQQQQQQQQQ$@",
  29. "OQQQQQQQQQQQQQ$@",
  30. "O$$$$$$$$$$$$$$@",
  31. "@@@@@@@@@@@@@@@@"
  32. };
  33. int x, y;
  34. char c, tc, tbc;
  35. if (act != 0) {
  36. tc = COL8_FFFFFF;
  37. tbc = COL8_000084;
  38. } else {
  39. tc = COL8_C6C6C6;
  40. tbc = COL8_848484;
  41. }
  42. boxfill8(buf, xsize, tbc, 3, 3, xsize - 4, 20);
  43. putfonts8_asc(buf, xsize, 24, 4, tc, title);
  44. for (y = 0; y < 14; y++) {
  45. for (x = 0; x < 16; x++) {
  46. c = closebtn[y][x];
  47. if (c == '@') {
  48. c = COL8_000000;
  49. } else if (c == '$') {
  50. c = COL8_848484;
  51. } else if (c == 'Q') {
  52. c = COL8_C6C6C6;
  53. } else {
  54. c = COL8_FFFFFF;
  55. }
  56. buf[(5 + y) * xsize + (xsize - 21 + x)] = c;
  57. }
  58. }
  59. return;
  60. }

这样就差不多了,接下来我们来改写HariMain。

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. int key_to = 0; /*这里! */
  5. (中略)
  6. for (;;) {
  7. io_cli();
  8. if (fifo32_status(&fifo) == 0) {
  9. (中略)
  10. } else {
  11. i = fifo32_get(&fifo);
  12. io_sti();
  13. if (256 <= i && i <= 511) { /*键盘数据 */
  14. sprintf(s, "%02X", i - 256);
  15. putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);
  16. if (i < 0x54 + 256) {
  17. (中略)
  18. }
  19. if (i == 256 + 0x0e && cursor_x > 8) { /*退格键*/
  20. (中略)
  21. }
  22. /*从此开始*/ if (i == 256 + 0x0f) { /* Tab键*/
  23. if (key_to == 0) {
  24. key_to = 1;
  25. make_wtitle8(buf_win, sht_win->bxsize, "task_a", 0);
  26. make_wtitle8(buf_cons, sht_cons->bxsize, "console", 1);
  27. } else {
  28. key_to = 0;
  29. make_wtitle8(buf_win, sht_win->bxsize, "task_a", 1);
  30. make_wtitle8(buf_cons, sht_cons->bxsize, "console", 0);
  31. }
  32. sheet_refresh(sht_win, 0, 0, sht_win->bxsize, 21);
  33. sheet_refresh(sht_cons, 0, 0, sht_cons->bxsize, 21);
  34. /*到此结束*/ }
  35. /*重新显示光标*/
  36. boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x + 7, 43);
  37. sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);
  38. } else if (512 <= i && i <= 767) { /*鼠标数据*/
  39. (中略)
  40. } else if (i <= 1) { /*光标用定时器*/
  41. (中略)
  42. }
  43. }
  44. }
  45. }

这段代码的重点在于key_to这个变量,用于记录键盘输入(key)应该发送到(to)哪里。为0则发送到任务A,为1则发送到命令行窗口任务。

还是一如既往地“make run”,然后按下Tab键试试看。

3 切换输入窗口(harib14c) - 图1

按下Tab键之后

哇,颜色变了耶!真不错啊。心情好激动,先按个10次Tab键看看。嗒嗒嗒嗒……

然后又很得意地输入了“abc”试试看,果然,结果是这个样子。

3 切换输入窗口(harib14c) - 图2

果然还是不行啊!

好,接下来我们就来实现键盘输入啦!