hschumann2/TempleOS-Source-Code
0838
1 2U0 PutKey(I64 ch=0,I64 sc=0)3{//See Keyboard Devices.4 CKeyDevEntry *tmpk;5 if (ch||sc) {6 tmpk=keydev.put_key_head.next;7 if (!Bt(&Fs->display_flags,DISPLAYf_SILENT)) {8 if (kbd.scan_code & SCF_SCROLL && sys_focus_task==Fs)9 while (kbd.scan_code & SCF_SCROLL)10 Yield; //Wait on SCROLL LOCK Key11 while (tmpk!=&keydev.put_key_head) {12 if ((!(sc&SCF_KEY_DESC) || tmpk->flags & KDF_HAS_DESCS) &&13 (*tmpk->put_key)(ch,sc))14 break;15 tmpk=tmpk->next;16 }17 }18 }19}20 21U0 PutChars(U64 ch)22{//Output chars. Up to 8 chars in a single U64.23//Don't use this. See Print() shortcut.24 while (ch) {25 PutKey(ch&255,0);26 ch>>=8;27 }28}29 30U0 PutS(U8 *st)31{//Use Print(). See Keyboard Devices.32//Don't use this. See Print() shortcut.33 I64 ch;34 U8 *ptr;35 Bool cont=TRUE;36 if (!st) return;37 CKeyDevEntry *tmpk=keydev.put_key_head.next;38 if (!Bt(&Fs->display_flags,DISPLAYf_SILENT)) {39 if (kbd.scan_code & SCF_SCROLL && sys_focus_task==Fs)40 while (kbd.scan_code & SCF_SCROLL)41 Yield;42 while (cont && tmpk!=&keydev.put_key_head) {43 if (tmpk->put_s) {44 if ((*tmpk->put_s)(st))45 break;46 } else {47 ptr=st;48 while (ch=*ptr++)49 if ((*tmpk->put_key)(ch,0))50 cont=FALSE;51 }52 tmpk=tmpk->next;53 }54 }55}56 57U0 KeyDescSet(U8 *fmt,...)58{//Call this from key hndlr to report desc in KeyMap().59 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);60 StrCpy(keydev.desc,buf);61 keydev.hndlr=Caller;62 Free(buf);63}64 65U0 KeyDevRem(CKeyDevEntry *tmpk)66{//Remove StdOut hook and free.67 QueRem(tmpk);68 Free(tmpk);69}70 71CKeyDevEntry *KeyDevAdd(Bool (*fp_put_key)(I64 ch,I64 sc),72 Bool (*fp_puts)(U8 *st),I64 priority,Bool key_descs=FALSE)73{//Places hook in StdOut chain. See Keyboard Devices.74 CKeyDevEntry *tmpk=keydev.put_key_head.last,75 *tmpk1=ACAlloc(sizeof(CKeyDevEntry));76 tmpk1->put_key=fp_put_key;77 tmpk1->put_s=fp_puts;78 tmpk1->priority=priority;79 if (key_descs)80 tmpk1->flags|=KDF_HAS_DESCS;81 while (tmpk->priority>priority)82 tmpk=tmpk->last;83 QueIns(tmpk1,tmpk);84 if (tmpk->priority==priority)85 KeyDevRem(tmpk);86 return tmpk1;87}88 89Bool KDRawPutKey(I64 ch,I64)90{91 if (IsRaw) {92 RawPutChar(ch);93 return TRUE;94 } else95 return FALSE;96}97 98Bool KDRawPutS(U8 *st)99{100 I64 ch;101 if (IsRaw) {102 while (ch=*st++)103 RawPutChar(ch);104 return TRUE;105 } else106 return FALSE;107}108 109Bool KDInputFilterPutKey(I64 ch,I64 scan_code)110{111 if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) {112 Msg(MSG_KEY_DOWN,ch,scan_code);113 return TRUE;114 } else115 return FALSE;116}117 118Bool KDInputFilterPutS(U8 *st)119{120 I64 ch;121 if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) {122 while (ch=*st++)123 Msg(MSG_KEY_DOWN,ch,0);124 return TRUE;125 } else126 return FALSE;127}128 129U0 CtrlAltDel(I64)130{131 LBts(sys_ctrl_alt_flags,CTRL_ALT_DEL);132}133 134U0 CtrlAltC(I64)135{136 LBts(sys_ctrl_alt_flags,CTRL_ALT_C);137}138 139U0 CtrlAltD(I64)140{141 if (!IsDbgMode) {142 if (Fs==Gs->idle_task)143 BptS(sys_winmgr_task->rip,sys_winmgr_task);144 else145 BptS(*keydev.ctrl_alt_ret_addr);146 }147}148 149U0 CtrlAltF(I64)150{151 SwapI64(&text.font,&text.aux_font);152}153 154U0 CtrlAltM(I64)155{156 Mute(!IsMute);157}158 159U0 CtrlAltN(I64)160{161 LBts(sys_ctrl_alt_flags,CTRL_ALT_TAB);162}163 164U0 CtrlAltT(I64)165{166 User;167}168 169U0 CtrlAltV(I64)170{171 VGAFlush;172}173 174U0 CtrlAltX(I64)175{176 LBts(sys_ctrl_alt_flags,CTRL_ALT_X);177}178 179U0 CtrlAltCBSet(U8 ch,U0 (*fp_hndlr)(I64 sc),180 U8 *no_shift_desc=NULL,U8 *shift_desc=NULL,Bool in_irq=FALSE)181{//Set callback for <CTRL-ALT-letter>.182 ch=ToUpper(ch)-'A';183 if (ch<26) {184 keydev.fp_ctrl_alt_cbs[ch]=fp_hndlr;185 186 Free(keydev.ctrl_alt_no_shift_descs[ch]);187 if (no_shift_desc)188 keydev.ctrl_alt_no_shift_descs[ch]=AStrNew(no_shift_desc);189 else190 keydev.ctrl_alt_no_shift_descs[ch]=NULL;191 192 Free(keydev.ctrl_alt_shift_descs[ch]);193 if (shift_desc)194 keydev.ctrl_alt_shift_descs[ch]=AStrNew(shift_desc);195 else196 keydev.ctrl_alt_shift_descs[ch]=NULL;197 198 BEqu(&keydev.ctrl_alt_in_irq_flags,ch,in_irq);199 }200}201 202U0 KeyDevInit()203{204 keydev.fp_ctrl_alt_cbs =CAlloc(26*sizeof(U8 *));205 keydev.ctrl_alt_no_shift_descs=CAlloc(26*sizeof(U8 *));206 keydev.ctrl_alt_shift_descs =CAlloc(26*sizeof(U8 *));207 keydev.ctrl_alt_in_irq_flags =0;208 MemSet(&keydev.put_key_head,0,sizeof(CKeyDevEntry));209 QueInit(&keydev.put_key_head);210 KeyDevAdd(&KDInputFilterPutKey,&KDInputFilterPutS,0x40000000,FALSE);211 KeyDevAdd(&KDRawPutKey,&KDRawPutS,0x60000000,FALSE);212 CtrlAltCBSet('C',&CtrlAltC,"Cmd /Break Execution",,TRUE);213 CtrlAltCBSet('D',&CtrlAltD,"Cmd /Enter Debugger",,TRUE);214 CtrlAltCBSet('F',&CtrlAltF,"Cmd /Toggle Aux Font");215 CtrlAltCBSet('M',&CtrlAltM,"Cmd /Toggle Mute");216 CtrlAltCBSet('N',&CtrlAltN,"Cmd /Next Focus Task",,TRUE);217 CtrlAltCBSet('T',&CtrlAltT,"Cmd /Terminal Window");218 CtrlAltCBSet('V',&CtrlAltV,"Cmd /VGA Flush",,TRUE);219 CtrlAltCBSet('X',&CtrlAltX,"Cmd /Kill Focused Task",,TRUE);220}221 