|
|
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.