212 lines
4.5 KiB
HolyC
212 lines
4.5 KiB
HolyC
|
#help_index "DolDoc/Misc"
|
||
|
|
||
|
U8 captured_macro_name[STR_LEN];
|
||
|
StrCpy(captured_macro_name,"Test");
|
||
|
|
||
|
I64 sys_macro_repeat_n=1;
|
||
|
|
||
|
U0 SysMacroStripKey(CJob *macro_head,I64 arg1,I64 arg2)
|
||
|
{
|
||
|
CJob *tmpc,*tmpc1;
|
||
|
tmpc=macro_head->next;
|
||
|
while (tmpc!=macro_head) {
|
||
|
tmpc1=tmpc->next;
|
||
|
if (tmpc->job_code==JOBT_MSG &&
|
||
|
(tmpc->msg_code==MSG_KEY_DOWN || tmpc->msg_code==MSG_KEY_UP ||
|
||
|
tmpc->msg_code==MSG_KEY_DOWN_UP) &&
|
||
|
arg1 && tmpc->aux1==arg1 || !arg1 && tmpc->aux2==arg2) {
|
||
|
QueRem(tmpc);
|
||
|
JobDel(tmpc);
|
||
|
}
|
||
|
tmpc=tmpc1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define MT_NULL 0
|
||
|
#define MT_MSG 1
|
||
|
#define MT_CHAR 2
|
||
|
|
||
|
class CMacroTmp
|
||
|
{
|
||
|
CMacroTmp *next,*last;
|
||
|
I64 type;
|
||
|
U8 buf[STR_LEN];
|
||
|
};
|
||
|
|
||
|
CMacroTmp *Cmd2MT(CJob *tmpc)
|
||
|
{
|
||
|
U8 buf[8];
|
||
|
CMacroTmp *tmpmt=CAlloc(sizeof(CMacroTmp));
|
||
|
if (Bt(char_bmp_macro,tmpc->aux1) && tmpc->msg_code==MSG_KEY_DOWN) {
|
||
|
tmpmt->type=MT_CHAR;
|
||
|
buf[0]=tmpc->aux1;
|
||
|
buf[1]=0;
|
||
|
StrPrint(tmpmt->buf,"%Q",buf);
|
||
|
} else {
|
||
|
tmpmt->type=MT_MSG;
|
||
|
StrPrint(tmpmt->buf,"Msg(0x%X,0x%X,0x%X);",
|
||
|
tmpc->msg_code,tmpc->aux1,tmpc->aux2);
|
||
|
}
|
||
|
return tmpmt;
|
||
|
}
|
||
|
|
||
|
U8 *SysMacro2Str(CJob *macro_head)
|
||
|
{
|
||
|
CJob *tmpc;
|
||
|
I64 cnt=1; //terminating zero
|
||
|
U8 *ptr,*m;
|
||
|
CMacroTmp *tmpmt,*tmpmt1,head;
|
||
|
LBtr(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
|
||
|
QueInit(&head);
|
||
|
head.type=MT_NULL;
|
||
|
tmpc=macro_head->next;
|
||
|
while (tmpc!=macro_head) {
|
||
|
tmpmt=Cmd2MT(tmpc);
|
||
|
QueIns(tmpmt,head.last);
|
||
|
cnt+=StrLen(tmpmt->buf);
|
||
|
if (tmpmt->type==MT_CHAR) {
|
||
|
if (tmpmt->last->type!=MT_CHAR)
|
||
|
cnt+=StrLen("\"");
|
||
|
if (tmpmt->next->type!=MT_CHAR)
|
||
|
cnt+=StrLen("\";");
|
||
|
}
|
||
|
tmpc=tmpc->next;
|
||
|
}
|
||
|
|
||
|
m=MAlloc(cnt);
|
||
|
ptr=m;
|
||
|
|
||
|
tmpmt=head.next;
|
||
|
while (tmpmt!=&head) {
|
||
|
tmpmt1=tmpmt->next;
|
||
|
if (tmpmt->type==MT_MSG) {
|
||
|
StrCpy(ptr, tmpmt->buf);
|
||
|
ptr+=StrLen(tmpmt->buf);
|
||
|
} else {
|
||
|
if (tmpmt->last->type!=MT_CHAR) {
|
||
|
StrCpy(ptr, "\"");
|
||
|
ptr+=StrLen("\"");
|
||
|
}
|
||
|
StrCpy(ptr,tmpmt->buf);
|
||
|
ptr+=StrLen(tmpmt->buf);
|
||
|
if (tmpmt->next->type!=MT_CHAR) {
|
||
|
StrCpy(ptr, "\";");
|
||
|
ptr+=StrLen("\";");
|
||
|
}
|
||
|
}
|
||
|
Free(tmpmt);
|
||
|
tmpmt=tmpmt1;
|
||
|
}
|
||
|
*ptr=0;
|
||
|
return m;
|
||
|
}
|
||
|
|
||
|
U0 PlaySysMacro(I64 n=1)
|
||
|
{
|
||
|
CTask *task=sys_focus_task;
|
||
|
U8 *m;
|
||
|
if (TaskValidate(task)) {
|
||
|
LBtr(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
m=SysMacro2Str(&sys_macro_head);
|
||
|
while (n-- && TaskValidate(task)) {
|
||
|
if (task==Fs)
|
||
|
InStr("%s",m);
|
||
|
else
|
||
|
XTalkStrWait(task,"%s",m);
|
||
|
}
|
||
|
Free(m);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
U0 EdInsCapturedMacro()
|
||
|
{
|
||
|
U8 *st=SysMacro2Str(&sys_macro_head);
|
||
|
if (sys_focus_task) {
|
||
|
XTalk(sys_focus_task,"$$MA+LIS,T=\"%s\",LM=\"%$$Q\"$$",
|
||
|
captured_macro_name,st);
|
||
|
Free(st);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define SM_RECORD 0
|
||
|
#define SM_INS 1
|
||
|
#define SM_PLAY 2
|
||
|
#define SM_REPEAT_N 3
|
||
|
#define SM_STOP 4
|
||
|
|
||
|
I64 PopUpMacroMenu()
|
||
|
{
|
||
|
I64 res=0;
|
||
|
U8 buf[STR_LEN];
|
||
|
CJob *tmpc;
|
||
|
CDoc *doc=DocNew;
|
||
|
CDocEntry *doc_e=DocPrint(doc,"$$DA-P,LEN=STR_LEN-1,A=\"Name:%%s\"$$");
|
||
|
doc_e->data=captured_macro_name;
|
||
|
DocDataFmt(doc,doc_e);
|
||
|
|
||
|
doc_e=DocPrint(doc,"\n$$DA,A=\"Repeat N:%%d\"$$");
|
||
|
doc_e->data=&sys_macro_repeat_n;
|
||
|
DocDataFmt(doc,doc_e);
|
||
|
|
||
|
DocPrint(doc,"\n"
|
||
|
"$$CM+LX,1,3$$$$BT,\"RECORD\",LE=SM_RECORD$$"
|
||
|
"$$CM+LX,17,0$$$$BT,\"INSERT\",LE=SM_INS$$"
|
||
|
"$$CM+LX,1,3$$$$BT,\"PLAY\",LE=SM_PLAY$$"
|
||
|
"$$CM+LX,17,0$$$$BT,\"REPEAT N\",LE=SM_REPEAT_N$$"
|
||
|
"$$CM+LX,1,3$$$$BT,\"STOP\",LE=SM_STOP$$"
|
||
|
"$$CM+LX,17,0$$$$BT,\"CANCEL\",LE=DOCM_CANCEL$$"
|
||
|
"\n\n\n$$GREEN$$SHIFT-F2$$FG$$ will play macro.\n");
|
||
|
doc->flags|=DOCF_SIZE_MIN | DOCF_FORM;
|
||
|
StrPrint(buf,"DocMenu(%d);",doc);
|
||
|
sys_macro_task=Spawn(&SrvCmdLine,NULL,"Macro Popup",,Fs);
|
||
|
Fs->popup_task=sys_macro_task;
|
||
|
LBts(&sys_macro_task->display_flags,DISPLAYf_WIN_ON_TOP);
|
||
|
tmpc=TaskExe(sys_macro_task,Fs,buf,
|
||
|
1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
||
|
JobResScan(tmpc,&res);
|
||
|
Fs->popup_task=NULL;
|
||
|
Kill(sys_macro_task);
|
||
|
sys_macro_task=NULL;
|
||
|
DocDataScan(doc,doc_e);
|
||
|
DocDel(doc);
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
U0 MacroTask(I64)
|
||
|
{
|
||
|
I64 i;
|
||
|
StrCpy(captured_macro_name,"Click Here");
|
||
|
sys_macro_repeat_n=1;
|
||
|
do {
|
||
|
i=PopUpMacroMenu;
|
||
|
WinRefocus(sys_focus_task);
|
||
|
switch (i) {
|
||
|
case SM_RECORD:
|
||
|
LBtr(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
QueDel(&sys_macro_head,TRUE);
|
||
|
LBts(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
break;
|
||
|
case SM_PLAY:
|
||
|
PlaySysMacro;
|
||
|
break;
|
||
|
case SM_REPEAT_N:
|
||
|
PlaySysMacro(sys_macro_repeat_n);
|
||
|
break;
|
||
|
case SM_STOP:
|
||
|
LBtr(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
break;
|
||
|
case SM_INS:
|
||
|
LBtr(&sys_semas[SEMA_RECORD_MACRO],0);
|
||
|
EdInsCapturedMacro;
|
||
|
break;
|
||
|
}
|
||
|
} while (i>=0);
|
||
|
}
|
||
|
|
||
|
U0 EdMacroUtil()
|
||
|
{
|
||
|
if (!sys_macro_task)
|
||
|
Spawn(&MacroTask,NULL,"Macro");
|
||
|
}
|