mirror of https://github.com/minexew/Shrine.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.5 KiB
184 lines
4.5 KiB
#help_index "Help System" |
|
|
|
U8 *KeyMapKeyMStrPrint(I64 sc,U0 (*fp_hndlr)(I64 sc), |
|
U8 *desc,CTask *task=NULL) |
|
{ |
|
I64 i=9,k,c; |
|
U8 *st,*st2,*res,*ptr; |
|
CHashTable *old_hash=Fs->hash_table; |
|
st=ScanCode2KeyName(sc); |
|
if (sc&SCF_CTRL) i+=5; |
|
if (sc&SCF_ALT) i+=4; |
|
if (sc&(SCF_SHIFT|SCF_NO_SHIFT)) i+=6; |
|
if (TaskValidate(task)) |
|
Fs->hash_table=task->hash_table; |
|
st2=SrcEdLink(fp_hndlr,256); |
|
Fs->hash_table=old_hash; |
|
|
|
k=*desc(U32 *); |
|
if (k=='Edit') c=BLUE; |
|
else if (k=='Dol ') c=GREEN; |
|
else if (k=='Cmd ') c=RED; |
|
else c=BLACK; |
|
|
|
res=MStrPrint("%-*s $$FG,%d$$$$TX+UL+L+PU,\"%$$Q\",A=\"%s\"$$$$FG$$\n", |
|
i,st,c,desc,st2); |
|
Free(st); |
|
Free(st2); |
|
|
|
ptr=res; |
|
while (*ptr) { |
|
if (*ptr==CH_SPACE) |
|
*ptr=CH_SHIFT_SPACE; |
|
ptr++; |
|
} |
|
|
|
return res; |
|
} |
|
|
|
U0 KeyMapKeyPrint(I64 sc,U0 (*fp_hndlr)(I64 sc),U8 *desc,CTask *task=NULL) |
|
{ |
|
U8 *st=KeyMapKeyMStrPrint(sc,fp_hndlr,desc,task); |
|
"%s",st; |
|
Free(st); |
|
} |
|
|
|
U0 KeyMapCtrlAltFamily(Bool no_shift,Bool shift) |
|
{ |
|
I64 i,no_shift_f; |
|
if (no_shift && shift) |
|
no_shift_f=SCF_NO_SHIFT; |
|
else |
|
no_shift_f=0; |
|
if (no_shift) KeyMapKeyPrint(SC_DELETE+SCF_CTRL+SCF_ALT+no_shift_f, |
|
&Reboot,"Cmd /Reboot"); |
|
if (no_shift) KeyMapKeyPrint(SC_ESC+SCF_CTRL+SCF_ALT+no_shift_f, |
|
&User,"Cmd /Terminal Window"); |
|
if (no_shift) KeyMapKeyPrint(SC_TAB+SCF_CTRL+SCF_ALT+no_shift_f, |
|
&WinToTop,"Cmd /Next Focus Task"); |
|
|
|
for (i=0;i<26;i++) |
|
if (keydev.fp_ctrl_alt_cbs[i]) { |
|
if (no_shift && keydev.ctrl_alt_no_shift_descs[i]) |
|
KeyMapKeyPrint(Char2ScanCode(i+'a')+SCF_CTRL+SCF_ALT+no_shift_f, |
|
keydev.fp_ctrl_alt_cbs[i],keydev.ctrl_alt_no_shift_descs[i]); |
|
if (shift && keydev.ctrl_alt_shift_descs[i]) |
|
KeyMapKeyPrint(Char2ScanCode(i+'a')+SCF_CTRL+SCF_ALT+SCF_SHIFT, |
|
keydev.fp_ctrl_alt_cbs[i],keydev.ctrl_alt_shift_descs[i]); |
|
} |
|
} |
|
|
|
U0 KMComparePrepare(U8 *buf,I64 *src) |
|
{ |
|
I64 i,*dst=buf; |
|
U8 *ptr; |
|
if (src) { |
|
*dst++=*src++; |
|
*dst++=*src++; |
|
*dst++=*src++; |
|
*dst++=*src++; |
|
*dst(U8 *)=0; |
|
if (ptr=StrMatch("SHIFT",buf)) { |
|
for (i=0;i<5;i++) |
|
ptr[i]=CH_SHIFT_SPACE; |
|
if (ptr=StrMatch("$$",buf)) |
|
*ptr=255; |
|
} |
|
} else |
|
*buf=0; |
|
} |
|
|
|
I64 KMCompare(U8 *e1,U8 *e2) |
|
{ |
|
U8 buf1[STR_LEN],buf2[STR_LEN]; |
|
KMComparePrepare(buf1,e1); |
|
KMComparePrepare(buf2,e2); |
|
return StrCmp(buf1,buf2); |
|
} |
|
|
|
U0 KeyMapFamily2(U8 **entries,CTask *task,I64 scf) |
|
{ |
|
I64 i,arg1,arg2; |
|
for (i=0;i<256;i++) { |
|
arg2=scf|i|SCF_KEY_DESC; |
|
arg1=ScanCode2Char(arg2); |
|
*keydev.desc=0; |
|
keydev.hndlr=NULL; |
|
if (TaskValidate(task) && !Bt(&task->win_inhibit,WIf_SELF_KEY_DESC)) { |
|
if (task==Fs) |
|
PutKey(arg1,arg2); |
|
else |
|
PostMsg(task,MSG_KEY_DOWN,arg1,arg2); |
|
Refresh(0,TRUE); |
|
Sleep(1); //Open loop because might be no response. TODO: Drops msgs. |
|
} |
|
if (*keydev.desc && StrNCmp(keydev.desc,"Char /",7)) |
|
entries[i]=KeyMapKeyMStrPrint(arg2,keydev.hndlr,keydev.desc,task); |
|
} |
|
} |
|
|
|
U0 KeyMapFamily(CTask *task,I64 scf,Bool no_shift,Bool shift) |
|
{ |
|
I64 i,cnt=0; |
|
U8 **entries=CAlloc(2*256*sizeof(U8 *)),**ptr=entries; |
|
if (no_shift) { |
|
if (shift) |
|
KeyMapFamily2(ptr,task,scf+SCF_NO_SHIFT); |
|
else |
|
KeyMapFamily2(ptr,task,scf); |
|
ptr+=256; |
|
cnt+=256; |
|
} |
|
if (shift) { |
|
KeyMapFamily2(ptr,task,scf+SCF_SHIFT); |
|
ptr+=256; |
|
cnt+=256; |
|
} |
|
QSortI64(entries,cnt,&KMCompare); |
|
for (i=0;i<cnt;i++) |
|
if (entries[i]) { |
|
"%s",entries[i]; |
|
Free(entries[i]); |
|
} |
|
Free(entries); |
|
} |
|
|
|
public U0 KeyMap(CTask *task=NULL) |
|
{//Report desc of all keys. |
|
Bool old_key_desc; |
|
if (!task) task=Fs; |
|
old_key_desc=LBtr(&task->win_inhibit,WIf_SELF_KEY_DESC); |
|
DocMax; |
|
KeyMapFamily(task,0,TRUE,TRUE); |
|
KeyMapFamily(task,SCF_CTRL,TRUE,TRUE); |
|
KeyMapFamily(task,SCF_ALT,TRUE,TRUE); |
|
KeyMapCtrlAltFamily(TRUE,TRUE); |
|
LBEqu(&task->win_inhibit,WIf_SELF_KEY_DESC,old_key_desc); |
|
"\nKeyMap Completed.\n"; |
|
} |
|
|
|
#help_index "Help System/Training" |
|
public U0 TipOfDay(U8 *tip_file="::/Doc/Tips.DD") |
|
{//Print random tip-of-day from ::/Doc/Tips.DD. |
|
I64 i=RandU16; |
|
CDoc *doc=DocRead(tip_file),*doc2=DocNew; |
|
CDocEntry *doc_e=doc->head.next; |
|
"$$WW,1$$\n"; |
|
while (TRUE) { |
|
if (doc_e->type_u8==DOCT_TEXT && *doc_e->tag=='*') |
|
if (!i--) break; |
|
doc_e=doc_e->next; |
|
} |
|
if (doc_e->type_u8==DOCT_TEXT && *doc_e->tag=='*') { |
|
while (doc_e!=doc) { |
|
if (doc_e->type_u8!=DOCT_ERROR) |
|
DocInsEntry(doc2,DocEntryCopy(doc2,doc_e)); |
|
doc_e=doc_e->next; |
|
if (doc_e->type_u8==DOCT_TEXT && *doc_e->tag=='*') |
|
break; |
|
} |
|
} |
|
DocInsDoc(DocPut,doc2); |
|
DocDel(doc2); |
|
DocDel(doc); |
|
}
|
|
|