home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
hensa
/
programming
/
tcl
/
tclsrc
/
c
/
WimpTask
< prev
Wrap
Text File
|
1996-02-05
|
6KB
|
225 lines
/* Task window commands for tcl */
/* (c) C.T.Stretch */
/* Sat,27 Aug 1994 */
#include "tclInt.h"
#undef UCHAR
#include "h.WInt"
#include "h.wimp"
#include "h.taskwindow"
typedef struct task
{ struct task *next;
char *rec_proc,*quit_proc,*name;
wimp_t task;
int txt;
} task;
Tcl_HashTable taskTable;
static task *tasklist;
/*
* --
*
*
*
*
*
* Results:
* None.
*
* Side effects:
* None.
*
*/
int w_SystemCmd(ClientData dummy,Tcl_Interp *interp,int argc,char **argv)
{ wimp_t t;
os_error *e;
char *r;
if(argc!=2) return wrong(WNA,"system <string>");
e=xwimp_start_task(argv[1],&t);
if(e)
{ sprintf(interp->result,"%.199s",e->errmess);
return TCL_ERROR;
}
if(t) strcpy(interp->result,"Task");
else
{ r=getenv("Sys$ReturnCode");
if(r) sprintf(interp->result,"%.199s",r);
}
return TCL_OK;
}
extern void task_killall(void)
{ task *t;
wimp_message wm;
wm.size=256;
wm.your_ref=0;
wm.action=message_TASK_WINDOW_MORITE;
for(t=tasklist;t;t=t->next) wimp_send_message(wimp_USER_MESSAGE,&wm,t->task);
}
static void task_kill(task *t)
{ Tcl_HashEntry *p;
unlink(&(tasklist),t);
p=Tcl_FindHashEntry(&taskTable,t->name);
if(!p)
{ msg("Odd close request",0,0);
return;
}
Tcl_DeleteHashEntry(p);
if(t->quit_proc)
{ substr['n'-'a']=t->name;
checkEval(t->quit_proc,"quit task");
}
substr['n'-'a']=0;
ckfree(t->rec_proc);ckfree(t->quit_proc);ckfree(t->name);
ckfree(t);
}
void task_message(wimp_message *m)
{ task *t;
int txt,n;
char stringbuf[256];
switch(m->action)
{ case message_TASK_WINDOW_NEW_TASK:
return;
case message_TASK_WINDOW_EGO:txt=
((taskwindow_message_ego*)(&m->data))->txt;
for(t=tasklist;t;t=t->next) if(txt==t->txt)
{ t->task=m->sender;
return;
}
return;
case message_TASK_WINDOW_MORIO:for(t=tasklist;t;t=t->next)
if(m->sender==t->task)
{ task_kill(t);return;}
return;
case message_TASK_WINDOW_OUTPUT:for(t=tasklist;t;t=t->next)
if(m->sender==t->task)
{ if(!t->rec_proc) return;
n=
((taskwindow_message_data*)(&m->data))->size;
substr['n'-'a']=t->name;
substr['o'-'a']=stringbuf;
strncpy(stringbuf,
((taskwindow_message_data*)(&m->data))->data,
n);
stringbuf[n]=0;
checkEval(t->rec_proc,"task receive");
substr['o'-'a']=0;
substr['n'-'a']=0;
return;
}
}
}
int w_TaskCmd(ClientData dummy,Tcl_Interp *interp,int argc,char **argv)
{ task *t;
char *cmd="";
Tcl_HashEntry *p;
wimp_message wm;
if(argc<3)
{ sprintf(interp->result,
"wrong # args: should be w_task name command ... ");
return TCL_ERROR;
}
/* *********** create a task *************** */
if(!strcmp(argv[2],"create"))
{ int new,m,slot=128;
char buf[256];
static int nexttxt=1;
p=Tcl_CreateHashEntry(&taskTable,argv[1],&new);
if(!new)
{ Tcl_AppendResult(interp,"task already exists ",argv[1],0);
return TCL_ERROR;
}
t=ckcalloc(sizeof(task));
t->txt=nexttxt++;
t->name=scopy(argv[1]);
for(m=3;m<argc-1;m++)
{ if(!strcmp(argv[m],"-receive"))
{ t->rec_proc=scopy(argv[++m]);
continue;
}
if(!strcmp(argv[m],"-quit"))
{ t->quit_proc=scopy(argv[++m]);
continue;
}
if(!strcmp(argv[m],"-command"))
{ cmd=argv[++m];
continue;
}
if(!strcmp(argv[m],"-slot"))
{ slot=atoi(argv[++m]);
continue;
}
}
t->next=tasklist;
tasklist=t;
Tcl_SetHashValue(p,t);
sprintf(buf,
"TaskWindow %.140s -wimpslot %dK -name %s_%.10s -task &%08X -txt &%08X",
cmd,slot,progname,t->name,(int)taskhandle,t->txt);
t->task=wimp_start_task(buf);
return TCL_OK;
}
p=Tcl_FindHashEntry(&taskTable,argv[1]);
if(!p)
{ Tcl_AppendResult(interp,"No such task ",argv[1],0);
return TCL_ERROR;
}
t=(task*)Tcl_GetHashValue(p);
wm.size=256;
wm.your_ref=0;
if(t->task==0)
{ msg("Task has not responded",0,0);
return TCL_OK;
}
/* *********** send data to task *************** */
if(!strcmp(argv[2],"send"))
{ char *p;
int m,n;
if(argc!=4)
{ sprintf(interp->result,
"wrong # args: should be w_task name send data");
return TCL_ERROR;
}
wm.action=message_TASK_WINDOW_INPUT;
p=argv[3];n=strlen(p);
while(n)
{ m=(n>232)?232:n;
memcpy(((taskwindow_message_data*)(&wm.data))->data,p,m);
((taskwindow_message_data*)(&wm.data))->size=m;
wimp_send_message(wimp_USER_MESSAGE,&wm,t->task);
p+=m;n-=m;
}
return TCL_OK;
}
/* *********** kill task *************** */
if(!strcmp(argv[2],"kill"))
{ wm.action=message_TASK_WINDOW_MORITE;
wimp_send_message(wimp_USER_MESSAGE,&wm,t->task);
return TCL_OK;
}
/* *********** suspend task *************** */
if(!strcmp(argv[2],"suspend"))
{ wm.action=message_TASK_WINDOW_SUSPEND;
wimp_send_message(wimp_USER_MESSAGE,&wm,t->task);
return TCL_OK;
}
/* *********** resume task *************** */
if(!strcmp(argv[2],"resume"))
{ wm.action= message_TASK_WINDOW_RESUME;
wimp_send_message(wimp_USER_MESSAGE,&wm,t->task);
return TCL_OK;
}
Tcl_AppendResult(interp,"unknown w_task command: ",argv[2],0);
return TCL_ERROR;
}