3 切换输入窗口(harib14c)
命令行窗口这东西,如果不能在里面输入字符的话就毫无用处了,因此我们得让它能接受字符输入才行。不过现在无论我们输入什么字符,都会跑到任务A的窗口中去,所以为了能够往命令行窗口中输入字符,我们要让系统在按下“Tab”键的时候,将输入窗口切换到命令行窗口上去。
虽说是切换窗口,其实我们只是先将窗口标题栏的颜色改一改而已啦(苦笑)。真正负责输入切换的部分我们下一节再写,改变先从表面工夫开始吧。
■■■■■
要改变窗口标题栏颜色,最好将make_window8中描绘窗口标题栏的代码,和描绘窗口剩余部分的代码区分开来,我们将这个函数改写一下。
本次的bootpack.c节选
void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act)
{
boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, xsize - 1, 0 );
boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, xsize - 2, 1 );
boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, 0, ysize - 1);
boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, 1, ysize - 2);
boxfill8(buf, xsize, COL8_848484, xsize - 2, 1, xsize - 2, ysize - 2);
boxfill8(buf, xsize, COL8_000000, xsize - 1, 0, xsize - 1, ysize - 1);
boxfill8(buf, xsize, COL8_C6C6C6, 2, 2, xsize - 3, ysize - 3);
boxfill8(buf, xsize, COL8_848484, 1, ysize - 2, xsize - 2, ysize - 2);
boxfill8(buf, xsize, COL8_000000, 0, ysize - 1, xsize - 1, ysize - 1);
make_wtitle8(buf, xsize, title, act);
return;
}
void make_wtitle8(unsigned char *buf, int xsize, char *title, char act)
{
static char closebtn[14][16] = {
"OOOOOOOOOOOOOOO@",
"OQQQQQQQQQQQQQ$@",
"OQQQQQQQQQQQQQ$@",
"OQQQ@@QQQQ@@QQ$@",
"OQQQQ@@QQ@@QQQ$@",
"OQQQQQ@@@@QQQQ$@",
"OQQQQQQ@@QQQQQ$@",
"OQQQQQ@@@@QQQQ$@",
"OQQQQ@@QQ@@QQQ$@",
"OQQQ@@QQQQ@@QQ$@",
"OQQQQQQQQQQQQQ$@",
"OQQQQQQQQQQQQQ$@",
"O$$$$$$$$$$$$$$@",
"@@@@@@@@@@@@@@@@"
};
int x, y;
char c, tc, tbc;
if (act != 0) {
tc = COL8_FFFFFF;
tbc = COL8_000084;
} else {
tc = COL8_C6C6C6;
tbc = COL8_848484;
}
boxfill8(buf, xsize, tbc, 3, 3, xsize - 4, 20);
putfonts8_asc(buf, xsize, 24, 4, tc, title);
for (y = 0; y < 14; y++) {
for (x = 0; x < 16; x++) {
c = closebtn[y][x];
if (c == '@') {
c = COL8_000000;
} else if (c == '$') {
c = COL8_848484;
} else if (c == 'Q') {
c = COL8_C6C6C6;
} else {
c = COL8_FFFFFF;
}
buf[(5 + y) * xsize + (xsize - 21 + x)] = c;
}
}
return;
}
这样就差不多了,接下来我们来改写HariMain。
本次的bootpack.c节选
void HariMain(void)
{
(中略)
int key_to = 0; /*这里! */
(中略)
for (;;) {
io_cli();
if (fifo32_status(&fifo) == 0) {
(中略)
} else {
i = fifo32_get(&fifo);
io_sti();
if (256 <= i && i <= 511) { /*键盘数据 */
sprintf(s, "%02X", i - 256);
putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);
if (i < 0x54 + 256) {
(中略)
}
if (i == 256 + 0x0e && cursor_x > 8) { /*退格键*/
(中略)
}
/*从此开始*/ if (i == 256 + 0x0f) { /* Tab键*/
if (key_to == 0) {
key_to = 1;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", 0);
make_wtitle8(buf_cons, sht_cons->bxsize, "console", 1);
} else {
key_to = 0;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", 1);
make_wtitle8(buf_cons, sht_cons->bxsize, "console", 0);
}
sheet_refresh(sht_win, 0, 0, sht_win->bxsize, 21);
sheet_refresh(sht_cons, 0, 0, sht_cons->bxsize, 21);
/*到此结束*/ }
/*重新显示光标*/
boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x + 7, 43);
sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);
} else if (512 <= i && i <= 767) { /*鼠标数据*/
(中略)
} else if (i <= 1) { /*光标用定时器*/
(中略)
}
}
}
}
这段代码的重点在于key_to这个变量,用于记录键盘输入(key)应该发送到(to)哪里。为0则发送到任务A,为1则发送到命令行窗口任务。
还是一如既往地“make run”,然后按下Tab键试试看。
按下Tab键之后
哇,颜色变了耶!真不错啊。心情好激动,先按个10次Tab键看看。嗒嗒嗒嗒……
然后又很得意地输入了“abc”试试看,果然,结果是这个样子。
果然还是不行啊!
好,接下来我们就来实现键盘输入啦!