TempleOSCDV3.11.ISO
This commit is contained in:
1 parent
f8c05f98f4
commit
ed64d7e3b8
549 files changed
+10643
-12855
No files matched your search
+119
-160
@@ -1,178 +1,141 @@
|
||||
#help_index "Help System"
|
||||
|
||||
public U0 PressKeyHelp(CTask *task=NULL)
|
||||
{//Jump to key handlers src for key presses.
|
||||
I64 a1=0,a2=0;
|
||||
Bool old_preempt=Preempt;
|
||||
CTask *old_hash=Fs->hash_table;
|
||||
if (!task) task=Fs;
|
||||
|
||||
/*
|
||||
This feature is a burden in code. It would be nice to lst key
|
||||
cmds for all applications, but it makes the code too ugly.
|
||||
*/
|
||||
task=Fs;
|
||||
|
||||
Fs->hash_table=task->hash_table;
|
||||
"Press keys to show handler code.\n"
|
||||
"<SHIFT-ESC> to exit.\n"
|
||||
"Do not press <CTRL-ALT-keys>.\n";
|
||||
while (a1!=CH_ESC && a1!=CH_SHIFT_ESC) {
|
||||
GetMsg(&a1,&a2,1<<MSG_KEY_DOWN);
|
||||
*keydev.desc=0;
|
||||
keydev.handler=NULL;
|
||||
if (task==Fs)
|
||||
PutKey(a1,a2|SCF_KEY_DESC);
|
||||
else if (TaskValidate(task)) {
|
||||
PostMsg(task,MSG_KEY_DOWN,a1,a2|SCF_KEY_DESC);
|
||||
while (!keydev.handler)
|
||||
Yield;
|
||||
}
|
||||
if (*keydev.desc)
|
||||
E(keydev.handler,512);
|
||||
}
|
||||
U8 *KeyMapKeyMStrPrint(I64 sc,U0 (*fp_handler)(I64 sc),
|
||||
U8 *desc,CTask *task=NULL)
|
||||
{
|
||||
I64 i=9,k,c;
|
||||
U8 *st,*st2,*result,*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_handler,256);
|
||||
Fs->hash_table=old_hash;
|
||||
Preempt(old_preempt);
|
||||
|
||||
k=*desc(U32 *);
|
||||
if (k=='Edit') c=BLUE;
|
||||
else if (k=='Dol ') c=GREEN;
|
||||
else if (k=='Cmd ') c=RED;
|
||||
else c=BLACK;
|
||||
|
||||
result=MStrPrint("%-*s $$FG,%d$$$$TX+UL+L+PU,\"%Q\",A=\"%s\"$$$$FG$$\n",
|
||||
i,st,c,desc,st2);
|
||||
Free(st);
|
||||
Free(st2);
|
||||
|
||||
ptr=result;
|
||||
while (*ptr) {
|
||||
if (*ptr==CH_SPACE)
|
||||
*ptr=CH_SHIFT_SPACE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 KeyMapCtrlAltFamily()
|
||||
U0 KeyMapKeyPrint(I64 sc,U0 (*fp_handler)(I64 sc),U8 *desc,CTask *task=NULL)
|
||||
{
|
||||
I64 i,a2;
|
||||
U8 *st,*st2;
|
||||
|
||||
a2=SC_DELETE+SCF_CTRL+SCF_ALT;
|
||||
st2=ScanCode2KeyName(a2);
|
||||
st=SrcEdLink(&Reboot,256);
|
||||
"%20s $$LK,\"%s\",A=\"%s\"$$\n",st2,"Sys/Reboot",st;
|
||||
U8 *st=KeyMapKeyMStrPrint(sc,fp_handler,desc,task);
|
||||
"%s",st;
|
||||
Free(st);
|
||||
Free(st2);
|
||||
}
|
||||
|
||||
a2=SC_ESC+SCF_CTRL+SCF_ALT;
|
||||
st2=ScanCode2KeyName(a2);
|
||||
st=SrcEdLink(&User,256);
|
||||
"%20s $$LK,\"%s\",A=\"%s\"$$\n",st2,"Sys/Spawn New User Task",st;
|
||||
Free(st);
|
||||
Free(st2);
|
||||
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 /Spawn New User Task");
|
||||
if (no_shift) KeyMapKeyPrint(SC_TAB+SCF_CTRL+SCF_ALT+no_shift_f,
|
||||
&WinToTop,"Cmd /Switch Focus to Next Task");
|
||||
|
||||
a2=SC_TAB+SCF_CTRL+SCF_ALT;
|
||||
st2=ScanCode2KeyName(a2);
|
||||
st=SrcEdLink(&WinToTop,256);
|
||||
"%20s $$LK,\"%s\",A=\"%s\"$$\n",st2,"Sys/Switch Focus to Next Task",st;
|
||||
Free(st);
|
||||
Free(st2);
|
||||
|
||||
for (i=0;i<26;i++) {
|
||||
if (keydev.fp_ctrl_alt_let_cbs[i] &&
|
||||
keydev.ctrl_alt_let_descs[i]) {
|
||||
a2=Char2ScanCode(i+'a')+SCF_CTRL+SCF_ALT;
|
||||
st2=ScanCode2KeyName(a2);
|
||||
st=SrcEdLink(keydev.fp_ctrl_alt_let_cbs[i],256);
|
||||
"%20s $$LK,\"%s\",A=\"%s\"$$\n",st2,keydev.ctrl_alt_let_descs[i],st;
|
||||
Free(st);
|
||||
Free(st2);
|
||||
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)
|
||||
{
|
||||
I64 i,ch1,ch2;
|
||||
U8 *ee1,*ee2;
|
||||
Bool e1_shift=FALSE,e2_shift=FALSE;
|
||||
if (e1) {
|
||||
if (e2) {
|
||||
while (*e1==CH_SPACE)
|
||||
e1++;
|
||||
while (*e2==CH_SPACE)
|
||||
e2++;
|
||||
while (*e1 && *e1==*e2) {
|
||||
e1++;
|
||||
e2++;
|
||||
}
|
||||
if (!StrNCmp(e1,"SHIFT",5)) {
|
||||
e1+=6;
|
||||
e1_shift=TRUE;
|
||||
} else if (!StrNCmp(e1," ",5))
|
||||
e1+=6;
|
||||
if (!StrNCmp(e2,"SHIFT",5)) {
|
||||
e2+=6;
|
||||
e2_shift=TRUE;
|
||||
} else if (!StrNCmp(e2," ",5))
|
||||
e2+=6;
|
||||
|
||||
ee1=e1;
|
||||
while (*ee1 && *ee1!='$$')
|
||||
ee1++;
|
||||
ch1=*ee1;
|
||||
*ee1=0;
|
||||
|
||||
ee2=e2;
|
||||
while (*ee2 && *ee2!='$$')
|
||||
ee2++;
|
||||
ch2=*ee2;
|
||||
*ee2=0;
|
||||
|
||||
i=StrCmp(e1,e2);
|
||||
|
||||
*ee1=ch1;
|
||||
*ee2=ch2;
|
||||
|
||||
if (i)
|
||||
return i;
|
||||
else
|
||||
return e1_shift-e2_shift;
|
||||
} else
|
||||
return 1;
|
||||
} else {
|
||||
if (e2)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
U8 buf1[STR_LEN],buf2[STR_LEN];
|
||||
KMComparePrepare(buf1,e1);
|
||||
KMComparePrepare(buf2,e2);
|
||||
return StrCmp(buf1,buf2);
|
||||
}
|
||||
|
||||
U0 KeyMapFamily2(U8 **entries,U8 *family,CTask *task,I64 scf)
|
||||
U0 KeyMapFamily2(U8 **entries,CTask *task,I64 scf)
|
||||
{
|
||||
I64 i,a2,a1;
|
||||
U8 *st,*st2;
|
||||
CTask *old_hash=Fs->hash_table;
|
||||
Fs->hash_table=task->hash_table;
|
||||
I64 i,a1,a2;
|
||||
for (i=0;i<256;i++) {
|
||||
a2=scf|i|SCF_KEY_DESC;
|
||||
a1=ScanCode2Char(a2);
|
||||
*keydev.desc=0;
|
||||
keydev.handler=NULL;
|
||||
if (task==Fs)
|
||||
PutKey(a1,a2);
|
||||
else if (TaskValidate(task)) {
|
||||
PostMsg(task,MSG_KEY_DOWN,a1,a2);
|
||||
while (!keydev.handler)
|
||||
Yield;
|
||||
}
|
||||
if (*keydev.desc && StrNCmp(keydev.desc,"Char/",5)) {
|
||||
st=ScanCode2KeyName(a2&~(SCF_CTRL|SCF_ALT|SCF_SHIFT));
|
||||
st2=MStrPrint("%s %s",family,st);
|
||||
Free(st);
|
||||
st=SrcEdLink(keydev.handler,256);
|
||||
entries[i]=MStrPrint("%20s $$LK,\"%s\",A=\"%s\"$$\n",
|
||||
st2,keydev.desc,st);
|
||||
Free(st);
|
||||
Free(st2);
|
||||
if (TaskValidate(task) && !Bt(&task->win_inhibit,WIf_SELF_KEY_DESC)) {
|
||||
if (task==Fs)
|
||||
PutKey(a1,a2);
|
||||
else
|
||||
PostMsg(task,MSG_KEY_DOWN,a1,a2);
|
||||
WinMgrSync(0,TRUE);
|
||||
Sleep(1);
|
||||
}
|
||||
if (*keydev.desc && StrNCmp(keydev.desc,"Char /",7))
|
||||
entries[i]=KeyMapKeyMStrPrint(a2,keydev.handler,keydev.desc,task);
|
||||
}
|
||||
Fs->hash_table=old_hash;
|
||||
}
|
||||
|
||||
U0 KeyMapFamily(U8 *family,CTask *task,I64 scf)
|
||||
U0 KeyMapFamily(CTask *task,I64 scf,Bool no_shift,Bool shift)
|
||||
{
|
||||
I64 i;
|
||||
U8 **entries=CAlloc(2*256*sizeof(U8 *)),st1[32],st2[32];
|
||||
StrPrint(st1,"%s ",family);
|
||||
StrPrint(st2,"%s SHIFT",family);
|
||||
KeyMapFamily2(entries ,st1,task,scf);
|
||||
KeyMapFamily2(entries+256,st2,task,scf+SCF_SHIFT);
|
||||
QSortI64(entries,2*256,&KMCompare);
|
||||
for (i=0;i<2*256;i++)
|
||||
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]);
|
||||
@@ -182,20 +145,16 @@ U0 KeyMapFamily(U8 *family,CTask *task,I64 scf)
|
||||
|
||||
public U0 KeyMap(CTask *task=NULL)
|
||||
{//Report desc of all keys.
|
||||
Bool old_key_desc;
|
||||
if (!task) task=Fs;
|
||||
/*
|
||||
This feature is a burden in code. It would be nice to lst key
|
||||
cmds for all applications, but it makes the code too ugly.
|
||||
*/
|
||||
task=Fs;
|
||||
|
||||
old_key_desc=LBtr(&task->win_inhibit,WIf_SELF_KEY_DESC);
|
||||
DocMax;
|
||||
KeyMapFamily("",task,0);
|
||||
KeyMapFamily("CTRL",task,SCF_CTRL);
|
||||
KeyMapFamily("ALT",task,SCF_ALT);
|
||||
KeyMapCtrlAltFamily;
|
||||
"\n$$MA-X+PU,\"Click for help on key pressed\","
|
||||
"LM=\"PressKeyHelp(0x%X);\"$$\n",task;
|
||||
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"
|
||||
|
||||
Reference in new issue
Block a user