mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-05-11 10:35:59 +08:00
应用程序运行时关闭命令行窗口
This commit is contained in:
@@ -46,7 +46,7 @@ void HariMain(void)
|
|||||||
};
|
};
|
||||||
int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1;
|
int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1;
|
||||||
int j, x, y, mmx = -1, mmy = -1, mmx2 = 0;
|
int j, x, y, mmx = -1, mmy = -1, mmx2 = 0;
|
||||||
struct SHEET *sht = 0, *key_win;
|
struct SHEET *sht = 0, *key_win, *sht2;
|
||||||
|
|
||||||
init_gdtidt();
|
init_gdtidt();
|
||||||
init_pic();
|
init_pic();
|
||||||
@@ -195,8 +195,8 @@ void HariMain(void)
|
|||||||
io_cli(); /*强制结束处理时禁止任务切换*/
|
io_cli(); /*强制结束处理时禁止任务切换*/
|
||||||
task->tss.eax = (int) &(task->tss.esp0);
|
task->tss.eax = (int) &(task->tss.esp0);
|
||||||
task->tss.eip = (int) asm_end_app;
|
task->tss.eip = (int) asm_end_app;
|
||||||
task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/
|
|
||||||
io_sti();
|
io_sti();
|
||||||
|
task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */
|
if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */
|
||||||
@@ -267,10 +267,14 @@ void HariMain(void)
|
|||||||
io_cli(); /*强制结束处理时禁止任务切换*/
|
io_cli(); /*强制结束处理时禁止任务切换*/
|
||||||
task->tss.eax = (int) &(task->tss.esp0);
|
task->tss.eax = (int) &(task->tss.esp0);
|
||||||
task->tss.eip = (int) asm_end_app;
|
task->tss.eip = (int) asm_end_app;
|
||||||
task_run(task, -1, 0);
|
|
||||||
io_sti();
|
io_sti();
|
||||||
|
task_run(task, -1, 0);
|
||||||
} else { /*命令行窗口*/
|
} else { /*命令行窗口*/
|
||||||
task = sht->task;
|
task = sht->task;
|
||||||
|
sheet_updown(sht, -1); /*暂且隐藏该图层*/
|
||||||
|
keywin_off(key_win);
|
||||||
|
key_win = shtctl->sheets[shtctl->top - 1];
|
||||||
|
keywin_on(key_win);
|
||||||
io_cli();
|
io_cli();
|
||||||
fifo32_put(&task->fifo, 4);
|
fifo32_put(&task->fifo, 4);
|
||||||
io_sti();
|
io_sti();
|
||||||
@@ -301,6 +305,10 @@ void HariMain(void)
|
|||||||
close_console(shtctl->sheets0 + (i - 768));
|
close_console(shtctl->sheets0 + (i - 768));
|
||||||
} else if (1024 <= i && i <= 2023) {
|
} else if (1024 <= i && i <= 2023) {
|
||||||
close_constask(taskctl->tasks0 + (i - 1024));
|
close_constask(taskctl->tasks0 + (i - 1024));
|
||||||
|
} else if (2024 <= i && i <= 2279) { /*只关闭命令行窗口*/
|
||||||
|
sht2 = shtctl->sheets0 + (i - 2024);
|
||||||
|
memman_free_4k(memman, (int) sht2->buf, 256 * 165);
|
||||||
|
sheet_free(sht2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ void console_task(struct SHEET *sheet, int memtotal)
|
|||||||
cons.cur_c = -1;
|
cons.cur_c = -1;
|
||||||
task->cons = &cons;
|
task->cons = &cons;
|
||||||
|
|
||||||
if (sheet != 0) {
|
if (cons.sht != 0) {
|
||||||
cons.timer = timer_alloc();
|
cons.timer = timer_alloc();
|
||||||
timer_init(cons.timer, &task->fifo, 1);
|
timer_init(cons.timer, &task->fifo, 1);
|
||||||
timer_settime(cons.timer, 50);
|
timer_settime(cons.timer, 50);
|
||||||
@@ -35,7 +35,7 @@ void console_task(struct SHEET *sheet, int memtotal)
|
|||||||
} else {
|
} else {
|
||||||
i = fifo32_get(&task->fifo);
|
i = fifo32_get(&task->fifo);
|
||||||
io_sti();
|
io_sti();
|
||||||
if (i <= 1) { /*光标用定时器*/
|
if (i <= 1 && cons.sht != 0) { /*光标用定时器*/
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
timer_init(cons.timer, &task->fifo, 0); /*下次置0 */
|
timer_init(cons.timer, &task->fifo, 0); /*下次置0 */
|
||||||
if (cons.cur_c >= 0) {
|
if (cons.cur_c >= 0) {
|
||||||
@@ -53,7 +53,10 @@ void console_task(struct SHEET *sheet, int memtotal)
|
|||||||
cons.cur_c = COL8_FFFFFF;
|
cons.cur_c = COL8_FFFFFF;
|
||||||
}
|
}
|
||||||
if (i == 3) { /*光标OFF */
|
if (i == 3) { /*光标OFF */
|
||||||
boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
|
if (cons.sht != 0) {
|
||||||
|
boxfill8(cons.sht->buf, cons.sht->bxsize, COL8_000000,
|
||||||
|
cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
|
||||||
|
}
|
||||||
cons.cur_c = -1;
|
cons.cur_c = -1;
|
||||||
}
|
}
|
||||||
if (i == 4) { /*点击命令行窗口的“×”按钮*/
|
if (i == 4) { /*点击命令行窗口的“×”按钮*/
|
||||||
@@ -74,7 +77,7 @@ void console_task(struct SHEET *sheet, int memtotal)
|
|||||||
cmdline[cons.cur_x / 8 - 2] = 0;
|
cmdline[cons.cur_x / 8 - 2] = 0;
|
||||||
cons_newline(&cons);
|
cons_newline(&cons);
|
||||||
cons_runcmd(cmdline, &cons, fat, memtotal); /*运行命令*/
|
cons_runcmd(cmdline, &cons, fat, memtotal); /*运行命令*/
|
||||||
if (sheet == 0) {
|
if (cons.sht == 0) {
|
||||||
cmd_exit(&cons, fat);
|
cmd_exit(&cons, fat);
|
||||||
}
|
}
|
||||||
/*显示提示符*/
|
/*显示提示符*/
|
||||||
@@ -89,11 +92,12 @@ void console_task(struct SHEET *sheet, int memtotal)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*重新显示光标*/
|
/*重新显示光标*/
|
||||||
if (sheet != 0) {
|
if (cons.sht != 0) {
|
||||||
if (cons.cur_c >= 0) {
|
if (cons.cur_c >= 0) {
|
||||||
boxfill8(sheet->buf, sheet->bxsize, cons.cur_c, cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
|
boxfill8(cons.sht->buf, cons.sht->bxsize, cons.cur_c,
|
||||||
|
cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15);
|
||||||
}
|
}
|
||||||
sheet_refresh(sheet, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16);
|
sheet_refresh(cons.sht, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,8 +112,8 @@ void cons_putchar(struct CONSOLE *cons, int chr, char move)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
if (cons->sht != 0) {
|
if (cons->sht != 0) {
|
||||||
putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, " ", 1);
|
putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, " ", 1);
|
||||||
cons->cur_x += 8;
|
|
||||||
}
|
}
|
||||||
|
cons->cur_x += 8;
|
||||||
if (cons->cur_x == 8 + 240) {
|
if (cons->cur_x == 8 + 240) {
|
||||||
cons_newline(cons);
|
cons_newline(cons);
|
||||||
}
|
}
|
||||||
@@ -194,8 +198,8 @@ void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal)
|
|||||||
} else if (strncmp(cmdline, "start ", 6) == 0) {
|
} else if (strncmp(cmdline, "start ", 6) == 0) {
|
||||||
cmd_start(cons, cmdline, memtotal);
|
cmd_start(cons, cmdline, memtotal);
|
||||||
} else if (strncmp(cmdline, "ncst ", 5) == 0) {
|
} else if (strncmp(cmdline, "ncst ", 5) == 0) {
|
||||||
cmd_ncst(cons, cmdline, memtotal);
|
cmd_ncst(cons, cmdline, memtotal);
|
||||||
}else if (cmdline[0] != 0) {
|
} else if (cmdline[0] != 0) {
|
||||||
if (cmd_app(cons, fat, cmdline) == 0) {
|
if (cmd_app(cons, fat, cmdline) == 0) {
|
||||||
/*不是命令,不是应用程序,也不是空行*/
|
/*不是命令,不是应用程序,也不是空行*/
|
||||||
cons_putstr0(cons, "Bad command.\n\n");
|
cons_putstr0(cons, "Bad command.\n\n");
|
||||||
@@ -403,6 +407,7 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int
|
|||||||
struct CONSOLE *cons = task->cons;
|
struct CONSOLE *cons = task->cons;
|
||||||
struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
|
struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
|
||||||
struct SHEET *sht;
|
struct SHEET *sht;
|
||||||
|
struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec);
|
||||||
int *reg = &eax + 1; /* eax后面的地址*/
|
int *reg = &eax + 1; /* eax后面的地址*/
|
||||||
/*强行改写通过PUSHAD保存的值*/
|
/*强行改写通过PUSHAD保存的值*/
|
||||||
/* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */
|
/* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */
|
||||||
@@ -490,6 +495,13 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int
|
|||||||
if (i == 3) { /*光标OFF */
|
if (i == 3) { /*光标OFF */
|
||||||
cons->cur_c = -1;
|
cons->cur_c = -1;
|
||||||
}
|
}
|
||||||
|
if (i == 4) { /*只关闭命令行窗口*/
|
||||||
|
timer_cancel(cons->timer);
|
||||||
|
io_cli();
|
||||||
|
fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/
|
||||||
|
cons->sht = 0;
|
||||||
|
io_sti();
|
||||||
|
}
|
||||||
if (i >= 256) { /*键盘数据(通过任务A)等*/
|
if (i >= 256) { /*键盘数据(通过任务A)等*/
|
||||||
reg[7] = i - 256;
|
reg[7] = i - 256;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user