import source from 1.3.40
[external/swig.git] / Lib / tcl / mactkinit.c
1 /* -----------------------------------------------------------------------------
2  * See the LICENSE file for information on copyright, usage and redistribution
3  * of SWIG, and the README file for authors - http://www.swig.org/release.html.
4  *
5  * mactkinit.c
6  *
7  * This is a support file needed to build a new version of Wish.
8  * Normally, this capability is found in TkAppInit.c, but this creates
9  * tons of namespace problems for many applications.
10  * ----------------------------------------------------------------------------- */
11    
12 #include <Gestalt.h>
13 #include <ToolUtils.h>
14 #include <Fonts.h>
15 #include <Dialogs.h>
16 #include <SegLoad.h>
17 #include <Traps.h>
18
19 #include "tk.h"
20 #include "tkInt.h"
21 #include "tkMacInt.h"
22
23 typedef int (*TclMacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr));
24 Tcl_Interp *gStdoutInterp = NULL;
25
26 void    TclMacSetEventProc _ANSI_ARGS_((TclMacConvertEventPtr procPtr));
27 int     TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr));
28
29 /*
30  * Prototypes for functions the ANSI library needs to link against.
31  */
32 short                   InstallConsole _ANSI_ARGS_((short fd));
33 void                    RemoveConsole _ANSI_ARGS_((void));
34 long                    WriteCharsToConsole _ANSI_ARGS_((char *buff, long n));
35 long                    ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n));
36 char *                  __ttyname _ANSI_ARGS_((long fildes));
37 short                   SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event));
38
39 /*
40  * Forward declarations for procedures defined later in this file:
41  */
42
43 /*
44  *----------------------------------------------------------------------
45  *
46  * MacintoshInit --
47  *
48  *      This procedure calls Mac specific initilization calls.  Most of
49  *      these calls must be made as soon as possible in the startup
50  *      process.
51  *
52  * Results:
53  *      Returns TCL_OK if everything went fine.  If it didn't the 
54  *      application should probably fail.
55  *
56  * Side effects:
57  *      Inits the application.
58  *
59  *----------------------------------------------------------------------
60  */
61
62 int
63 MacintoshInit()
64 {
65     int i;
66     long result, mask = 0x0700;                 /* mask = system 7.x */
67
68     /*
69      * Tk needs us to set the qd pointer it uses.  This is needed
70      * so Tk doesn't have to assume the availablity of the qd global
71      * variable.  Which in turn allows Tk to be used in code resources.
72      */
73     tcl_macQdPtr = &qd;
74
75     InitGraf(&tcl_macQdPtr->thePort);
76     InitFonts();
77     InitWindows();
78     InitMenus();
79     InitDialogs((long) NULL);           
80     InitCursor();
81
82     /*
83      * Make sure we are running on system 7 or higher
84      */
85      
86     if ((NGetTrapAddress(_Gestalt, ToolTrap) == 
87             NGetTrapAddress(_Unimplemented, ToolTrap))
88             || (((Gestalt(gestaltSystemVersion, &result) != noErr)
89             || (mask != (result & mask))))) {
90         panic("Tcl/Tk requires System 7 or higher.");
91     }
92
93     /*
94      * Make sure we have color quick draw 
95      * (this means we can't run on 68000 macs)
96      */
97      
98     if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr)
99             || (result < gestalt32BitQD13))) {
100         panic("Tk requires Color QuickDraw.");
101     }
102
103     
104     FlushEvents(everyEvent, 0);
105     SetEventMask(everyEvent);
106
107     /*
108      * Set up stack & heap sizes
109      */
110     /* TODO: stack size
111        size = StackSpace();
112        SetAppLimit(GetAppLimit() - 8192);
113      */
114     MaxApplZone();
115     for (i = 0; i < 4; i++) {
116         (void) MoreMasters();
117     }
118
119     TclMacSetEventProc(TkMacConvertEvent);
120     TkConsoleCreate();
121
122     return TCL_OK;
123 }
124
125 /*
126  *----------------------------------------------------------------------
127  *
128  * SetupMainInterp --
129  *
130  *      This procedure calls initalization routines require a Tcl 
131  *      interp as an argument.  This call effectively makes the passed
132  *      iterpreter the "main" interpreter for the application.
133  *
134  * Results:
135  *      Returns TCL_OK if everything went fine.  If it didn't the 
136  *      application should probably fail.
137  *
138  * Side effects:
139  *      More initilization.
140  *
141  *----------------------------------------------------------------------
142  */
143
144 int
145 SetupMainInterp(
146     Tcl_Interp *interp)
147 {
148     /*
149      * Initialize the console only if we are running as an interactive
150      * application.
151      */
152
153     TkMacInitAppleEvents(interp);
154     TkMacInitMenus(interp);
155
156     if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1")
157             == 0) {
158         if (TkConsoleInit(interp) == TCL_ERROR) {
159             goto error;
160         }
161     }
162
163     /*
164      * Attach the global interpreter to tk's expected global console
165      */
166
167     gStdoutInterp = interp;
168
169     return TCL_OK;
170
171 error:
172     panic(interp->result);
173     return TCL_ERROR;
174 }
175
176 /*
177  *----------------------------------------------------------------------
178  *
179  * InstallConsole, RemoveConsole, etc. --
180  *
181  *      The following functions provide the UI for the console package.
182  *      Users wishing to replace SIOUX with their own console package 
183  *      need only provide the four functions below in a library.
184  *
185  * Results:
186  *      See SIOUX documentation for details.
187  *
188  * Side effects:
189  *      See SIOUX documentation for details.
190  *
191  *----------------------------------------------------------------------
192  */
193
194 short 
195 InstallConsole(short fd)
196 {
197 #pragma unused (fd)
198
199         return 0;
200 }
201
202 void 
203 RemoveConsole(void)
204 {
205 }
206
207 long 
208 WriteCharsToConsole(char *buffer, long n)
209 {
210     TkConsolePrint(gStdoutInterp, TCL_STDOUT, buffer, n);
211     return n;
212 }
213
214 long 
215 ReadCharsFromConsole(char *buffer, long n)
216 {
217     return 0;
218 }
219
220 extern char *
221 __ttyname(long fildes)
222 {
223     static char *devicename = "null device";
224
225     if (fildes >= 0 && fildes <= 2) {
226         return (devicename);
227     }
228     
229     return (0L);
230 }
231
232 short
233 SIOUXHandleOneEvent(EventRecord *event)
234 {
235     return 0;
236 }