#line 1/*ACE 4 0145 */ /* * Dieser Quelltext stammt ursprnglich von Dirk Haun und * wurde angepažt und erweitert von Holger Weets */ #ifdef SOZOBON #include #include /* * AV-Meldungen */ #define AV_PROTOKOLL 0x4700 #define AV_SENDKEY 0x4710 #define VA_START 0x4711 #define AV_STARTPROG 0x4722 #define VA_PROGSTART 0x4723 #define AV_ACCWINDOPEN 0x4724 #define VA_DRAGACCWIND 0x4725 #define AV_ACCWINDCLOSED 0x4726 #define Pexec(mode,prog,tail,env) gemdos(75,mode,prog,tail,env) extern int _argc; extern char **_argv; _main() { _exit(main(_argc, _argv)); } #else /* Pure-C */ #include #include #include #include #endif int main(argc, argv) int argc; char **argv; { int event, viewer, gl_apid, open, msg[8]; int ret; int d, buf[8]; char cmd[150], *p; start: ret=0; if (argc==2) { if ((gl_apid=appl_init())<0) return(ENSMEM); /* * ACC suchen: ST-Guide, 1stGuide und 1stView in dieser * Reihenfolge */ viewer=appl_find("ST-GUIDE"); if (viewer<0) viewer=appl_find("1STGUIDE"); if (viewer<0) viewer=appl_find("1STVIEW "); if (viewer<0) ret=EFILNF; // kein ACC vorhanden else { /* * Meldung fr ACC basteln */ msg[0]=VA_START; msg[1]=gl_apid; msg[2]=0; *(char **)&msg[3] = argv[1]; // Kommando msg[5]=0; msg[6]=0; msg[7]=0; /* * ACC aktivieren */ appl_write(viewer,16,msg); /* * warten, bis ACC ge”ffnet, oder Timeout */ do { event = evnt_multi(MU_TIMER|MU_MESAG, 0, 0, 0, 0,0,0,0,0, 0,0,0,0,0, buf, 2000, 0, &d, &d, &d, &d, &d, &d); if (event & MU_TIMER) break; } while (buf[0] != AV_ACCWINDOPEN); /* * wenn Timeout, dann haben wir * hier nichts mehr zu tun */ if (event & MU_TIMER) ret=EFILNF; else { /* * ACC ist jetzt offen. Also mitz„hlen, wieviele * seiner Fenster noch ge”ffnet sind, und abbrechen, * sobald das letzte geschlossen wird */ open=1; do { event = evnt_multi(MU_MESAG, 0, 0, 0, 0,0,0,0,0, 0,0,0,0,0, buf, 0, 0, &d, &d, &d, &d, &d, &d); if (event & MU_MESAG) { if (buf[0] == AV_ACCWINDCLOSED) /* ein Fenster weniger */ open--; else if (buf[0] == AV_ACCWINDOPEN) /* ein Fenster mehr */ open++; else if (buf[0] == AV_STARTPROG) { /* * Programm sol gestartet werden: * * Kommandozeile fr Programmaufruf * zurechtmachen */ p = *(char **)&buf[5]; if (p) { strcpy(cmd+1, p); *cmd = strlen(p); } else { *cmd = 0; } /* * Hier mžte eigentlich noch getestet werden, * ob wir es mit einer TOS- oder GEM- Appl. * zu tun haben... */ shel_write(1, 1, 1, *(char **)&buf[3], cmd); open = 0; /* * dieses gefiele mir besser, * l„uft aber bei mir nicht * (ACC wird nicht geschlossen) * WIESO? */ # if 0 appl_exit(); ret = Pexec(0, *(char **)&buf[3], cmd, 0L); return(ret); # endif } } } while (open>0); } } appl_exit(); } else ret=ENMFIL; return(ret); }