8 增加命令行窗口(4)(harib22h)

增加命令行窗口这个系列终于到了最后一节,之前我们已经知道Shift+F1和“×”按钮的部分是有问题的,但一直放着没管,现在终于到了解决它的时候了。

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. struct TASK *task_a, *task_cons[2], *task;
  5. (中略)
  6. for (;;) {
  7. (中略)
  8. if (fifo32_status(&fifo) == 0) {
  9. (中略)
  10. } else {
  11. (中略)
  12. if (256 <= i && i <= 511) { /*键盘数据*/
  13. (中略)
  14. /*从此开始*/ if (i == 256 + 0x3b && key_shift != 0) {
  15. task = key_win->task;
  16. if (task != 0 && task->tss.ss0 != 0) { /* Shift+F1 */
  17. cons_putstr0(task->cons, "\nBreak(key) :\n");
  18. io_cli(); /*强制结束处理时禁止任务切换*/
  19. task->tss.eax = (int) &(task->tss.esp0);
  20. task->tss.eip = (int) asm_end_app;
  21. io_sti();
  22. /*到此结束*/ }
  23. }
  24. (中略)
  25. } else if (512 <= i && i <= 767) { /*鼠标数据*/
  26. if (mouse_decode(&mdec, i - 512) != 0) {
  27. (中略)
  28. if ((mdec.btn & 0x01) != 0) {
  29. /*按下左键*/
  30. if (mmx < 0) {
  31. (中略)
  32. for (j = shtctl->top - 1; j > 0; j--) {
  33. (中略)
  34. if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
  35. if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
  36. (中略)
  37. if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) { /*点击“×”按钮*/
  38. /*从此开始*/ if ((sht->flags & 0x10) != 0) {/*是否为应用程序窗口?*/
  39. task = sht->task;
  40. cons_putstr0(task->cons, "\nBreak(mouse) :\n");
  41. io_cli(); /*强制结束处理时禁止任务切换*/
  42. task->tss.eax = (int) &(task->tss.esp0);
  43. /*到此结束*/ task->tss.eip = (int) asm_end_app;
  44. io_sti();
  45. }
  46. }
  47. break;
  48. }
  49. }
  50. }
  51. } else {
  52. (中略)
  53. }
  54. } else {
  55. (中略)
  56. }
  57. }
  58. } else if (i <= 1) { /*光标用定时器*/
  59. (中略)
  60. }
  61. }
  62. }
  63. }

这次的修改也很简单,首先将原来task_cons[0]的地方改为key_win—>task和sht—>task,这样一来,用键盘强制结束时会以当前输入窗口为对象,而用鼠标点击“×”按钮时会以被点击的窗口为对象。然后,我们将从内存地址0xfec读出cons的部分改为使用task—>cons,这样就改好了。

■■■■■

我们来“make run”,将color.hrb和color2.hrb的窗口并排显示之后,用键盘或者鼠标强制结束试试……看,成功了!

8 增加命令行窗口(4)(harib22h) - 图1

成功了!