blob: 6b8b87def3722ba87eba1d76999a4277d3a98979 [file] [log] [blame]
Guido van Rossum2d167031994-09-16 10:54:21 +00001/***********************************************************
Jack Jansen42218ce1997-01-31 16:15:11 +00002Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
Guido van Rossum99546991995-01-08 14:33:34 +00003The Netherlands.
Guido van Rossum2d167031994-09-16 10:54:21 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Macintosh OS-specific interface */
26
27#include "Python.h"
Jack Jansen97ce3611994-12-14 14:02:24 +000028#include "macglue.h"
Jack Jansenb19c6672000-10-12 21:24:05 +000029#include "pythonresources.h"
Guido van Rossum2d167031994-09-16 10:54:21 +000030
Jack Jansen6143d532001-05-19 12:34:59 +000031#ifdef WITHOUT_FRAMEWORKS
Jack Jansenee23d6e1995-01-27 14:43:25 +000032#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000033#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000034#include <LowMem.h>
Jack Jansencbe6a531998-02-20 15:59:59 +000035#include <Sound.h>
Jack Jansene79dc762000-06-02 21:35:07 +000036#include <Events.h>
Jack Jansen6143d532001-05-19 12:34:59 +000037#else
38#include <Carbon/Carbon.h>
39#endif
Jack Jansenee23d6e1995-01-27 14:43:25 +000040
Guido van Rossum2d167031994-09-16 10:54:21 +000041static PyObject *MacOS_Error; /* Exception MacOS.Error */
42
Jack Jansen697842f2001-09-10 22:00:39 +000043#ifdef TARGET_API_MAC_OSX
44#define PATHNAMELEN 1024
45#else
46#define PATHNAMELEN 256
47#endif
48
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000049#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000050#define bufferIsSmall -607 /*error returns from Post and Accept */
51#endif
52
Jack Jansen76a05891996-02-29 16:11:32 +000053/* ----------------------------------------------------- */
54
55/* Declarations for objects of type Resource fork */
56
57typedef struct {
58 PyObject_HEAD
59 short fRefNum;
60 int isclosed;
61} rfobject;
62
63staticforward PyTypeObject Rftype;
64
65
66
67/* ---------------------------------------------------------------- */
68
69static void
Jack Jansendeefbe52001-08-08 13:46:49 +000070do_close(rfobject *self)
Jack Jansen76a05891996-02-29 16:11:32 +000071{
72 if (self->isclosed ) return;
73 (void)FSClose(self->fRefNum);
74 self->isclosed = 1;
75}
76
77static char rf_read__doc__[] =
78"Read data from resource fork"
79;
80
81static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +000082rf_read(rfobject *self, PyObject *args)
Jack Jansen76a05891996-02-29 16:11:32 +000083{
84 long n;
85 PyObject *v;
86 OSErr err;
87
88 if (self->isclosed) {
89 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
90 return NULL;
91 }
92
93 if (!PyArg_ParseTuple(args, "l", &n))
94 return NULL;
95
96 v = PyString_FromStringAndSize((char *)NULL, n);
97 if (v == NULL)
98 return NULL;
99
100 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
101 if (err && err != eofErr) {
102 PyMac_Error(err);
103 Py_DECREF(v);
104 return NULL;
105 }
106 _PyString_Resize(&v, n);
107 return v;
108}
109
110
111static char rf_write__doc__[] =
112"Write to resource fork"
113;
114
115static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000116rf_write(rfobject *self, PyObject *args)
Jack Jansen76a05891996-02-29 16:11:32 +0000117{
118 char *buffer;
119 long size;
120 OSErr err;
121
122 if (self->isclosed) {
123 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
124 return NULL;
125 }
Jack Janseneeccca91997-05-07 15:46:31 +0000126 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000127 return NULL;
128 err = FSWrite(self->fRefNum, &size, buffer);
129 if (err) {
130 PyMac_Error(err);
131 return NULL;
132 }
133 Py_INCREF(Py_None);
134 return Py_None;
135}
136
137
138static char rf_seek__doc__[] =
139"Set file position"
140;
141
142static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000143rf_seek(rfobject *self, PyObject *args)
Jack Jansen76a05891996-02-29 16:11:32 +0000144{
145 long amount, pos;
146 int whence = SEEK_SET;
147 long eof;
148 OSErr err;
149
150 if (self->isclosed) {
151 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
152 return NULL;
153 }
154 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
155 return NULL;
156
Jack Jansendeefbe52001-08-08 13:46:49 +0000157 if ((err = GetEOF(self->fRefNum, &eof)))
Jack Jansen76a05891996-02-29 16:11:32 +0000158 goto ioerr;
159
160 switch (whence) {
161 case SEEK_CUR:
Jack Jansendeefbe52001-08-08 13:46:49 +0000162 if ((err = GetFPos(self->fRefNum, &pos)))
Jack Jansen76a05891996-02-29 16:11:32 +0000163 goto ioerr;
164 break;
165 case SEEK_END:
166 pos = eof;
167 break;
168 case SEEK_SET:
169 pos = 0;
170 break;
171 default:
172 PyErr_BadArgument();
173 return NULL;
174 }
175
176 pos += amount;
177
178 /* Don't bother implementing seek past EOF */
179 if (pos > eof || pos < 0) {
180 PyErr_BadArgument();
181 return NULL;
182 }
183
Jack Jansendeefbe52001-08-08 13:46:49 +0000184 if ((err = SetFPos(self->fRefNum, fsFromStart, pos)) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000185ioerr:
186 PyMac_Error(err);
187 return NULL;
188 }
189 Py_INCREF(Py_None);
190 return Py_None;
191}
192
193
194static char rf_tell__doc__[] =
195"Get file position"
196;
197
198static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000199rf_tell(rfobject *self, PyObject *args)
Jack Jansen76a05891996-02-29 16:11:32 +0000200{
201 long where;
202 OSErr err;
203
204 if (self->isclosed) {
205 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
206 return NULL;
207 }
208 if (!PyArg_ParseTuple(args, ""))
209 return NULL;
Jack Jansendeefbe52001-08-08 13:46:49 +0000210 if ((err = GetFPos(self->fRefNum, &where)) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000211 PyMac_Error(err);
212 return NULL;
213 }
214 return PyInt_FromLong(where);
215}
216
217static char rf_close__doc__[] =
218"Close resource fork"
219;
220
221static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000222rf_close(rfobject *self, PyObject *args)
Jack Jansen76a05891996-02-29 16:11:32 +0000223{
Jack Jansen76a05891996-02-29 16:11:32 +0000224 if (!PyArg_ParseTuple(args, ""))
225 return NULL;
226 do_close(self);
227 Py_INCREF(Py_None);
228 return Py_None;
229}
230
231
232static struct PyMethodDef rf_methods[] = {
Jack Jansendeefbe52001-08-08 13:46:49 +0000233 {"read", (PyCFunction)rf_read, 1, rf_read__doc__},
234 {"write", (PyCFunction)rf_write, 1, rf_write__doc__},
235 {"seek", (PyCFunction)rf_seek, 1, rf_seek__doc__},
236 {"tell", (PyCFunction)rf_tell, 1, rf_tell__doc__},
237 {"close", (PyCFunction)rf_close, 1, rf_close__doc__},
Jack Jansen76a05891996-02-29 16:11:32 +0000238
239 {NULL, NULL} /* sentinel */
240};
241
242/* ---------- */
243
244
245static rfobject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000246newrfobject(void)
Jack Jansen76a05891996-02-29 16:11:32 +0000247{
248 rfobject *self;
249
250 self = PyObject_NEW(rfobject, &Rftype);
251 if (self == NULL)
252 return NULL;
253 self->isclosed = 1;
254 return self;
255}
256
257
258static void
Jack Jansendeefbe52001-08-08 13:46:49 +0000259rf_dealloc(rfobject *self)
Jack Jansen76a05891996-02-29 16:11:32 +0000260{
261 do_close(self);
262 PyMem_DEL(self);
263}
264
265static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000266rf_getattr(rfobject *self, char *name)
Jack Jansen76a05891996-02-29 16:11:32 +0000267{
268 return Py_FindMethod(rf_methods, (PyObject *)self, name);
269}
270
271static char Rftype__doc__[] =
272"Resource fork file object"
273;
274
275static PyTypeObject Rftype = {
276 PyObject_HEAD_INIT(&PyType_Type)
277 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000278 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000279 sizeof(rfobject), /*tp_basicsize*/
280 0, /*tp_itemsize*/
281 /* methods */
282 (destructor)rf_dealloc, /*tp_dealloc*/
283 (printfunc)0, /*tp_print*/
284 (getattrfunc)rf_getattr, /*tp_getattr*/
285 (setattrfunc)0, /*tp_setattr*/
286 (cmpfunc)0, /*tp_compare*/
287 (reprfunc)0, /*tp_repr*/
288 0, /*tp_as_number*/
289 0, /*tp_as_sequence*/
290 0, /*tp_as_mapping*/
291 (hashfunc)0, /*tp_hash*/
292 (ternaryfunc)0, /*tp_call*/
293 (reprfunc)0, /*tp_str*/
294
295 /* Space for future expansion */
296 0L,0L,0L,0L,
297 Rftype__doc__ /* Documentation string */
298};
299
300/* End of code for Resource fork objects */
301/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000302
303/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000304/* Miscellaneous File System Operations */
305
Jack Jansen120a1051997-06-03 15:29:41 +0000306static char getcrtp_doc[] = "Obsolete, use macfs module";
307
Guido van Rossume791c2e1995-01-09 13:20:04 +0000308static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000309MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000310{
Jack Jansene79dc762000-06-02 21:35:07 +0000311 FSSpec fss;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000312 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000313 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000314 OSErr err;
315
Jack Jansene79dc762000-06-02 21:35:07 +0000316 if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000317 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000318 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000319 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000320 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000321 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
322 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000323 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000324 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000325 return res;
326}
327
Jack Jansen120a1051997-06-03 15:29:41 +0000328static char setcrtp_doc[] = "Obsolete, use macfs module";
329
Guido van Rossume791c2e1995-01-09 13:20:04 +0000330static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000331MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000332{
Jack Jansene79dc762000-06-02 21:35:07 +0000333 FSSpec fss;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000334 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000335 FInfo info;
336 OSErr err;
337
338 if (!PyArg_ParseTuple(args, "O&O&O&",
Jack Jansene79dc762000-06-02 21:35:07 +0000339 PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000340 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000341 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000342 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000343 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000344 info.fdType = type;
Jack Jansene79dc762000-06-02 21:35:07 +0000345 if ((err = FSpSetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000346 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000347 Py_INCREF(Py_None);
348 return Py_None;
349}
350
Jack Jansen6143d532001-05-19 12:34:59 +0000351#if TARGET_API_MAC_OS8
Guido van Rossume791c2e1995-01-09 13:20:04 +0000352/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000353/* STDWIN High Level Event interface */
354
355#include <EPPC.h>
356#include <Events.h>
357
Jack Jansen120a1051997-06-03 15:29:41 +0000358static char accepthle_doc[] = "Get arguments of pending high-level event";
359
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000360static PyObject *
361MacOS_AcceptHighLevelEvent(self, args)
362 PyObject *self;
363 PyObject *args;
364{
365 TargetID sender;
366 unsigned long refcon;
367 Ptr buf;
368 unsigned long len;
369 OSErr err;
370 PyObject *res;
371
372 buf = NULL;
373 len = 0;
374 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
375 if (err == bufferIsSmall) {
376 buf = malloc(len);
377 if (buf == NULL)
378 return PyErr_NoMemory();
379 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
380 if (err != noErr) {
381 free(buf);
382 return PyErr_Mac(MacOS_Error, (int)err);
383 }
384 }
385 else if (err != noErr)
386 return PyErr_Mac(MacOS_Error, (int)err);
387 res = Py_BuildValue("s#ls#",
388 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
389 free(buf);
390 return res;
391}
Jack Jansene79dc762000-06-02 21:35:07 +0000392#endif
Jack Jansenf3163302001-05-19 12:50:05 +0000393
394#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000395static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
396
Jack Jansene8e8ae01995-01-26 16:36:45 +0000397/*
Jack Jansen120a1051997-06-03 15:29:41 +0000398** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000399*/
400static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000401MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000402{
Jack Jansen120a1051997-06-03 15:29:41 +0000403 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000404
Jack Jansen120a1051997-06-03 15:29:41 +0000405 PyMac_GetSchedParams(&old);
406 new = old;
407 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
408 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000409 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000410 PyMac_SetSchedParams(&new);
411 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
412 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000413}
414
Jack Jansen120a1051997-06-03 15:29:41 +0000415static char appswitch_doc[] = "Obsolete, use SchedParams";
416
417/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000418static PyObject *
419MacOS_EnableAppswitch(PyObject *self, PyObject *args)
420{
Jack Jansen120a1051997-06-03 15:29:41 +0000421 int new, old;
422 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000423
Guido van Rossume7134aa1995-02-26 10:20:53 +0000424 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000425 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000426 PyMac_GetSchedParams(&schp);
427 if ( schp.process_events )
428 old = 1;
429 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000430 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000431 else
432 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000433 if ( new > 0 ) {
434 schp.process_events = mDownMask|keyDownMask|osMask;
435 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000436 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000437 schp.process_events = 0;
438 schp.check_interrupt = 1;
439 } else {
440 schp.process_events = 0;
441 schp.check_interrupt = 0;
442 }
443 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000444 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000445}
446
Jack Jansen883765e1997-06-20 16:19:38 +0000447static char setevh_doc[] = "Set python event handler to be called in mainloop";
448
449static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000450MacOS_SetEventHandler(PyObject *self, PyObject *args)
Jack Jansen883765e1997-06-20 16:19:38 +0000451{
452 PyObject *evh = NULL;
453
454 if (!PyArg_ParseTuple(args, "|O", &evh))
455 return NULL;
456 if (evh == Py_None)
457 evh = NULL;
458 if ( evh && !PyCallable_Check(evh) ) {
459 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
460 return NULL;
461 }
462 if ( !PyMac_SetEventHandler(evh) )
463 return NULL;
464 Py_INCREF(Py_None);
465 return Py_None;
466}
467
Jack Jansen120a1051997-06-03 15:29:41 +0000468static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000469
470static PyObject *
471MacOS_HandleEvent(PyObject *self, PyObject *args)
472{
473 EventRecord ev;
474
475 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
476 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000477 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000478 Py_INCREF(Py_None);
479 return Py_None;
480}
Jack Jansenf3163302001-05-19 12:50:05 +0000481#endif /* !TARGET_API_MAC_OSX */
Jack Jansena76382a1995-02-02 14:25:56 +0000482
Jack Jansen120a1051997-06-03 15:29:41 +0000483static char geterr_doc[] = "Convert OSErr number to string";
484
Jack Jansen829f88c1995-07-17 11:36:01 +0000485static PyObject *
486MacOS_GetErrorString(PyObject *self, PyObject *args)
487{
488 int errn;
489
490 if (!PyArg_ParseTuple(args, "i", &errn))
491 return NULL;
492 return Py_BuildValue("s", PyMac_StrError(errn));
493}
494
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000495static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
496
497static PyObject *
498MacOS_splash(PyObject *self, PyObject *args)
499{
Jack Jansendf34cf11996-09-15 22:12:00 +0000500 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000501 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000502 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000503 WindowRef theWindow;
504 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000505#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000506 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000507#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000508
Jack Jansendf34cf11996-09-15 22:12:00 +0000509 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000510 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000511 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000512 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000513
Jack Jansendf34cf11996-09-15 22:12:00 +0000514 if ( resid != -1 ) {
515 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000516 if ( curdialog ) {
517 theWindow = GetDialogWindow(curdialog);
518 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000519#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000520 width = thePort->portRect.right - thePort->portRect.left;
521 height = thePort->portRect.bottom - thePort->portRect.top;
522 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
523 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
524 xpos = (swidth-width)/2;
525 ypos = (sheight-height)/5 + LMGetMBarHeight();
526 MoveWindow(theWindow, xpos, ypos, 0);
527 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000528#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000529 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000530 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000531 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000532 if (olddialog)
533 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000534 Py_INCREF(Py_None);
535 return Py_None;
536}
537
Jack Janseneb76b841996-09-30 14:43:22 +0000538static char DebugStr_doc[] = "Switch to low-level debugger with a message";
539
540static PyObject *
541MacOS_DebugStr(PyObject *self, PyObject *args)
542{
543 Str255 message;
544 PyObject *object = 0;
545
546 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
547 return NULL;
548 DebugStr(message);
549 Py_INCREF(Py_None);
550 return Py_None;
551}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000552
Jack Jansen2e871e41997-09-08 13:23:19 +0000553static char SysBeep_doc[] = "BEEEEEP!!!";
554
555static PyObject *
556MacOS_SysBeep(PyObject *self, PyObject *args)
557{
558 int duration = 6;
559
560 if (!PyArg_ParseTuple(args, "|i", &duration))
561 return NULL;
562 SysBeep(duration);
563 Py_INCREF(Py_None);
564 return Py_None;
565}
566
Jack Jansen898ac1b1997-09-01 15:38:12 +0000567static char GetTicks_doc[] = "Return number of ticks since bootup";
568
569static PyObject *
570MacOS_GetTicks(PyObject *self, PyObject *args)
571{
Jack Jansene79dc762000-06-02 21:35:07 +0000572 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000573}
574
Jack Jansen76a05891996-02-29 16:11:32 +0000575static char openrf_doc[] = "Open resource fork of a file";
576
577static PyObject *
578MacOS_openrf(PyObject *self, PyObject *args)
579{
580 OSErr err;
581 char *mode = "r";
582 FSSpec fss;
583 SignedByte permission = 1;
584 rfobject *fp;
585
586 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
587 return NULL;
588 while (*mode) {
589 switch (*mode++) {
590 case '*': break;
591 case 'r': permission = 1; break;
592 case 'w': permission = 2; break;
593 case 'b': break;
594 default:
595 PyErr_BadArgument();
596 return NULL;
597 }
598 }
599
600 if ( (fp = newrfobject()) == NULL )
601 return NULL;
602
603 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
604
605 if ( err == fnfErr ) {
606 /* In stead of doing complicated things here to get creator/type
607 ** correct we let the standard i/o library handle it
608 */
609 FILE *tfp;
Jack Jansen697842f2001-09-10 22:00:39 +0000610 char pathname[PATHNAMELEN];
Jack Jansen76a05891996-02-29 16:11:32 +0000611
Jack Jansen697842f2001-09-10 22:00:39 +0000612 if ( err=PyMac_GetFullPathname(&fss, pathname, PATHNAMELEN) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000613 PyMac_Error(err);
614 Py_DECREF(fp);
615 return NULL;
616 }
617
618 if ( (tfp = fopen(pathname, "w")) == NULL ) {
619 PyMac_Error(fnfErr); /* What else... */
620 Py_DECREF(fp);
621 return NULL;
622 }
623 fclose(tfp);
624 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
625 }
626 if ( err ) {
627 Py_DECREF(fp);
628 PyMac_Error(err);
629 return NULL;
630 }
631 fp->isclosed = 0;
632 return (PyObject *)fp;
633}
634
Jack Jansenf3163302001-05-19 12:50:05 +0000635#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000636static char FreeMem_doc[] = "Return the total amount of free space in the heap";
637
638static PyObject *
639MacOS_FreeMem(PyObject *self, PyObject *args)
640{
641 long rv;
642
643 if (!PyArg_ParseTuple(args, ""))
644 return NULL;
645 rv = FreeMem();
646 return Py_BuildValue("l", rv);
647}
648
649static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
650
651static PyObject *
652MacOS_MaxBlock(PyObject *self, PyObject *args)
653{
654 long rv;
655
656 if (!PyArg_ParseTuple(args, ""))
657 return NULL;
658 rv = MaxBlock();
659 return Py_BuildValue("l", rv);
660}
661
662static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
663
664static PyObject *
665MacOS_CompactMem(PyObject *self, PyObject *args)
666{
667 long value;
668 long rv;
669
670 if (!PyArg_ParseTuple(args, "l", &value))
671 return NULL;
672 rv = CompactMem(value);
673 return Py_BuildValue("l", rv);
674}
675
Jack Jansenb19c6672000-10-12 21:24:05 +0000676static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always";
677
678static PyObject *
679MacOS_KeepConsole(PyObject *self, PyObject *args)
680{
681 int value;
682
683 if (!PyArg_ParseTuple(args, "i", &value))
684 return NULL;
685 PyMac_options.keep_console = value;
686 Py_INCREF(Py_None);
687 return Py_None;
688}
689
Jack Jansen8413b472000-10-19 22:02:16 +0000690static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option";
691
692static PyObject *
693MacOS_OutputSeen(PyObject *self, PyObject *args)
694{
695 if (!PyArg_ParseTuple(args, ""))
696 return NULL;
697 PyMac_OutputSeen();
698 Py_INCREF(Py_None);
699 return Py_None;
700}
Jack Jansenf3163302001-05-19 12:50:05 +0000701#endif /* !TARGET_API_MAC_OSX */
Jack Jansen8413b472000-10-19 22:02:16 +0000702
Guido van Rossum2d167031994-09-16 10:54:21 +0000703static PyMethodDef MacOS_Methods[] = {
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000704#if TARGET_API_MAC_OS8
Jack Jansen120a1051997-06-03 15:29:41 +0000705 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000706#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000707 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
708 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000709#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000710 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
711 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000712 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000713 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000714#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000715 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
716 {"openrf", MacOS_openrf, 1, openrf_doc},
717 {"splash", MacOS_splash, 1, splash_doc},
718 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000719 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000720 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000721#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000722 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
723 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
724 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Jack Jansenb19c6672000-10-12 21:24:05 +0000725 {"KeepConsole", MacOS_KeepConsole, 1, KeepConsole_doc},
Jack Jansen8413b472000-10-19 22:02:16 +0000726 {"OutputSeen", MacOS_OutputSeen, 1, OutputSeen_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000727#endif
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000728 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000729};
730
731
732void
Jack Jansendeefbe52001-08-08 13:46:49 +0000733initMacOS(void)
Guido van Rossum2d167031994-09-16 10:54:21 +0000734{
735 PyObject *m, *d;
736
737 m = Py_InitModule("MacOS", MacOS_Methods);
738 d = PyModule_GetDict(m);
739
740 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000741 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000742 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000743 return;
Jack Jansena755e681997-09-20 17:40:22 +0000744 Rftype.ob_type = &PyType_Type;
745 Py_INCREF(&Rftype);
746 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000747 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000748 /*
749 ** This is a hack: the following constant added to the id() of a string
750 ** object gives you the address of the data. Unfortunately, it is needed for
751 ** some of the image and sound processing interfaces on the mac:-(
752 */
753 {
754 PyStringObject *p = 0;
755 long off = (long)&(p->ob_sval[0]);
756
757 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000758 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000759 }
Jack Jansendeefbe52001-08-08 13:46:49 +0000760#if !TARGET_API_MAC_OSX
Jack Jansen8f5725a1999-12-07 23:08:10 +0000761 if (PyDict_SetItemString(d, "AppearanceCompliant",
762 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000763 return;
Jack Jansendeefbe52001-08-08 13:46:49 +0000764#endif
Jack Jansenf3163302001-05-19 12:50:05 +0000765#if TARGET_API_MAC_OSX
766#define PY_RUNTIMEMODEL "macho"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000767#elif TARGET_API_MAC_OS8
Jack Jansen193509b2001-01-23 22:38:23 +0000768#define PY_RUNTIMEMODEL "ppc"
Jack Jansenf3163302001-05-19 12:50:05 +0000769#elif TARGET_API_MAC_CARBON
770#define PY_RUNTIMEMODEL "carbon"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000771#else
772#error "None of the TARGET_API_MAC_XXX I know about is set"
Jack Jansen193509b2001-01-23 22:38:23 +0000773#endif
774 if (PyDict_SetItemString(d, "runtimemodel",
775 Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0)
776 return;
Guido van Rossum2d167031994-09-16 10:54:21 +0000777}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000778