00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "dev/keyboard/keyboard.h"
00018 #include "common/ktypes.h"
00019 #include "core/kio.h"
00020 #include "core/kstdio.h"
00021 #include "core/kint.h"
00022 #include "common/string.h"
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 boolean _ctrl = _false, _alt = _false, _shift = _false, _caps = _false;
00052
00053
00054
00055 boolean make = _true;
00056
00057 void handle_KBD()
00058 {
00059 DB scan, ch, i;
00060 MSG mymsg;
00061 static DW state;
00062 static DW prev;
00063
00064 scan = readData();
00065 ch = decode(scan);
00066
00067 switch(scan)
00068 {
00069 case _CTRL_PUSH:
00070 _ctrl = _true;
00071 state |= ST_CNTL;
00072 break;
00073
00074 case _CTRL_PULL:
00075 _ctrl = _false;
00076 state &= ~ST_CNTL;
00077 break;
00078
00079 case _ALT_PUSH:
00080 state |= ST_ALT;
00081 _alt = _true;
00082 break;
00083
00084 case _ALT_PULL:
00085 state &= ~ST_ALT;
00086 _alt = _false;
00087 break;
00088
00089 case _SHIFT_PUSH:
00090 state |= ST_SHIFT;
00091 _shift = _true;
00092 break;
00093
00094 case _R_SHIFT_PUSH :
00095 state |= ST_SHIFT;
00096 _shift = _true;
00097 break;
00098
00099 case _SHIFT_PULL:
00100 if(prev != 0xE0)
00101 {
00102 state &= ~ST_SHIFT;
00103 _shift = _false;
00104 }
00105 break;
00106
00107 case _R_SHIFT_PULL:
00108 if(prev != 0xE0)
00109 {
00110 state &= ~ST_SHIFT;
00111 _shift = _false;
00112 }
00113 break;
00114
00115 case _CAPS_TOGGLE:
00116 _caps = !_caps;
00117 break;
00118
00119 default:
00120 break;
00121 }
00122
00123 if(ch == DEL && _ctrl == _true && _alt == _true)
00124 {
00125
00126
00127 ginfo(40,200,"RESTART");
00128 lidt((IDT*)0x0);
00129 }
00130
00131 switch(ch)
00132 {
00133 case 0:
00134 break;
00135
00136 case VK_TAB:
00137 printf("\t");
00138 break;
00139
00140 default:
00141 mymsg.type = ACTION;
00142 mymsg.sub_type = KBD;
00143 mymsg.length = 6;
00144
00145
00146 if(_caps)
00147 state |= ST_CAPS;
00148 else
00149 state &= ~ST_CAPS;
00150
00151
00152 *((DW*)mymsg.msg_buf) = state;
00153 *((DW*)mymsg.msg_buf+1) = ch;
00154
00155 if(ksend(GUI_PID,&mymsg) == -1)
00156 panic("from mouse message overflow");
00157
00158 break;
00159 }
00160
00161 updateCursor();
00162 prev = scan;
00163 eoi();
00164 }
00165
00166 DB decode(DB in)
00167 {
00168 DB map[] = {
00169 0,ESC,'1','2','3','4','5','6','7','8', \
00170 '9','0','-','=','\b','\t','q','w','e','r', \
00171 't','y','u','i','o','p','[',']','\n',CTRL, \
00172 'a','s','d','f','g','h','j','k','l',';', \
00173 '\'','`',SHIFT,'\\','z','x','c','v','b','n', \
00174 'm',',','.','/',SHIFT,'*',ALT,' ',CAPS_LOCK,F1, \
00175 F2,F3,F4,F5,F6,F7,F8,F9,F10,NUM_LOCK, \
00176 SCROLL_LOCK,HOME,UP,PAGE_UP,'-',LEFT_A,'5',RIGHT_A,'+',END, \
00177 DOWN,PAGE_DOWN,INS,DEL,0,0,0,F11,F12};
00178
00179 if(in > 0x80)
00180 return 0;
00181 if(in >= (sizeof(map) / sizeof(map[0])))
00182 return 0;
00183 return map[in];
00184 }