|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * AppWindow interface ! 5: * ! 6: * Copyright 1997 Samuel Devulder. ! 7: */ ! 8: ! 9: /****************************************************************************/ ! 10: ! 11: #include <workbench/startup.h> ! 12: ! 13: #include <exec/execbase.h> ! 14: #include <exec/memory.h> ! 15: ! 16: #include <dos/dos.h> ! 17: ! 18: #include <proto/intuition.h> ! 19: #include <proto/exec.h> ! 20: #include <proto/dos.h> ! 21: #include <proto/wb.h> ! 22: ! 23: /****************************************************************************/ ! 24: ! 25: #include "sysconfig.h" ! 26: #include "sysdeps.h" ! 27: #include "options.h" ! 28: #include "uaeexe.h" ! 29: ! 30: /****************************************************************************/ ! 31: ! 32: #define LEN 256 ! 33: ! 34: struct Library *WorkbenchBase; ! 35: ! 36: static struct AppWindow *AppWin; ! 37: static struct MsgPort *AppPort; ! 38: ! 39: int appw_init(struct Window *W); ! 40: void appw_exit(void); ! 41: void appw_events(void); ! 42: ! 43: /****************************************************************************/ ! 44: ! 45: int appw_init(struct Window *W) ! 46: { ! 47: WorkbenchBase = (void*)OpenLibrary("workbench.library",36L); ! 48: if(WorkbenchBase) { ! 49: AppPort = CreatePort(0,0); ! 50: if(AppPort) { ! 51: AppWin = AddAppWindow(0,0,W,AppPort,NULL); ! 52: if(AppWin) { ! 53: write_log("AppWindow started.\n"); ! 54: return 1; ! 55: } ! 56: } ! 57: } ! 58: write_log("Failed to start AppWindow.\n"); ! 59: ! 60: return 0; ! 61: } ! 62: ! 63: /****************************************************************************/ ! 64: ! 65: void appw_exit(void) ! 66: { ! 67: if(AppPort) { ! 68: void *msg; ! 69: while((msg=GetMsg(AppPort))) ReplyMsg(msg); ! 70: DeletePort(AppPort); ! 71: AppPort = NULL; ! 72: } ! 73: if(AppWin) { ! 74: RemoveAppWindow(AppWin); ! 75: AppWin = NULL; ! 76: } ! 77: if(WorkbenchBase) { ! 78: CloseLibrary((void*)WorkbenchBase); ! 79: WorkbenchBase = NULL; ! 80: } ! 81: } ! 82: ! 83: /***************************************************************************/ ! 84: ! 85: static void addcmd(char *cmd, int len, ULONG lock, char *name) ! 86: { ! 87: len -= strlen(cmd); if(len<=0) return; while(*cmd) ++cmd; ! 88: ! 89: *cmd++ = ' '; if(--len<=0) return; ! 90: ! 91: NameFromLock(lock,cmd,len); ! 92: len -= strlen(cmd);if(len<=0) return;while(*cmd) ++cmd; ! 93: if(cmd[-1]!=':') {*cmd++='/'; len -= 1;if(len<=0) return;} ! 94: strncpy(cmd,name,len); ! 95: while(*cmd) {++cmd; if(--len<=0) *cmd='\0';} ! 96: } ! 97: ! 98: /***************************************************************************/ ! 99: ! 100: void appw_events(void) ! 101: { ! 102: if(AppWin) { ! 103: struct AppMessage *msg; ! 104: struct WBArg *arg; ! 105: while((msg=(void*)GetMsg(AppPort))) { ! 106: char cmd[LEN]; ! 107: int i; ! 108: ! 109: arg = msg->am_ArgList; ! 110: ! 111: strcpy(cmd,"cd "); ! 112: NameFromLock(arg[0].wa_Lock,&cmd[3],LEN-3); ! 113: uaeexe(cmd); ! 114: ! 115: strcpy(cmd,"run ");strcpy(cmd+4,arg[0].wa_Name); ! 116: for(i=1;i<msg->am_NumArgs;++i) ! 117: addcmd(cmd,LEN-2,arg[i].wa_Lock,arg[i].wa_Name); ! 118: /* ^ */ ! 119: /* 2 bytes for security */ ! 120: uaeexe(cmd); ! 121: ReplyMsg((void*)msg); ! 122: } ! 123: } ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.