8 关闭命令行窗口(2)(harib23h)

做到这一步,接下来我们就来实现用鼠标关闭命令行窗口的功能。当鼠标点击窗口上的“×”按钮时,向命令行窗口任务发送4这个数据,命令行窗口接收到这个数据后则开始执行exit命令的程序。

话说,鼠标的点击是在task_a中处理的,为什么不直接在task_a中调用close_console,而要绕这么个弯子呢?因为如果直接在task_a中关闭命令行窗口的话,由窗口自身所管理的释放定时器及FAT内存空间的部分就难以实现了,因此我们还是选择向命令行窗口发送通知数据这种方式。

由于这次我们只需要将已经实现的功能通过鼠标来进行操作,所以修改起来比较简单。

本次bootpack.c节选

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

我们在bootpack.c中仅仅增加了5行代码。

接下来是console.c,这里其实仅仅增加了3行代码。

本次console.c节选

  1. void console_task(struct SHEET *sheet, int memtotal)
  2. {
  3. (中略)
  4. for (;;) {
  5. (中略)
  6. if (fifo32_status(&task->fifo) == 0) {
  7. (中略)
  8. } else {
  9. (中略)
  10. if (i == 4) { /*点击命令行窗口的“×”按钮*/ /*从此开始*/
  11. cmd_exit(&cons, fat);
  12. } /*到此结束*/
  13. (中略)
  14. }
  15. }
  16. }

好,完工了,简单就是好啊,如果一直都这么简单的话,笔者也能轻松多了……哦,对了,我们还是先“make run”吧。哇,按“×”按钮可以顺利关闭命令行窗口了,成功了!

8 关闭命令行窗口(2)(harib23h) - 图1 8 关闭命令行窗口(2)(harib23h) - 图2
点击这里…… 窗口就关闭了

顺便说一句,在应用程序运行的时候,点击命令行窗口的“×”按钮是不会关闭命令行窗口的。因为如果应用程序运行中关闭了命令行窗口,万一程序调用了显示字符的API,就不知道会造成什么后果了。

8 关闭命令行窗口(2)(harib23h) - 图3

应用程序运行时点击“×”按钮命令行窗口也不会关闭