| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1997-01-31 16:15:11 +00:00
										 |  |  | Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | The Netherlands. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Permission to use, copy, modify, and distribute this software and its  | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted,  | 
					
						
							|  |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							|  |  |  | both that copyright notice and this permission notice appear in  | 
					
						
							|  |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							|  |  |  | Centrum or CWI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | 
					
						
							|  |  |  | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | 
					
						
							|  |  |  | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | 
					
						
							|  |  |  | FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
					
						
							|  |  |  | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 
					
						
							|  |  |  | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | 
					
						
							|  |  |  | OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-19 15:11:45 +00:00
										 |  |  | #ifdef __CFM68K__
 | 
					
						
							|  |  |  | /* cfm68k InterfaceLib exports GetEventQueue, but Events.h doesn't know this
 | 
					
						
							|  |  |  | ** and defines it as GetEvQHdr (which is correct for PPC). This fix is for | 
					
						
							|  |  |  | ** CW9, check that the workaround is still needed for the next release. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #define GetEvQHdr GetEventQueue
 | 
					
						
							|  |  |  | #endif /* __CFM68K__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <Events.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __CFM68K__
 | 
					
						
							|  |  |  | #undef GetEventQueue
 | 
					
						
							|  |  |  | #endif /* __CFM68K__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1995-02-14 01:27:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | #include "macglue.h"
 | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | #include "marshal.h"
 | 
					
						
							|  |  |  | #include "import.h"
 | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | #include "importdl.h"
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | #include "pythonresources.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | #include <OSUtils.h> /* for Set(Current)A5 */
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | #include <Files.h>
 | 
					
						
							| 
									
										
										
										
											1995-02-13 11:33:28 +00:00
										 |  |  | #include <StandardFile.h>
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | #include <Resources.h>
 | 
					
						
							|  |  |  | #include <Memory.h>
 | 
					
						
							|  |  |  | #include <Windows.h>
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | #include <Traps.h>
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | #include <Processes.h>
 | 
					
						
							| 
									
										
										
										
											1995-02-18 15:01:31 +00:00
										 |  |  | #include <Fonts.h>
 | 
					
						
							|  |  |  | #include <Menus.h>
 | 
					
						
							| 
									
										
										
										
											1995-06-18 20:03:40 +00:00
										 |  |  | #include <TextUtils.h>
 | 
					
						
							| 
									
										
										
										
											1995-01-30 08:57:13 +00:00
										 |  |  | #ifdef THINK_C
 | 
					
						
							|  |  |  | #include <OSEvents.h> /* For EvQElPtr */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-02-27 16:17:28 +00:00
										 |  |  | #ifdef __MWERKS__
 | 
					
						
							|  |  |  | #include <SIOUX.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-03-05 16:56:24 +00:00
										 |  |  | #ifdef USE_GUSI
 | 
					
						
							|  |  |  | #include <TFileSpec.h> /* For Path2FSSpec */
 | 
					
						
							| 
									
										
										
										
											1996-03-06 16:21:34 +00:00
										 |  |  | #include <LowMem.h> /* For SetSFCurDir, etc */
 | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | #include <GUSI.h>
 | 
					
						
							| 
									
										
										
										
											1996-03-05 16:56:24 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | /* The ID of the Sioux apple menu */ | 
					
						
							|  |  |  | #define SIOUX_APPLEID	32000
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | #include <signal.h>
 | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-01 15:23:54 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** When less than this amount of stackspace is left we | 
					
						
							|  |  |  | ** raise a MemoryError. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #ifndef MINIMUM_STACK_SIZE
 | 
					
						
							|  |  |  | #ifdef __powerc
 | 
					
						
							|  |  |  | #define MINIMUM_STACK_SIZE 8192
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define MINIMUM_STACK_SIZE 4096
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1995-02-27 16:17:28 +00:00
										 |  |  | ** We have to be careful, since we can't handle | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | ** things like updates (and they'll keep coming back if we don't | 
					
						
							| 
									
										
										
										
											1995-02-27 16:17:28 +00:00
										 |  |  | ** handle them). Note that we don't know who has windows open, so | 
					
						
							|  |  |  | ** even handing updates off to SIOUX under MW isn't going to work. | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | #define MAINLOOP_EVENTMASK (mDownMask|keyDownMask|osMask)
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <signal.h>
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | /* XXX We should include Errors.h here, but it has a name conflict
 | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | ** with the python errors.h. */ | 
					
						
							|  |  |  | #define fnfErr -43
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | /* Declared in macfsmodule.c: */ | 
					
						
							|  |  |  | extern FSSpec *mfs_GetFSSpecFSSpec(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | /* Interrupt code variables: */ | 
					
						
							|  |  |  | static int interrupted;			/* Set to true when cmd-. seen */ | 
					
						
							|  |  |  | static RETSIGTYPE intcatcher Py_PROTO((int)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | static void PyMac_DoYield Py_PROTO((int, int)); | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** These are the real scheduling parameters that control what we check | 
					
						
							|  |  |  | ** in the event loop, and how often we check. The values are initialized | 
					
						
							|  |  |  | ** from pyMac_SchedParamStruct. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct real_sched_param_struct { | 
					
						
							|  |  |  | 	int		check_interrupt;	/* if true check for command-dot */ | 
					
						
							|  |  |  | 	int		process_events;		/* if nonzero enable evt processing, this mask */ | 
					
						
							|  |  |  | 	int		besocial;		/* if nonzero be a little social with CPU */ | 
					
						
							|  |  |  | 	unsigned long	check_interval;		/* how often to check, in ticks */ | 
					
						
							|  |  |  | 	unsigned long	bg_yield;		/* yield so long when in background */ | 
					
						
							|  |  |  | 	/* these are computed from previous and clock and such */ | 
					
						
							|  |  |  | 	int		enabled;		/* check_interrupt OR process_event OR yield */ | 
					
						
							|  |  |  | 	unsigned long	next_check;		/* when to check/yield next, in ticks */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct real_sched_param_struct schedparams = | 
					
						
							|  |  |  | 	{ 1, MAINLOOP_EVENTMASK, 1, 15, 15, 1, 0}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** We attempt to be a good citizen by giving up the CPU periodically. | 
					
						
							|  |  |  | ** When in the foreground we do this less often and for shorter periods | 
					
						
							|  |  |  | ** than when in the background. At this time we also check for events and | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | ** pass them off to SIOUX, if compiling with mwerks. | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | ** The counts here are in ticks of 1/60th second. | 
					
						
							|  |  |  | ** XXXX The initial values here are not based on anything. | 
					
						
							|  |  |  | ** FG-python gives up the cpu for 1/60th 5 times per second, | 
					
						
							|  |  |  | ** BG-python for .2 second 10 times per second. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static long interval_fg = 12; | 
					
						
							|  |  |  | static long interval_bg = 6; | 
					
						
							|  |  |  | static long yield_fg = 1; | 
					
						
							| 
									
										
										
										
											1996-09-22 22:14:30 +00:00
										 |  |  | static long yield_bg = 2; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | static unsigned long lastyield; | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | static int in_foreground; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-26 10:20:53 +00:00
										 |  |  | /* 
 | 
					
						
							|  |  |  | ** When > 0, do full scanning for events (program is not event aware) | 
					
						
							|  |  |  | ** when == 0, only scan for Command-period | 
					
						
							|  |  |  | ** when < 0, don't do any event scanning  | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int PyMac_DoYieldEnabled = 1; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Workaround for sioux/gusi combo: set when we are exiting | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int PyMac_ConsoleIsDead; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Sioux menu bar, saved early so we can restore it | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static Handle sioux_mbar; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Some stuff for our GetDirectory and PromptGetFile routines | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | struct hook_args { | 
					
						
							|  |  |  | 	int selectcur_hit;		/* Set to true when "select current" selected */ | 
					
						
							|  |  |  | 	char *prompt;			/* The prompt */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | static DlgHookYDUPP myhook_upp; | 
					
						
							|  |  |  | static int upp_inited = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-03-06 16:21:34 +00:00
										 |  |  | #ifdef USE_GUSI
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** GUSI (1.6.0 and earlier, at the least) do not set the MacOS idea of | 
					
						
							|  |  |  | ** the working directory. Hence, we call this routine after each call | 
					
						
							|  |  |  | ** to chdir() to rectify things. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_FixGUSIcd() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	WDPBRec pb; | 
					
						
							|  |  |  | 	FSSpec curdirfss; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( Path2FSSpec(":x", &curdirfss) != noErr )  | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* Set MacOS "working directory" */ | 
					
						
							|  |  |  | 	pb.ioNamePtr= "\p"; | 
					
						
							|  |  |  | 	pb.ioVRefNum= curdirfss.vRefNum; | 
					
						
							|  |  |  | 	pb.ioWDDirID= curdirfss.parID; | 
					
						
							| 
									
										
										
										
											1997-04-08 15:27:00 +00:00
										 |  |  | 	if (PBHSetVolSync(&pb) != noErr) | 
					
						
							| 
									
										
										
										
											1996-03-06 16:21:34 +00:00
										 |  |  | 		return; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1996-08-19 11:01:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-07 17:09:31 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** SpinCursor (needed by GUSI) drags in heaps of stuff, so we | 
					
						
							|  |  |  | ** provide a dummy here. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											1996-08-19 11:36:25 +00:00
										 |  |  | void SpinCursor(short x) { /* Dummy */ } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Replacement GUSI Spin function | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | PyMac_GUSISpin(spin_msg msg, long arg) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	static Boolean	inForeground = true; | 
					
						
							|  |  |  | 	int		maxsleep = 6;	/* 6 ticks is "normal" sleeptime */ | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (PyMac_ConsoleIsDead) return 0; | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 	if (inForeground) | 
					
						
							|  |  |  | 		SpinCursor(msg == SP_AUTO_SPIN ? short(arg) : 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (interrupted) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	if ( msg == SP_AUTO_SPIN ) | 
					
						
							|  |  |  | 		maxsleep = 0; | 
					
						
							|  |  |  | 	if ( msg==SP_SLEEP||msg==SP_SELECT ) | 
					
						
							|  |  |  | 		maxsleep = arg; | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	PyMac_DoYield(maxsleep, 0); /* XXXX or is it safe to call python here? */ | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_SetGUSISpin() { | 
					
						
							|  |  |  | 	GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-23 15:35:14 +00:00
										 |  |  | /* Called at exit() time thru atexit(), to stop event processing */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_StopGUSISpin() { | 
					
						
							|  |  |  | 	PyMac_ConsoleIsDead = 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Replacement routines for the PLstr... functions so we don't need | 
					
						
							|  |  |  | ** StdCLib. Moreover, that implementation is broken under cfm68k... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PLstrcpy(to, fr) | 
					
						
							|  |  |  | 	unsigned char *to, *fr; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	memcpy(to, fr, fr[0]+1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PLstrcmp(s1, s2) | 
					
						
							|  |  |  | 	unsigned char *s1, *s2; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res; | 
					
						
							|  |  |  | 	int l = s1[0] < s2[0] ? s1[0] : s2[0]; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	res = memcmp(s1+1, s2+1, l); | 
					
						
							|  |  |  | 	if ( res != 0 ) | 
					
						
							|  |  |  | 		return res; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( s1 < s2 ) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	else if ( s1 > s2 ) | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unsigned char * | 
					
						
							|  |  |  | PLstrrchr(str, chr) | 
					
						
							|  |  |  | 	unsigned char *str; | 
					
						
							|  |  |  | 	unsigned char chr; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned char *ptr = 0; | 
					
						
							|  |  |  | 	unsigned char *p; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for(p=str+1; p<str+str[0]; p++) | 
					
						
							|  |  |  | 		if ( *p == chr ) | 
					
						
							|  |  |  | 			ptr = p; | 
					
						
							|  |  |  | 	return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | #endif /* USE_GUSI */
 | 
					
						
							| 
									
										
										
										
											1996-03-06 16:21:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | /* Convert C to Pascal string. Returns pointer to static buffer. */ | 
					
						
							|  |  |  | unsigned char * | 
					
						
							|  |  |  | Pstring(char *str) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static Str255 buf; | 
					
						
							|  |  |  | 	int len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	len = strlen(str); | 
					
						
							| 
									
										
										
										
											1995-01-21 13:46:04 +00:00
										 |  |  | 	if (len > 255) | 
					
						
							|  |  |  | 		len = 255; | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 	buf[0] = (unsigned char)len; | 
					
						
							|  |  |  | 	strncpy((char *)buf+1, str, len); | 
					
						
							|  |  |  | 	return buf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-18 15:01:31 +00:00
										 |  |  | /* Like strerror() but for Mac OS error numbers */ | 
					
						
							|  |  |  | char *PyMac_StrError(int err) | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	static char buf[256]; | 
					
						
							|  |  |  | 	Handle h; | 
					
						
							|  |  |  | 	char *str; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	h = GetResource('Estr', err); | 
					
						
							|  |  |  | 	if ( h ) { | 
					
						
							|  |  |  | 		HLock(h); | 
					
						
							|  |  |  | 		str = (char *)*h; | 
					
						
							|  |  |  | 		memcpy(buf, str+1, (unsigned char)str[0]); | 
					
						
							| 
									
										
										
										
											1995-02-13 16:17:03 +00:00
										 |  |  | 		buf[(unsigned char)str[0]] = '\0'; | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 		HUnlock(h); | 
					
						
							|  |  |  | 		ReleaseResource(h); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		sprintf(buf, "Mac OS error code %d", err); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return buf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Exception object shared by all Mac specific modules for Mac OS errors */ | 
					
						
							|  |  |  | PyObject *PyMac_OSErrException; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Initialize and return PyMac_OSErrException */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_GetOSErrException() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (PyMac_OSErrException == NULL) | 
					
						
							|  |  |  | 		PyMac_OSErrException = PyString_FromString("Mac OS Error"); | 
					
						
							|  |  |  | 	return PyMac_OSErrException; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | /* Set a MAC-specific error from errno, and return NULL; return None if no error */ | 
					
						
							|  |  |  | PyObject *  | 
					
						
							| 
									
										
										
										
											1995-01-12 12:37:24 +00:00
										 |  |  | PyErr_Mac(PyObject *eobj, int err) | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	char *msg; | 
					
						
							|  |  |  | 	PyObject *v; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | 	if (err == 0 && !PyErr_Occurred()) { | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 		Py_INCREF(Py_None); | 
					
						
							|  |  |  | 		return Py_None; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | 	if (err == -1 && PyErr_Occurred()) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1995-02-18 15:01:31 +00:00
										 |  |  | 	msg = PyMac_StrError(err); | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 	v = Py_BuildValue("(is)", err, msg); | 
					
						
							|  |  |  | 	PyErr_SetObject(eobj, v); | 
					
						
							|  |  |  | 	Py_DECREF(v); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Call PyErr_Mac with PyMac_OSErrException */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_Error(OSErr err) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PyErr_Mac(PyMac_GetOSErrException(), err); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-22 15:25:10 +00:00
										 |  |  | #ifdef USE_STACKCHECK
 | 
					
						
							|  |  |  | /* Check for stack overflow */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyOS_CheckStack() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long left; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	left = StackSpace(); | 
					
						
							| 
									
										
										
										
											1996-08-01 15:23:54 +00:00
										 |  |  | 	if ( left < MINIMUM_STACK_SIZE ) | 
					
						
							| 
									
										
										
										
											1996-07-22 15:25:10 +00:00
										 |  |  | 		return -1; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* USE_STACKCHECK */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | /* The catcher routine (which may not be used for all compilers) */ | 
					
						
							|  |  |  | static RETSIGTYPE | 
					
						
							|  |  |  | intcatcher(sig) | 
					
						
							|  |  |  | 	int sig; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	interrupted = 1; | 
					
						
							|  |  |  | 	signal(SIGINT, intcatcher); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyOS_InitInterrupts() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (signal(SIGINT, SIG_IGN) != SIG_IGN) | 
					
						
							|  |  |  | 		signal(SIGINT, intcatcher); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** This routine scans the event queue looking for cmd-. | 
					
						
							|  |  |  | ** This is the only way to get an interrupt under THINK (since it | 
					
						
							|  |  |  | ** doesn't do SIGINT handling), but is also used under MW, when | 
					
						
							|  |  |  | ** the full-fledged event loop is disabled. This way, we can at least | 
					
						
							|  |  |  | ** interrupt a runaway python program. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | scan_event_queue(flush) | 
					
						
							|  |  |  | 	int flush; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	register EvQElPtr q; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-08-19 11:36:25 +00:00
										 |  |  | 	q = (EvQElPtr) GetEventQueue()->qHead; | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	for (; q; q = (EvQElPtr)q->qLink) { | 
					
						
							|  |  |  | 		if (q->evtQWhat == keyDown && | 
					
						
							|  |  |  | 				(char)q->evtQMessage == '.' && | 
					
						
							|  |  |  | 				(q->evtQModifiers & cmdKey) != 0) { | 
					
						
							|  |  |  | 			if ( flush ) | 
					
						
							|  |  |  | 				FlushEvents(keyDownMask, 0); | 
					
						
							|  |  |  | 			interrupted = 1; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyOS_InterruptOccurred() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	if (schedparams.enabled) { | 
					
						
							|  |  |  | 		if ( (unsigned long)LMGetTicks() > schedparams.next_check ) { | 
					
						
							|  |  |  | 			PyMac_Yield(); | 
					
						
							|  |  |  | 			schedparams.next_check = (unsigned long)LMGetTicks() | 
					
						
							|  |  |  | 					 + schedparams.check_interval; | 
					
						
							|  |  |  | 			if (interrupted) { | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | 				scan_event_queue(1);	/* Eat events up to cmd-. */ | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 				interrupted = 0; | 
					
						
							|  |  |  | 				return 1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Check whether we are in the foreground */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyMac_InForeground() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static ProcessSerialNumber ours; | 
					
						
							|  |  |  | 	static inited; | 
					
						
							|  |  |  | 	ProcessSerialNumber curfg; | 
					
						
							|  |  |  | 	Boolean eq; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	if ( inited == 0 ) { | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 		(void)GetCurrentProcess(&ours); | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 		inited = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 	if ( GetFrontProcess(&curfg) < 0 ) | 
					
						
							|  |  |  | 		eq = 1; | 
					
						
							|  |  |  | 	else if ( SameProcess(&ours, &curfg, &eq) < 0 ) | 
					
						
							|  |  |  | 		eq = 1; | 
					
						
							|  |  |  | 	return (int)eq; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Handle an event, either one found in the mainloop eventhandler or | 
					
						
							|  |  |  | ** one passed back from the python program. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | PyMac_HandleEvent(evp, maycallpython) | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 	EventRecord *evp; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	int maycallpython; | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	if ( maycallpython ) { | 
					
						
							|  |  |  | 		/* To be implemented */ | 
					
						
							|  |  |  | 	}		 | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | #ifdef __MWERKS__
 | 
					
						
							| 
									
										
										
										
											1995-11-10 14:53:00 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		int siouxdidit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* If SIOUX wants it we're done */ | 
					
						
							|  |  |  | 		siouxdidit = SIOUXHandleOneEvent(evp); | 
					
						
							|  |  |  | 		if ( siouxdidit ) | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 	/* Other compilers are just unlucky: we only weed out clicks in other applications */ | 
					
						
							|  |  |  | 	if ( evp->what == mouseDown ) { | 
					
						
							| 
									
										
										
										
											1995-08-31 13:57:40 +00:00
										 |  |  | 		WindowPtr wp; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-11-10 14:53:00 +00:00
										 |  |  | 		if ( FindWindow(evp->where, &wp) == inSysWindow ) { | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 			SystemClick(evp, wp); | 
					
						
							| 
									
										
										
										
											1995-11-10 14:53:00 +00:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | #endif /* !__MWERKS__ */
 | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | 	printf("not handled\n"); | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | ** Yield the CPU to other tasks without processing events. | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											1996-08-19 11:36:25 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | PyMac_DoYield(int maxsleep, int maycallpython) | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	EventRecord ev; | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	int gotone; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	long latest_time_ready; | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	** First check for interrupts, if wanted. | 
					
						
							|  |  |  | 	** This sets a flag that will be picked up at an appropriate | 
					
						
							|  |  |  | 	** moment in the mainloop. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	if (schedparams.check_interrupt) | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 		scan_event_queue(0); | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* XXXX Implementing an idle routine goes here */ | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	** Check which of the eventloop cases we have: | 
					
						
							|  |  |  | 	** - process events | 
					
						
							|  |  |  | 	** - don't process events but do yield | 
					
						
							|  |  |  | 	** - do neither | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	if( !schedparams.process_events ) { | 
					
						
							|  |  |  | 		if ( maxsleep >= 0 ) { | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 			SystemTask(); | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		latest_time_ready = LMGetTicks() + maxsleep; | 
					
						
							|  |  |  | 		while ( maxsleep >= 0 ) { | 
					
						
							|  |  |  | 			gotone = WaitNextEvent(schedparams.process_events, &ev, 0 /*maxsleep*/, NULL);	 | 
					
						
							|  |  |  | 			/* Get out quickly if nothing interesting is happening */ | 
					
						
							|  |  |  | 			if ( !gotone || ev.what == nullEvent ) | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			PyMac_HandleEvent(&ev, maycallpython); | 
					
						
							|  |  |  | 			maxsleep = latest_time_ready - LMGetTicks(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | ** Process events and/or yield the CPU to other tasks if opportune | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_Yield() { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	unsigned long maxsleep; | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	if( PyMac_InForeground() ) | 
					
						
							|  |  |  | 		maxsleep = 0; | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 		maxsleep = schedparams.bg_yield; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PyMac_DoYield(maxsleep, 1); | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | ** Return current scheduler parameters | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | void | 
					
						
							|  |  |  | PyMac_GetSchedParams(PyMacSchedParams *sp) | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | 	sp->check_interrupt = schedparams.check_interrupt; | 
					
						
							|  |  |  | 	sp->process_events = schedparams.process_events; | 
					
						
							|  |  |  | 	sp->besocial = schedparams.besocial; | 
					
						
							|  |  |  | 	sp->check_interval = schedparams.check_interval / 60.0; | 
					
						
							|  |  |  | 	sp->bg_yield = schedparams.bg_yield / 60.0; | 
					
						
							| 
									
										
										
										
											1994-12-14 14:07:50 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1996-09-04 15:24:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:28:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Set current scheduler parameters | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_SetSchedParams(PyMacSchedParams *sp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	schedparams.check_interrupt = sp->check_interrupt; | 
					
						
							|  |  |  | 	schedparams.process_events = sp->process_events; | 
					
						
							|  |  |  | 	schedparams.besocial = sp->besocial; | 
					
						
							|  |  |  | 	schedparams.check_interval = (unsigned long)(sp->check_interval*60); | 
					
						
							|  |  |  | 	schedparams.bg_yield = (unsigned long)(sp->bg_yield*60); | 
					
						
							|  |  |  | 	if ( schedparams.check_interrupt || schedparams.process_events || | 
					
						
							|  |  |  | 	     schedparams.besocial ) | 
					
						
							|  |  |  | 	     	schedparams.enabled = 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		schedparams.enabled = 0; | 
					
						
							|  |  |  | 	schedparams.next_check = 0;	/* Check immedeately */ | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Install our menu bar. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_InitMenuBar() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MenuHandle applemenu; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | 	if ( (sioux_mbar=GetMenuBar()) == NULL )  { | 
					
						
							|  |  |  | 		/* Sioux menu not installed yet. Do so */ | 
					
						
							|  |  |  | 		SIOUXSetupMenus(); | 
					
						
							|  |  |  | 		if ( (sioux_mbar=GetMenuBar()) == NULL ) | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-04-08 15:27:00 +00:00
										 |  |  | 	if ( (applemenu=GetMenuHandle(SIOUX_APPLEID)) == NULL ) return; | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | 	SetMenuItemText(applemenu, 1, "\pAbout Python..."); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Restore sioux menu bar | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | PyMac_RestoreMenuBar() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | 	if ( sioux_mbar ) { | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | 		SetMenuBar(sioux_mbar); | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | 		DrawMenuBar(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:13 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Our replacement about box | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | SIOUXDoAboutBox(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	DialogPtr theDialog; | 
					
						
							| 
									
										
										
										
											1996-09-22 22:14:30 +00:00
										 |  |  | 	WindowRef theWindow; | 
					
						
							|  |  |  | 	CGrafPtr thePort; | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | 	short item; | 
					
						
							| 
									
										
										
										
											1996-09-22 22:14:30 +00:00
										 |  |  | 	short xpos, ypos, width, height, swidth, sheight; | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	if( (theDialog = GetNewDialog(ABOUT_ID, NULL, (WindowPtr)-1)) == NULL ) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											1996-09-22 22:14:30 +00:00
										 |  |  | 	theWindow = GetDialogWindow(theDialog); | 
					
						
							|  |  |  | 	thePort = GetWindowPort(theWindow); | 
					
						
							|  |  |  | 	width = thePort->portRect.right - thePort->portRect.left; | 
					
						
							|  |  |  | 	height = thePort->portRect.bottom - thePort->portRect.top; | 
					
						
							|  |  |  | 	swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left; | 
					
						
							|  |  |  | 	sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight(); | 
					
						
							|  |  |  | 	xpos = (swidth-width)/2; | 
					
						
							| 
									
										
										
										
											1996-09-23 15:51:06 +00:00
										 |  |  | 	ypos = (sheight-height)/5 + LMGetMBarHeight(); | 
					
						
							| 
									
										
										
										
											1996-09-22 22:14:30 +00:00
										 |  |  | 	MoveWindow(theWindow, xpos, ypos, 0); | 
					
						
							|  |  |  | 	ShowWindow(theWindow); | 
					
						
							| 
									
										
										
										
											1996-09-06 00:30:45 +00:00
										 |  |  | 	ModalDialog(NULL, &item); | 
					
						
							|  |  |  | 	DisposeDialog(theDialog); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Returns true if the argument has a resource fork, and it contains | 
					
						
							|  |  |  | ** a 'PYC ' resource of the correct name | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | PyMac_FindResourceModule(obj, module, filename) | 
					
						
							|  |  |  | PyStringObject *obj; | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | char *module; | 
					
						
							|  |  |  | char *filename; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	FSSpec fss; | 
					
						
							|  |  |  | 	FInfo finfo; | 
					
						
							|  |  |  | 	short oldrh, filerh; | 
					
						
							|  |  |  | 	int ok; | 
					
						
							|  |  |  | 	Handle h; | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef INTERN_STRINGS
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	** If we have interning find_module takes care of interning all | 
					
						
							|  |  |  | 	** sys.path components. We then keep a record of all sys.path | 
					
						
							|  |  |  | 	** components for which GetFInfo has failed (usually because the | 
					
						
							|  |  |  | 	** component in question is a folder), and we don't try opening these | 
					
						
							|  |  |  | 	** as resource files again. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | #define MAXPATHCOMPONENTS 32
 | 
					
						
							|  |  |  | 	static PyStringObject *not_a_file[MAXPATHCOMPONENTS]; | 
					
						
							|  |  |  | 	static int max_not_a_file = 0; | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if ( obj->ob_sinterned ) { | 
					
						
							|  |  |  | 		for( i=0; i< max_not_a_file; i++ ) | 
					
						
							|  |  |  | 			if ( obj == not_a_file[i] ) | 
					
						
							|  |  |  | 				return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif /* INTERN_STRINGS */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-11-09 18:43:44 +00:00
										 |  |  | 	if ( strcmp(filename, PyMac_ApplicationPath) == 0 ) { | 
					
						
							|  |  |  | 		/*
 | 
					
						
							|  |  |  | 		** Special case: the application itself. Use a shortcut to | 
					
						
							|  |  |  | 		** forestall opening and closing the application numerous times | 
					
						
							|  |  |  | 		** (which is dead slow when running from CDROM) | 
					
						
							|  |  |  | 		*/ | 
					
						
							|  |  |  | 		oldrh = CurResFile(); | 
					
						
							|  |  |  | 		UseResFile(PyMac_AppRefNum); | 
					
						
							|  |  |  | 		filerh = -1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | 		if ( FSMakeFSSpec(0, 0, Pstring(filename), &fss) != noErr || | 
					
						
							|  |  |  | 		     FSpGetFInfo(&fss, &finfo) != noErr ) { | 
					
						
							|  |  |  | #ifdef INTERN_STRINGS
 | 
					
						
							|  |  |  | 			if ( max_not_a_file < MAXPATHCOMPONENTS && obj->ob_sinterned ) | 
					
						
							|  |  |  | 				not_a_file[max_not_a_file++] = obj; | 
					
						
							|  |  |  | #endif /* INTERN_STRINGS */
 | 
					
						
							|  |  |  | 		     	/* doesn't exist or is folder */ | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		}			 | 
					
						
							| 
									
										
										
										
											1996-11-09 18:43:44 +00:00
										 |  |  | 		oldrh = CurResFile(); | 
					
						
							|  |  |  | 		filerh = FSpOpenResFile(&fss, fsRdPerm); | 
					
						
							|  |  |  | 		if ( filerh == -1 ) | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		UseResFile(filerh); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 	SetResLoad(0); | 
					
						
							|  |  |  | 	h = Get1NamedResource('PYC ', Pstring(module)); | 
					
						
							|  |  |  | 	SetResLoad(1); | 
					
						
							|  |  |  | 	ok = (h != NULL); | 
					
						
							| 
									
										
										
										
											1996-11-09 18:43:44 +00:00
										 |  |  | 	if ( filerh != -1 ) | 
					
						
							|  |  |  | 		CloseResFile(filerh); | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 	UseResFile(oldrh); | 
					
						
							|  |  |  | 	return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Load the specified module from a resource | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_LoadResourceModule(module, filename) | 
					
						
							|  |  |  | char *module; | 
					
						
							|  |  |  | char *filename; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	FSSpec fss; | 
					
						
							|  |  |  | 	FInfo finfo; | 
					
						
							|  |  |  | 	short oldrh, filerh; | 
					
						
							|  |  |  | 	Handle h; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	PyObject *m, *co; | 
					
						
							|  |  |  | 	long num, size; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-11-09 18:43:44 +00:00
										 |  |  | 	if ( strcmp(filename, PyMac_ApplicationPath) == 0 ) { | 
					
						
							|  |  |  | 		/*
 | 
					
						
							|  |  |  | 		** Special case: the application itself. Use a shortcut to | 
					
						
							|  |  |  | 		** forestall opening and closing the application numerous times | 
					
						
							|  |  |  | 		** (which is dead slow when running from CDROM) | 
					
						
							|  |  |  | 		*/ | 
					
						
							|  |  |  | 		oldrh = CurResFile(); | 
					
						
							|  |  |  | 		UseResFile(PyMac_AppRefNum); | 
					
						
							|  |  |  | 		filerh = -1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if ( (err=FSMakeFSSpec(0, 0, Pstring(filename), &fss)) != noErr ) | 
					
						
							|  |  |  | 			goto error; | 
					
						
							|  |  |  | 		if ( (err=FSpGetFInfo(&fss, &finfo)) != noErr ) | 
					
						
							|  |  |  | 			goto error; | 
					
						
							|  |  |  | 		oldrh = CurResFile(); | 
					
						
							|  |  |  | 		filerh = FSpOpenResFile(&fss, fsRdPerm); | 
					
						
							|  |  |  | 		if ( filerh == -1 ) { | 
					
						
							|  |  |  | 			err = ResError(); | 
					
						
							|  |  |  | 			goto error; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		UseResFile(filerh); | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	h = Get1NamedResource('PYC ', Pstring(module)); | 
					
						
							|  |  |  | 	if ( h == NULL ) { | 
					
						
							|  |  |  | 		err = ResError(); | 
					
						
							|  |  |  | 		goto error; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	HLock(h); | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	** XXXX The next few lines are intimately tied to the format of pyc | 
					
						
							|  |  |  | 	** files. I'm not sure whether this code should be here or in import.c -- Jack | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	size = GetHandleSize(h); | 
					
						
							|  |  |  | 	if ( size < 8 ) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ImportError, "Resource too small"); | 
					
						
							| 
									
										
										
										
											1995-02-18 15:01:31 +00:00
										 |  |  | 		co = NULL; | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		num = (*h)[0] & 0xff; | 
					
						
							|  |  |  | 		num = num | (((*h)[1] & 0xff) << 8); | 
					
						
							|  |  |  | 		num = num | (((*h)[2] & 0xff) << 16); | 
					
						
							|  |  |  | 		num = num | (((*h)[3] & 0xff) << 24); | 
					
						
							|  |  |  | 		if ( num != PyImport_GetMagicNumber() ) { | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_ImportError, "Bad MAGIC in resource"); | 
					
						
							|  |  |  | 			co = NULL; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			co = PyMarshal_ReadObjectFromString((*h)+8, size-8); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	HUnlock(h); | 
					
						
							| 
									
										
										
										
											1996-11-09 18:43:44 +00:00
										 |  |  | 	if ( filerh != -1 ) | 
					
						
							|  |  |  | 		CloseResFile(filerh); | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 	UseResFile(oldrh); | 
					
						
							|  |  |  | 	if ( co ) { | 
					
						
							|  |  |  | 		m = PyImport_ExecCodeModule(module, co); | 
					
						
							|  |  |  | 		Py_DECREF(co); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		m = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return m; | 
					
						
							|  |  |  | error: | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		char buf[512]; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-02-18 15:01:31 +00:00
										 |  |  | 		sprintf(buf, "%s: %s", filename, PyMac_StrError(err)); | 
					
						
							| 
									
										
										
										
											1995-02-15 22:58:33 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ImportError, buf); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1995-02-20 23:45:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-12 15:29:46 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Look for a module in a single folder. Upon entry buf and len | 
					
						
							|  |  |  | ** point to the folder to search, upon exit they refer to the full | 
					
						
							|  |  |  | ** pathname of the module found (if any). | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | struct filedescr * | 
					
						
							|  |  |  | PyMac_FindModuleExtension(char *buf, int *lenp, char *module) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct filedescr *fdp; | 
					
						
							|  |  |  | 	unsigned char fnbuf[64]; | 
					
						
							|  |  |  | 	int modnamelen = strlen(module); | 
					
						
							|  |  |  | 	FSSpec fss; | 
					
						
							|  |  |  | 	short refnum; | 
					
						
							|  |  |  | 	long dirid; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	** Copy the module name to the buffer (already :-terminated) | 
					
						
							|  |  |  | 	** We also copy the first suffix, if this matches immedeately we're | 
					
						
							|  |  |  | 	** lucky and return immedeately. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	if ( !_PyImport_Filetab[0].suffix ) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	strcpy(buf+*lenp, module); | 
					
						
							|  |  |  | 	strcpy(buf+*lenp+modnamelen, _PyImport_Filetab[0].suffix); | 
					
						
							|  |  |  | 	if ( FSMakeFSSpec(0, 0, Pstring(buf), &fss) == noErr ) | 
					
						
							|  |  |  | 		return _PyImport_Filetab; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	** We cannot check for fnfErr (unfortunately), it can mean either that | 
					
						
							|  |  |  | 	** the file doesn't exist (fine, we try others) or the path leading to it. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	refnum = fss.vRefNum; | 
					
						
							|  |  |  | 	dirid = fss.parID; | 
					
						
							|  |  |  | 	if ( refnum == 0 || dirid == 0 )	/* Fail on nonexistent dir */ | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	** We now have the folder parameters. Setup the field for the filename | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	if ( modnamelen > 54 ) return 0;	/* Leave room for extension */ | 
					
						
							|  |  |  | 	strcpy((char *)fnbuf+1, module); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for( fdp = _PyImport_Filetab+1; fdp->suffix; fdp++ ) { | 
					
						
							|  |  |  | 		strcpy((char *)fnbuf+1+modnamelen, fdp->suffix); | 
					
						
							|  |  |  | 		fnbuf[0] = strlen((char *)fnbuf+1); | 
					
						
							|  |  |  | 		if (Py_VerboseFlag > 1) | 
					
						
							|  |  |  | 			fprintf(stderr, "# trying %s%s\n", buf, fdp->suffix); | 
					
						
							|  |  |  | 		if ( FSMakeFSSpec(refnum, dirid, fnbuf, &fss) == noErr ) { | 
					
						
							|  |  |  | 			/* Found it. */ | 
					
						
							|  |  |  | 			strcpy(buf+*lenp+modnamelen, fdp->suffix); | 
					
						
							|  |  |  | 			*lenp = strlen(buf); | 
					
						
							|  |  |  | 			return fdp; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyMac_FileExists(char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	FSSpec fss; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( FSMakeFSSpec(0, 0, Pstring(name), &fss) == noErr ) | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | ** Helper routine for GetDirectory | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											1995-02-20 23:45:53 +00:00
										 |  |  | static pascal short | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | myhook_proc(short item, DialogPtr theDialog, struct hook_args *dataptr) | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 	if ( item == sfHookFirstCall && dataptr->prompt) { | 
					
						
							|  |  |  | 		Handle prompth; | 
					
						
							|  |  |  | 		short type; | 
					
						
							|  |  |  | 		Rect rect; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		GetDialogItem(theDialog, PROMPT_ITEM, &type, &prompth, &rect); | 
					
						
							|  |  |  | 		if ( prompth ) | 
					
						
							|  |  |  | 			SetDialogItemText(prompth, (unsigned char *)dataptr->prompt); | 
					
						
							|  |  |  | 	} else | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 	if ( item == SELECTCUR_ITEM ) { | 
					
						
							|  |  |  | 		item = sfItemCancelButton; | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 		dataptr->selectcur_hit = 1; | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return item; | 
					
						
							|  |  |  | }	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Ask the user for a directory. I still can't understand | 
					
						
							|  |  |  | ** why Apple doesn't provide a standard solution for this... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | PyMac_GetDirectory(dirfss, prompt) | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 	FSSpec *dirfss; | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 	char *prompt; | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	static SFTypeList list = {'fldr', 0, 0, 0}; | 
					
						
							|  |  |  | 	static Point where = {-1, -1}; | 
					
						
							|  |  |  | 	StandardFileReply reply; | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 	struct hook_args hook_args; | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	if ( !upp_inited ) { | 
					
						
							|  |  |  | 		myhook_upp = NewDlgHookYDProc(myhook_proc); | 
					
						
							|  |  |  | 		upp_inited = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 	if ( prompt && *prompt ) | 
					
						
							|  |  |  | 		hook_args.prompt = (char *)Pstring(prompt); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		hook_args.prompt = NULL; | 
					
						
							|  |  |  | 	hook_args.selectcur_hit = 0; | 
					
						
							| 
									
										
										
										
											1995-02-20 23:45:53 +00:00
										 |  |  | 	CustomGetFile((FileFilterYDUPP)0, 1, list, &reply, GETDIR_ID, where, myhook_upp, | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 				NULL, NULL, NULL, (void *)&hook_args); | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 	reply.sfFile.name[0] = 0; | 
					
						
							|  |  |  | 	if( FSMakeFSSpec(reply.sfFile.vRefNum, reply.sfFile.parID, reply.sfFile.name, dirfss) ) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											1995-08-14 12:35:10 +00:00
										 |  |  | 	return hook_args.selectcur_hit; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | ** Slightly extended StandardGetFile: accepts a prompt */ | 
					
						
							|  |  |  | void PyMac_PromptGetFile(short numTypes, ConstSFTypeListPtr typeList,  | 
					
						
							|  |  |  | 		StandardFileReply *reply, char *prompt) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static Point where = {-1, -1}; | 
					
						
							|  |  |  | 	struct hook_args hook_args; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( !upp_inited ) { | 
					
						
							|  |  |  | 		myhook_upp = NewDlgHookYDProc(myhook_proc); | 
					
						
							|  |  |  | 		upp_inited = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ( prompt && *prompt ) | 
					
						
							|  |  |  | 		hook_args.prompt = (char *)Pstring(prompt); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		hook_args.prompt = NULL; | 
					
						
							|  |  |  | 	hook_args.selectcur_hit = 0; | 
					
						
							|  |  |  | 	CustomGetFile((FileFilterYDUPP)0, numTypes, typeList, reply, GETFILEPROMPT_ID, where, | 
					
						
							|  |  |  | 				myhook_upp, NULL, NULL, NULL, (void *)&hook_args); | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Convert a 4-char string object argument to an OSType value */ | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | PyMac_GetOSType(PyObject *v, OSType *pr) | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (!PyString_Check(v) || PyString_Size(v) != 4) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 			"OSType arg must be string of 4 chars"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	memcpy((char *)pr, PyString_AsString(v), 4); | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Convert an OSType value to a 4-char string object */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_BuildOSType(OSType t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PyString_FromStringAndSize((char *)&t, 4); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-01 15:23:54 +00:00
										 |  |  | /* Convert an NumVersion value to a 4-element tuple */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_BuildNumVersion(NumVersion t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return Py_BuildValue("(hhhh)", t.majorRev, t.minorAndBugRev, t.stage, t.nonRelRev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Python string object to a Str255 */ | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | PyMac_GetStr255(PyObject *v, Str255 pbuf) | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int len; | 
					
						
							|  |  |  | 	if (!PyString_Check(v) || (len = PyString_Size(v)) > 255) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 			"Str255 arg must be string of at most 255 chars"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	pbuf[0] = len; | 
					
						
							|  |  |  | 	memcpy((char *)(pbuf+1), PyString_AsString(v), len); | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Convert a Str255 to a Python string object */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_BuildStr255(Str255 s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PyString_FromStringAndSize((char *)&s[1], (int)s[0]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | ** Convert a Python object to an FSSpec. | 
					
						
							|  |  |  | ** The object may either be a full pathname or a triple | 
					
						
							|  |  |  | ** (vrefnum, dirid, path). | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | ** NOTE: This routine will fail on pre-sys7 machines.  | 
					
						
							|  |  |  | ** The caller is responsible for not calling this routine | 
					
						
							|  |  |  | ** in those cases (which is fine, since everyone calling | 
					
						
							|  |  |  | ** this is probably sys7 dependent anyway). | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | PyMac_GetFSSpec(PyObject *v, FSSpec *fs) | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	Str255 path; | 
					
						
							|  |  |  | 	short refnum; | 
					
						
							|  |  |  | 	long parid; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	FSSpec *fs2; | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	/* first check whether it already is an FSSpec */ | 
					
						
							|  |  |  | 	fs2 = mfs_GetFSSpecFSSpec(v); | 
					
						
							|  |  |  | 	if ( fs2 ) { | 
					
						
							| 
									
										
										
										
											1995-02-20 15:56:10 +00:00
										 |  |  | 		(void)FSMakeFSSpec(fs2->vRefNum, fs2->parID, fs2->name, fs); | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 	if ( PyString_Check(v) ) { | 
					
						
							|  |  |  | 		/* It's a pathname */ | 
					
						
							| 
									
										
										
										
											1995-01-21 13:46:04 +00:00
										 |  |  | 		if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) ) | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 			return 0; | 
					
						
							| 
									
										
										
										
											1996-03-06 16:21:34 +00:00
										 |  |  | 		refnum = 0; /* XXXX Should get CurWD here?? */ | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 		parid = 0; | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											1995-01-21 13:46:04 +00:00
										 |  |  | 		if( !PyArg_Parse(v, "(hlO&); FSSpec should be fullpath or (vrefnum,dirid,path)", | 
					
						
							|  |  |  | 							&refnum, &parid, PyMac_GetStr255, &path)) { | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 			return 0; | 
					
						
							| 
									
										
										
										
											1995-01-21 13:46:04 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	err = FSMakeFSSpec(refnum, parid, path, fs); | 
					
						
							|  |  |  | 	if ( err && err != fnfErr ) { | 
					
						
							| 
									
										
										
										
											1995-01-21 13:46:04 +00:00
										 |  |  | 		PyErr_Mac(PyExc_ValueError, err); | 
					
						
							| 
									
										
										
										
											1995-01-18 13:53:49 +00:00
										 |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Convert a Python object to a Rect.
 | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  |    The object must be a (left, top, right, bottom) tuple. | 
					
						
							|  |  |  |    (This differs from the order in the struct but is consistent with | 
					
						
							|  |  |  |    the arguments to SetRect(), and also with STDWIN). */ | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | int | 
					
						
							|  |  |  | PyMac_GetRect(PyObject *v, Rect *r) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	return PyArg_Parse(v, "(hhhh)", &r->left, &r->top, &r->right, &r->bottom); | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Rect to a Python object */ | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | PyMac_BuildRect(Rect *r) | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	return Py_BuildValue("(hhhh)", r->left, r->top, r->right, r->bottom); | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Python object to a Point.
 | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  |    The object must be a (h, v) tuple. | 
					
						
							|  |  |  |    (This differs from the order in the struct but is consistent with | 
					
						
							|  |  |  |    the arguments to SetPoint(), and also with STDWIN). */ | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | int | 
					
						
							|  |  |  | PyMac_GetPoint(PyObject *v, Point *p) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	return PyArg_Parse(v, "(hh)", &p->h, &p->v); | 
					
						
							| 
									
										
										
										
											1995-01-18 23:57:26 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | /* Convert a Point to a Python object */ | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | PyMac_BuildPoint(Point p) | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	return Py_BuildValue("(hh)", p.h, p.v); | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Python object to an EventRecord.
 | 
					
						
							|  |  |  |    The object must be a (what, message, when, (v, h), modifiers) tuple. */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyMac_GetEventRecord(PyObject *v, EventRecord *e) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PyArg_Parse(v, "(hll(hh)h)", | 
					
						
							|  |  |  | 	                   &e->what, | 
					
						
							|  |  |  | 	                   &e->message, | 
					
						
							|  |  |  | 	                   &e->when, | 
					
						
							|  |  |  | 	                   &e->where.h, | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	                   &e->where.v,                    | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | 	                   &e->modifiers); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Rect to an EventRecord object */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_BuildEventRecord(EventRecord *e) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return Py_BuildValue("(hll(hh)h)", | 
					
						
							|  |  |  | 	                     e->what, | 
					
						
							|  |  |  | 	                     e->message, | 
					
						
							|  |  |  | 	                     e->when, | 
					
						
							|  |  |  | 	                     e->where.h, | 
					
						
							| 
									
										
										
										
											1995-01-26 22:56:59 +00:00
										 |  |  | 	                     e->where.v, | 
					
						
							| 
									
										
										
										
											1995-01-25 23:06:44 +00:00
										 |  |  | 	                     e->modifiers); | 
					
						
							| 
									
										
										
										
											1995-01-22 18:36:13 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1995-11-15 15:19:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Convert Python object to Fixed */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | PyMac_GetFixed(PyObject *v, Fixed *f) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double d; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if( !PyArg_Parse(v, "d", &d)) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	*f = (Fixed)(d * 0x10000); | 
					
						
							| 
									
										
										
										
											1996-05-31 13:01:39 +00:00
										 |  |  | 	return 1; | 
					
						
							| 
									
										
										
										
											1995-11-15 15:19:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Convert a Point to a Python object */ | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyMac_BuildFixed(Fixed f) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double d; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	d = f; | 
					
						
							|  |  |  | 	d = d / 0x10000; | 
					
						
							|  |  |  | 	return Py_BuildValue("d", d); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |