@@ -5,8 +5,8 @@
# define KEYCMD_LED 0xed
int keywin_off ( struct SHEET * key_win , struct SHEET * sht_win , int cur_c , int cur_x );
int keywin_on ( struct SHEET * key_win , struct SHEET * sht_win , int cur_c );
void keywin_off ( struct SHEET * key_win ) ;
void keywin_on ( struct SHEET * key_win ) ;
void HariMain ( void )
{
@@ -15,14 +15,13 @@ void HariMain(void)
char s [ 40 ] ;
struct FIFO32 fifo , keycmd ;
int fifobuf [ 128 ] , keycmd_buf [ 32 ] ;
int mx , my , i , cursor_x , cursor_c ;
int mx , my , i ;
unsigned int memtotal ;
struct MOUSE_DEC mdec ;
struct MEMMAN * memman = ( struct MEMMAN * ) MEMMAN_ADDR ;
unsigned char * buf_back , buf_mouse [ 256 ] , * buf_win , * buf_ cons [ 2 ] ;
unsigned char * buf_back , buf_mouse [ 256 ] , * buf_cons [ 2 ] ;
struct SHEET * sht_back , * sht_mouse , * sht_win , * sht_cons [ 2 ] ;
struct TASK * task_a , * task_cons [ 2 ] ;
struct TIMER * timer ;
struct TASK * task_a , * task_cons [ 2 ] , * task ;
static char keytable0 [ 0x80 ] = {
0 , 0 , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' 0 ' , ' - ' , ' ^ ' , 0 , 0 ,
' Q ' , ' W ' , ' E ' , ' R ' , ' T ' , ' Y ' , ' U ' , ' I ' , ' O ' , ' P ' , ' @ ' , ' [ ' , 0 , 0 , ' A ' , ' S ' ,
@@ -100,18 +99,6 @@ void HariMain(void)
sht_cons [ i ] - > flags | = 0x20 ; /*有光标*/
}
/* sht_win */
sht_win = sheet_alloc ( shtctl ) ;
buf_win = ( unsigned char * ) memman_alloc_4k ( memman , 160 * 52 ) ;
sheet_setbuf ( sht_win , buf_win , 144 , 52 , - 1 ) ; /* 无透明色 */
make_window8 ( buf_win , 144 , 52 , " task_a " , 1 ) ;
make_textbox8 ( sht_win , 8 , 28 , 128 , 16 , COL8_FFFFFF ) ;
cursor_x = 8 ;
cursor_c = COL8_FFFFFF ;
timer = timer_alloc ( ) ;
timer_init ( timer , & fifo , 1 ) ;
timer_settime ( timer , 50 ) ;
/* sht_mouse */
sht_mouse = sheet_alloc ( shtctl ) ;
sheet_setbuf ( sht_mouse , buf_mouse , 16 , 16 , 99 ) ;
@@ -127,9 +114,9 @@ void HariMain(void)
sheet_updown ( sht_back , 0 ) ;
sheet_updown ( sht_cons [ 1 ] , 1 ) ;
sheet_updown ( sht_cons [ 0 ] , 2 ) ;
sheet_updown ( sht_win , 3 ) ;
sheet_updown ( sht_mouse , 4 ) ;
key_ win = sht _win;
sheet_updown ( sht_mouse , 3 ) ;
key_win = sht_cons [ 0 ] ;
keywin_on ( key _win) ;
/*为了避免和键盘当前状态冲突,在一开始先进行设置*/
fifo32_put ( & keycmd , KEYCMD_LED ) ;
@@ -151,7 +138,6 @@ void HariMain(void)
io_sti ( ) ;
if ( key_win - > flags = = 0 ) { /*输入窗口被关闭*/
key_win = shtctl - > sheets [ shtctl - > top - 1 ] ;
cursor_c = keywin_on ( key_win , sht_win , cursor_c ) ;
}
if ( 256 < = i & & i < = 511 ) { /* 键盘数据*/
if ( i < 0x80 + 256 ) { /*将按键编码转换为字符编码*/
@@ -168,42 +154,17 @@ void HariMain(void)
s [ 0 ] + = 0x20 ; /*将大写字母转换为小写字母*/
}
}
if ( s [ 0 ] ! = 0 ) { /*一般字符*/
if ( key_win = = sht_win ) { /*发送给任务A */
if ( cursor_x < 128 ) {
/*显示一个字符之后将光标后移一位*/
s [ 1 ] = 0 ;
putfonts8_asc_sht ( sht_win , cursor_x , 28 , COL8_000000 , COL8_FFFFFF , s , 1 ) ;
cursor_x + = 8 ;
}
} else { /*发送给命令行窗口*/
fifo32_put ( & key_win - > task - > fifo , s [ 0 ] + 256 ) ;
}
}
if ( i = = 256 + 0x0e ) { /* 退格键 */
if ( key_win = = sht_win ) { /*发送给任务A */
if ( cursor_x > 8 ) {
/*用空白擦除光标后将光标前移一位*/
putfonts8_asc_sht ( sht_win , cursor_x , 28 , COL8_000000 , COL8_FFFFFF , " " , 1 ) ;
cursor_x - = 8 ;
}
} else { /*发送给命令行窗口*/
fifo32_put ( & key_win - > task - > fifo , 8 + 256 ) ;
}
}
if ( i = = 256 + 0x1c ) { /*回车键*/
if ( key_win ! = sht_win ) { /*发送至命令行窗口*/
fifo32_put ( & key_win - > task - > fifo , 10 + 256 ) ;
}
if ( s [ 0 ] ! = 0 ) { /*一般字符、退格键、回车键 */
fifo32_put ( & key_win - > task - > fifo , s [ 0 ] + 256 ) ;
}
if ( i = = 256 + 0x0f ) { /* Tab键 */
cursor_c = keywin_off ( key_win , sht_win , cursor_c , cursor_x );
keywin_off ( key_win ) ;
j = key_win - > height - 1 ;
if ( j = = 0 ) {
j = shtctl - > top - 1 ;
}
key_win = shtctl - > sheets [ j ] ;
cursor_c = keywin_on ( key_win , sht_win , cursor_c );
keywin_on ( key_win ) ;
}
if ( i = = 256 + 0x2a ) { /*左Shift ON */
key_shift | = 1 ;
@@ -232,13 +193,15 @@ void HariMain(void)
fifo32_put ( & keycmd , KEYCMD_LED ) ;
fifo32_put ( & keycmd , key_leds ) ;
}
if ( i = = 256 + 0x3b & & key_shift ! = 0 & & task_cons [ 0 ] - > tss . ss0 ! = 0 ) { /* Shift+F1 */
cons = ( struct CONSOLE * ) * ( ( int * ) 0x0fec ) ;
cons_putstr0 ( cons , " \n Break(key) : \n " ) ;
io_cli ( ) ; /*强制结束处理时禁止任务切换*/
task_cons [ 0 ] - > tss . eax = ( int ) & ( task_cons [ 0 ] - > tss . esp0 ) ;
task_cons [ 0 ] - > tss . eip = ( int ) asm_end_app ;
io_sti ( ) ;
if ( i = = 256 + 0x3b & & key_shift ! = 0 ) {
task = key_win - > task ;
if ( task ! = 0 & & task - > tss . ss0 ! = 0 ) { /* Shift+F1 */
cons_putstr0 ( cons , " \n Break(key) : \n " ) ;
io_cli ( ) ; /*强制结束处理时禁止任务切换*/
task - > tss . eax = ( int ) & ( task - > tss . esp0 ) ;
task - > tss . eip = ( int ) asm_end_app ;
io_sti ( ) ;
}
}
if ( i = = 256 + 0x57 & & shtctl - > top > 2 ) { /* F11 */
sheet_updown ( shtctl - > sheets [ 1 ] , shtctl - > top - 1 ) ;
@@ -250,11 +213,6 @@ void HariMain(void)
wait_KBC_sendready ( ) ;
io_out8 ( PORT_KEYDAT , keycmd_wait ) ;
}
/*重新显示光标*/
if ( cursor_c > = 0 ) {
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 ) { /* 鼠标数据*/
if ( mouse_decode ( & mdec , i - 512 ) ! = 0 ) {
/* 已经收集了3字节的数据, 移动光标 */
@@ -287,9 +245,9 @@ void HariMain(void)
if ( sht - > buf [ y * sht - > bxsize + x ] ! = sht - > col_inv ) {
sheet_updown ( sht , shtctl - > top - 1 ) ;
if ( sht ! = key_win ) {
cursor_c = keywin_off ( key_win , sht_win , cursor_c , cursor_x );
keywin_off ( key_win ) ;
key_win = sht ;
cursor_c = keywin_on ( key_win , sht_win , cursor_c ) ; /*到此结束*/
keywin_on ( key_win ) ;
}
if ( 3 < = x & & x < sht - > bxsize - 3 & & 3 < = y & & y < 21 ) {
mmx = mx ; /*进入窗口移动模式*/
@@ -298,11 +256,11 @@ void HariMain(void)
if ( sht - > bxsize - 21 < = x & & x < sht - > bxsize - 5 & & 5 < = y & & y < 19 ) {
/*点击“×”按钮*/
if ( ( sht - > flags & 0x10 ) ! = 0 ) { /*该窗口是否为应用程序窗口?*/
cons = ( struct CONSOLE * ) * ( ( int * ) 0x0fec ) ;
task = sht - > task ;
cons_putstr0 ( cons , " \n Break(mouse) : \n " ) ;
io_cli ( ) ; /*强制结束处理中 禁止切换 任务*/
task_cons [ 0 ] - > tss . eax = ( int ) & ( task_cons [ 0 ] - > tss . esp0 ) ;
task_cons [ 0 ] - > tss . eip = ( int ) asm_end_app ;
io_cli ( ) ; /*强制结束处理时 禁止任务切换 */
task - > tss . eax = ( int ) & ( task - > tss . esp0 ) ; /*到此结束*/
task - > tss . eip = ( int ) asm_end_app ;
io_sti ( ) ;
}
}
@@ -324,51 +282,25 @@ void HariMain(void)
}
}
} else if ( i < = 1 ) { /* 光标用定时器*/
if ( i ! = 0 ) {
timer_init ( timer , & fifo , 0 ) ; /* 下面设定0 */
if ( cursor_c > = 0 ) {
cursor_c = COL8_000000 ;
}
} else {
timer_init ( timer , & fifo , 1 ) ; /* 下面设定1 */
if ( cursor_c > = 0 ) {
cursor_c = COL8_FFFFFF ;
}
}
timer_settime ( timer , 50 ) ;
if ( cursor_c > = 0 ) {
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 ) ;
}
}
}
}
}
int keywin_off ( struct SHEET * key_win , struct SHEET * sht_win , int cur_c , int cur_x )
void keywin_off ( struct SHEET * key_win )
{
change_wtitle8 ( key_win , 0 ) ;
if ( key_win = = sht_win ) {
cur_c = - 1 ; /*删除光标 */
boxfill8 ( sht_win - > buf , sht_win - > bxsize , COL8_FFFFFF , cur_x , 28 , cur_x + 7 , 43 ) ;
} else {
if ( ( key_win - > flags & 0x20 ) ! = 0 ) {
fifo32_put ( & key_win - > task - > fifo , 3 ) ; /*命令行窗口光标OFF */
}
if ( ( key_win - > flags & 0x20 ) ! = 0 ) {
fifo32_put ( & key_win - > task - > fifo , 3 ) ; /*命令行窗口光标OFF */
}
return cur_c ;
return ;
}
int keywin_on ( struct SHEET * key_win , struct SHEET * sht_win , int cur_c )
void keywin_on ( struct SHEET * key_win )
{
change_wtitle8 ( key_win , 1 ) ;
if ( key_win = = sht_win ) {
cur_c = COL8_000000 ; /*显示光标 */
} else {
if ( ( key_win - > flags & 0x20 ) ! = 0 ) {
fifo32_put ( & key_win - > task - > fifo , 2 ) ; /*命令行窗口光标ON */
}
if ( ( key_win - > flags & 0x20 ) ! = 0 ) {
fifo32_put ( & key_win - > task - > fifo , 2 ) ; /*命令行窗口光标ON */
}
return cur_c ;
return ;
}