home *** CD-ROM | disk | FTP | other *** search
- /* 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;
- }
-
-
-
-