MacOS环境-手写操作系统-37-切换窗口 键盘输入

简介: MacOS环境-手写操作系统-37-切换窗口 键盘输入

切换窗口 键盘输入

1.简介

我们实现了键盘的输入焦点切换 但尽管控制命令台激活后


如果我们敲击键盘 会发现字符输入的还是前头的Message box


这一节 我们要实现把键盘敲击的内容输入到被切换的窗口


实现的思路是这样的 我们为每个任务配置一个输入队列


当窗口被激活时 一旦有键盘输入 主进程首先会把键盘数据获取到


然后判断当前被激活的是哪个窗口 然后找到运行窗口所对应的进程对象


通过进程对象获得其对应的输入队列 于是把键盘传过来的信息放入到输入队列中 然后激活对应的进程对象


2.代码

修改代码


首先是multi_task.h


struct TASK {
    int sel, flags;
    int priority;
    int level;
    struct FIFO8 fifo;
    struct TSS32 tss;
};


上面的改动就是添加了一个队列 用来获取信息输入


接下来修改的是主进程的CMain 函数 一旦键盘事件产生后


CMain会被激活 这时它可以把接收到的字符投入到对应窗口进程的队列中

void CMain(void) {
    ....
    for(;;) {
    ....
    else if (key_to == 0) {
               if (keytable[data] != 0 && cursor_x < 144) {
                   boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, COL8_FFFFFF,cursor_x,
                   28, cursor_x + 7, 43);
                   sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);

                   char buf[2] = {keytable[data], 0};
                   showString(shtctl,  shtMsgBox, cursor_x, 28, COL8_000000, buf);
                   cursor_x += 8;

                  stop_task_A = 1;

                  boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, cursor_c, cursor_x,
                  28, cursor_x + 7, 43);
                  sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);
              } 
           } else {
              task_sleep(task_a);
              fifo8_put(&task_cons->fifo, data);
           }

       }
    ....
    }
    ....
}

如果当前激活的窗口是Message Box 那么字符就直接显示在文本框中


要不然我们把当前主进程挂起


然后把键盘数据通过fifo8_put把数据投入到控制台进程对应的队列中


我们一定要记得把主进程挂起 要不然主进程会一直占据CPU资源


从而控制台进程不能运行进而无法及时处理键盘数据


控制台进程的改变

void console_task(struct SHEET *sheet) {
    ....
    else {
                if (i == 0x0e && cursor_x > 8) {
                      boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
                28, cursor_x + 7, 43);
                      sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);

                     cursor_x -= 8;

                     boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
                28, cursor_x + 7, 43);
                     sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);
                } else {
                           if (cursor_x < 240 &&i< 0x54 && keytable[i] != 0) {
                           boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
                28, cursor_x + 7, 43);
                           sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);

                           s[0] = keytable[i];
                           s[1] = 0;
                           showString(shtctl, sheet, cursor_x, 28, COL8_FFFFFF, s);
                           cursor_x += 8;
                       }
                }
            }

    ....
}

变量i的值就是CMain传进来键盘数据


如果i的值是0x0e 表示键盘按钮是退格键


接收到这个按键时 我们要做的是把光标前面的字符给删除掉


在删除字符时 我们需要注意一点 就是对光标的处理


由于光标效果是通过绘制一个白色方块 然后再绘制一个黑色方块来实现的


如果退格时 光标正好是白色方块


那么我们把光标向前移动一个字符的位置后 就会在光标的原来位置留下一个白色方块


因此在把光标向前移动前 我们先要在光标原来的位置用背景色绘制同等大小的方块


把白色方块给覆盖的 这就是为何在cursor_x -= 8; 这条语句前会有三条用于绘制窗口的语句


把光标向前移动一个字符的位置后 光标前面的字符就会被光标的方块给覆盖掉 从而实现字符删除的特效


如果输入的是其他字符 那么同理


先把光标当前的位置用背景色覆盖掉 然后在把字符显示出来


接着把光标向后移动一个字符的位置 在新位置上交替绘制光标方块


3.编译和运行

目录
相关文章
|
4月前
|
监控 Linux 云计算
Linux操作系统在云计算环境中的实践与优化###
【10月更文挑战第16天】 本文探讨了Linux操作系统在云计算环境中的应用实践,重点分析了其在稳定性、安全性和高效性方面的优势。通过具体案例,阐述了Linux如何支持虚拟化技术、实现资源高效分配以及与其他开源技术的无缝集成。文章还提供了针对Linux系统在云计算中的优化建议,包括内核参数调整、文件系统选择和性能监控工具的应用,旨在帮助读者更好地理解和应用Linux于云计算场景。 ###
98 3
|
4月前
|
存储 C语言 iOS开发
MacOS环境-手写操作系统-48-让内核从错误中恢复
MacOS环境-手写操作系统-48-让内核从错误中恢复
69 0
|
4月前
|
存储 API C语言
MacOS环境-手写操作系统-46,47-C语言开发应用程序
MacOS环境-手写操作系统-46,47-C语言开发应用程序
54 0
|
4月前
|
编译器 API C语言
MacOS环境-手写操作系统-45-C语言开发应用程序
MacOS环境-手写操作系统-45-C语言开发应用程序
73 0
|
4月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
43 0
|
4天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
43 10
|
3月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
114 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
131 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
30天前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
70 7
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
66 5