6 用鼠标切换输入窗口(harib21f)

我们已经实现了输入窗口的切换,着实进步不小,只是用Tab键来进行切换的操作和Windows还不一样。在Windows中,只要用鼠标在窗口上点击一下,那个窗口就会被切换到画面的最上方,而且键盘输入也会自动切换到该窗口。因此,我们要让“纸娃娃系统”也可以通过简单的点击就能完成输入切换。

刚才为了实现用Tab键切换,我们修改了大量的代码,而这次我们只需要添加一点点代码就好了,因为只需要通过鼠标操作实现和键盘操作相同的功能而已。

本次的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. /*按照从上到下的顺序寻找鼠标所指向的图层*/
  20. for (j = shtctl->top - 1; j > 0; j--) {
  21. (中略)
  22. if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
  23. if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
  24. sheet_updown(sht, shtctl->top - 1);
  25. /*从此开始*/ if (sht != key_win) {
  26. cursor_c = keywin_off(key_win, sht_win, cursor_c,
  27. cursor_x);
  28. key_win = sht;
  29. cursor_c = keywin_on(key_win, sht_win, cursor_c);
  30. /*到此结束*/ }
  31. if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) {
  32. mmx = mx; /*进入窗口移动模式*/
  33. mmy = my;
  34. }
  35. if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) {
  36. /*点击“×”按钮*/
  37. (中略)
  38. }
  39. break;
  40. }
  41. }
  42. }
  43. } else {
  44. (中略)
  45. }
  46. } else {
  47. (中略)
  48. }
  49. }
  50. } else if (i <= 1) { /*光标用定时器*/
  51. (中略)
  52. }
  53. }
  54. }
  55. }

好了,我们来“make run”,点击一下应用程序窗口试试看吧。

6 用鼠标切换输入窗口(harib21f) - 图1

只需要点击一下就可以完成切换啦