CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
KeyDev.txt221 linesDownload Raw Back to Kernel
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