blob: 4c7f2aa8dae4dc7467df6e08048cf723563352be [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"
Guido van Rossum2d167031994-09-16 10:54:21 +000029
Jack Jansenee23d6e1995-01-27 14:43:25 +000030#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000031#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000032#include <LowMem.h>
Jack Jansencbe6a531998-02-20 15:59:59 +000033#include <Sound.h>
Jack Jansene79dc762000-06-02 21:35:07 +000034#include <Events.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000035
Guido van Rossum2d167031994-09-16 10:54:21 +000036static PyObject *MacOS_Error; /* Exception MacOS.Error */
37
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000038#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000039#define bufferIsSmall -607 /*error returns from Post and Accept */
40#endif
41
Jack Jansen76a05891996-02-29 16:11:32 +000042static PyObject *ErrorObject;
43
44/* ----------------------------------------------------- */
45
46/* Declarations for objects of type Resource fork */
47
48typedef struct {
49 PyObject_HEAD
50 short fRefNum;
51 int isclosed;
52} rfobject;
53
54staticforward PyTypeObject Rftype;
55
56
57
58/* ---------------------------------------------------------------- */
59
60static void
61do_close(self)
62 rfobject *self;
63{
64 if (self->isclosed ) return;
65 (void)FSClose(self->fRefNum);
66 self->isclosed = 1;
67}
68
69static char rf_read__doc__[] =
70"Read data from resource fork"
71;
72
73static PyObject *
74rf_read(self, args)
75 rfobject *self;
76 PyObject *args;
77{
78 long n;
79 PyObject *v;
80 OSErr err;
81
82 if (self->isclosed) {
83 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
84 return NULL;
85 }
86
87 if (!PyArg_ParseTuple(args, "l", &n))
88 return NULL;
89
90 v = PyString_FromStringAndSize((char *)NULL, n);
91 if (v == NULL)
92 return NULL;
93
94 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
95 if (err && err != eofErr) {
96 PyMac_Error(err);
97 Py_DECREF(v);
98 return NULL;
99 }
100 _PyString_Resize(&v, n);
101 return v;
102}
103
104
105static char rf_write__doc__[] =
106"Write to resource fork"
107;
108
109static PyObject *
110rf_write(self, args)
111 rfobject *self;
112 PyObject *args;
113{
114 char *buffer;
115 long size;
116 OSErr err;
117
118 if (self->isclosed) {
119 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
120 return NULL;
121 }
Jack Janseneeccca91997-05-07 15:46:31 +0000122 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000123 return NULL;
124 err = FSWrite(self->fRefNum, &size, buffer);
125 if (err) {
126 PyMac_Error(err);
127 return NULL;
128 }
129 Py_INCREF(Py_None);
130 return Py_None;
131}
132
133
134static char rf_seek__doc__[] =
135"Set file position"
136;
137
138static PyObject *
139rf_seek(self, args)
140 rfobject *self;
141 PyObject *args;
142{
143 long amount, pos;
144 int whence = SEEK_SET;
145 long eof;
146 OSErr err;
147
148 if (self->isclosed) {
149 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
150 return NULL;
151 }
152 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
153 return NULL;
154
155 if ( err = GetEOF(self->fRefNum, &eof))
156 goto ioerr;
157
158 switch (whence) {
159 case SEEK_CUR:
160 if (err = GetFPos(self->fRefNum, &pos))
161 goto ioerr;
162 break;
163 case SEEK_END:
164 pos = eof;
165 break;
166 case SEEK_SET:
167 pos = 0;
168 break;
169 default:
170 PyErr_BadArgument();
171 return NULL;
172 }
173
174 pos += amount;
175
176 /* Don't bother implementing seek past EOF */
177 if (pos > eof || pos < 0) {
178 PyErr_BadArgument();
179 return NULL;
180 }
181
182 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
183ioerr:
184 PyMac_Error(err);
185 return NULL;
186 }
187 Py_INCREF(Py_None);
188 return Py_None;
189}
190
191
192static char rf_tell__doc__[] =
193"Get file position"
194;
195
196static PyObject *
197rf_tell(self, args)
198 rfobject *self;
199 PyObject *args;
200{
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;
210 if ( err = GetFPos(self->fRefNum, &where) ) {
211 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 *
222rf_close(self, args)
223 rfobject *self;
224 PyObject *args;
225{
Jack Jansen76a05891996-02-29 16:11:32 +0000226 if (!PyArg_ParseTuple(args, ""))
227 return NULL;
228 do_close(self);
229 Py_INCREF(Py_None);
230 return Py_None;
231}
232
233
234static struct PyMethodDef rf_methods[] = {
235 {"read", rf_read, 1, rf_read__doc__},
236 {"write", rf_write, 1, rf_write__doc__},
237 {"seek", rf_seek, 1, rf_seek__doc__},
238 {"tell", rf_tell, 1, rf_tell__doc__},
239 {"close", rf_close, 1, rf_close__doc__},
240
241 {NULL, NULL} /* sentinel */
242};
243
244/* ---------- */
245
246
247static rfobject *
248newrfobject()
249{
250 rfobject *self;
251
252 self = PyObject_NEW(rfobject, &Rftype);
253 if (self == NULL)
254 return NULL;
255 self->isclosed = 1;
256 return self;
257}
258
259
260static void
261rf_dealloc(self)
262 rfobject *self;
263{
264 do_close(self);
265 PyMem_DEL(self);
266}
267
268static PyObject *
269rf_getattr(self, name)
270 rfobject *self;
271 char *name;
272{
273 return Py_FindMethod(rf_methods, (PyObject *)self, name);
274}
275
276static char Rftype__doc__[] =
277"Resource fork file object"
278;
279
280static PyTypeObject Rftype = {
281 PyObject_HEAD_INIT(&PyType_Type)
282 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000283 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000284 sizeof(rfobject), /*tp_basicsize*/
285 0, /*tp_itemsize*/
286 /* methods */
287 (destructor)rf_dealloc, /*tp_dealloc*/
288 (printfunc)0, /*tp_print*/
289 (getattrfunc)rf_getattr, /*tp_getattr*/
290 (setattrfunc)0, /*tp_setattr*/
291 (cmpfunc)0, /*tp_compare*/
292 (reprfunc)0, /*tp_repr*/
293 0, /*tp_as_number*/
294 0, /*tp_as_sequence*/
295 0, /*tp_as_mapping*/
296 (hashfunc)0, /*tp_hash*/
297 (ternaryfunc)0, /*tp_call*/
298 (reprfunc)0, /*tp_str*/
299
300 /* Space for future expansion */
301 0L,0L,0L,0L,
302 Rftype__doc__ /* Documentation string */
303};
304
305/* End of code for Resource fork objects */
306/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000307
308/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000309/* Miscellaneous File System Operations */
310
Jack Jansen120a1051997-06-03 15:29:41 +0000311static char getcrtp_doc[] = "Obsolete, use macfs module";
312
Guido van Rossume791c2e1995-01-09 13:20:04 +0000313static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000314MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000315{
Jack Jansene79dc762000-06-02 21:35:07 +0000316 FSSpec fss;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000317 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000318 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000319 OSErr err;
320
Jack Jansene79dc762000-06-02 21:35:07 +0000321 if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000322 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000323 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000324 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000325 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000326 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
327 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000328 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000329 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000330 return res;
331}
332
Jack Jansen120a1051997-06-03 15:29:41 +0000333static char setcrtp_doc[] = "Obsolete, use macfs module";
334
Guido van Rossume791c2e1995-01-09 13:20:04 +0000335static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000336MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000337{
Jack Jansene79dc762000-06-02 21:35:07 +0000338 FSSpec fss;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000339 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000340 FInfo info;
341 OSErr err;
342
343 if (!PyArg_ParseTuple(args, "O&O&O&",
Jack Jansene79dc762000-06-02 21:35:07 +0000344 PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000345 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000346 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000347 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000348 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000349 info.fdType = type;
Jack Jansene79dc762000-06-02 21:35:07 +0000350 if ((err = FSpSetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000351 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000352 Py_INCREF(Py_None);
353 return Py_None;
354}
355
356/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000357/* STDWIN High Level Event interface */
358
359#include <EPPC.h>
360#include <Events.h>
361
362#ifdef USE_STDWIN
363
364extern void (*_w_high_level_event_proc)(EventRecord *);
365
366static PyObject *MacOS_HighLevelEventHandler = NULL;
367
368static void
Guido van Rossumbf068b11995-01-25 23:09:20 +0000369MacOS_HighLevelEventProc(EventRecord *e)
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000370{
371 if (MacOS_HighLevelEventHandler != NULL) {
Guido van Rossumbf068b11995-01-25 23:09:20 +0000372 PyObject *args = PyMac_BuildEventRecord(e);
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000373 PyObject *res;
374 if (args == NULL)
375 res = NULL;
376 else {
377 res = PyEval_CallObject(MacOS_HighLevelEventHandler, args);
378 Py_DECREF(args);
379 }
380 if (res == NULL) {
Jack Jansendeff89c1998-10-12 20:53:15 +0000381 PySys_WriteStderr("Exception in MacOS_HighLevelEventProc:\n");
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000382 PyErr_Print();
383 }
384 else
385 Py_DECREF(res);
386 }
387}
388
Jack Jansene8e8ae01995-01-26 16:36:45 +0000389/* XXXX Need to come here from PyMac_DoYield too... */
390
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000391static PyObject *
392MacOS_SetHighLevelEventHandler(self, args)
393 PyObject *self;
394 PyObject *args;
395{
396 PyObject *previous = MacOS_HighLevelEventHandler;
397 PyObject *next = NULL;
398 if (!PyArg_ParseTuple(args, "|O", &next))
399 return NULL;
400 if (next == Py_None)
401 next = NULL;
402 Py_INCREF(next);
403 MacOS_HighLevelEventHandler = next;
404 if (next == NULL)
405 _w_high_level_event_proc = NULL;
406 else
407 _w_high_level_event_proc = MacOS_HighLevelEventProc;
408 if (previous == NULL) {
409 Py_INCREF(Py_None);
410 previous = Py_None;
411 }
412 return previous;
413}
414
415#endif /* USE_STDWIN */
416
Jack Jansene79dc762000-06-02 21:35:07 +0000417#ifndef TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000418static char accepthle_doc[] = "Get arguments of pending high-level event";
419
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000420static PyObject *
421MacOS_AcceptHighLevelEvent(self, args)
422 PyObject *self;
423 PyObject *args;
424{
425 TargetID sender;
426 unsigned long refcon;
427 Ptr buf;
428 unsigned long len;
429 OSErr err;
430 PyObject *res;
431
432 buf = NULL;
433 len = 0;
434 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
435 if (err == bufferIsSmall) {
436 buf = malloc(len);
437 if (buf == NULL)
438 return PyErr_NoMemory();
439 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
440 if (err != noErr) {
441 free(buf);
442 return PyErr_Mac(MacOS_Error, (int)err);
443 }
444 }
445 else if (err != noErr)
446 return PyErr_Mac(MacOS_Error, (int)err);
447 res = Py_BuildValue("s#ls#",
448 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
449 free(buf);
450 return res;
451}
Jack Jansene79dc762000-06-02 21:35:07 +0000452#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000453static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
454
Jack Jansene8e8ae01995-01-26 16:36:45 +0000455/*
Jack Jansen120a1051997-06-03 15:29:41 +0000456** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000457*/
458static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000459MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000460{
Jack Jansen120a1051997-06-03 15:29:41 +0000461 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000462
Jack Jansen120a1051997-06-03 15:29:41 +0000463 PyMac_GetSchedParams(&old);
464 new = old;
465 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
466 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000467 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000468 PyMac_SetSchedParams(&new);
469 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
470 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000471}
472
Jack Jansen120a1051997-06-03 15:29:41 +0000473static char appswitch_doc[] = "Obsolete, use SchedParams";
474
475/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000476static PyObject *
477MacOS_EnableAppswitch(PyObject *self, PyObject *args)
478{
Jack Jansen120a1051997-06-03 15:29:41 +0000479 int new, old;
480 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000481
Guido van Rossume7134aa1995-02-26 10:20:53 +0000482 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000483 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000484 PyMac_GetSchedParams(&schp);
485 if ( schp.process_events )
486 old = 1;
487 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000488 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000489 else
490 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000491 if ( new > 0 ) {
492 schp.process_events = mDownMask|keyDownMask|osMask;
493 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000494 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000495 schp.process_events = 0;
496 schp.check_interrupt = 1;
497 } else {
498 schp.process_events = 0;
499 schp.check_interrupt = 0;
500 }
501 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000502 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000503}
504
Jack Jansen883765e1997-06-20 16:19:38 +0000505static char setevh_doc[] = "Set python event handler to be called in mainloop";
506
507static PyObject *
508MacOS_SetEventHandler(self, args)
509 PyObject *self;
510 PyObject *args;
511{
512 PyObject *evh = NULL;
513
514 if (!PyArg_ParseTuple(args, "|O", &evh))
515 return NULL;
516 if (evh == Py_None)
517 evh = NULL;
518 if ( evh && !PyCallable_Check(evh) ) {
519 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
520 return NULL;
521 }
522 if ( !PyMac_SetEventHandler(evh) )
523 return NULL;
524 Py_INCREF(Py_None);
525 return Py_None;
526}
527
Jack Jansen120a1051997-06-03 15:29:41 +0000528static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000529
530static PyObject *
531MacOS_HandleEvent(PyObject *self, PyObject *args)
532{
533 EventRecord ev;
534
535 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
536 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000537 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000538 Py_INCREF(Py_None);
539 return Py_None;
540}
541
Jack Jansen120a1051997-06-03 15:29:41 +0000542static char geterr_doc[] = "Convert OSErr number to string";
543
Jack Jansen829f88c1995-07-17 11:36:01 +0000544static PyObject *
545MacOS_GetErrorString(PyObject *self, PyObject *args)
546{
547 int errn;
548
549 if (!PyArg_ParseTuple(args, "i", &errn))
550 return NULL;
551 return Py_BuildValue("s", PyMac_StrError(errn));
552}
553
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000554static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
555
556static PyObject *
557MacOS_splash(PyObject *self, PyObject *args)
558{
Jack Jansendf34cf11996-09-15 22:12:00 +0000559 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000560 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000561 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000562 WindowRef theWindow;
563 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000564#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000565 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000566#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000567
Jack Jansendf34cf11996-09-15 22:12:00 +0000568 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000569 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000570 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000571 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000572
Jack Jansendf34cf11996-09-15 22:12:00 +0000573 if ( resid != -1 ) {
574 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000575 if ( curdialog ) {
576 theWindow = GetDialogWindow(curdialog);
577 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000578#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000579 width = thePort->portRect.right - thePort->portRect.left;
580 height = thePort->portRect.bottom - thePort->portRect.top;
581 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
582 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
583 xpos = (swidth-width)/2;
584 ypos = (sheight-height)/5 + LMGetMBarHeight();
585 MoveWindow(theWindow, xpos, ypos, 0);
586 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000587#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000588 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000589 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000590 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000591 if (olddialog)
592 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000593 Py_INCREF(Py_None);
594 return Py_None;
595}
596
Jack Janseneb76b841996-09-30 14:43:22 +0000597static char DebugStr_doc[] = "Switch to low-level debugger with a message";
598
599static PyObject *
600MacOS_DebugStr(PyObject *self, PyObject *args)
601{
602 Str255 message;
603 PyObject *object = 0;
604
605 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
606 return NULL;
607 DebugStr(message);
608 Py_INCREF(Py_None);
609 return Py_None;
610}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000611
Jack Jansen2e871e41997-09-08 13:23:19 +0000612static char SysBeep_doc[] = "BEEEEEP!!!";
613
614static PyObject *
615MacOS_SysBeep(PyObject *self, PyObject *args)
616{
617 int duration = 6;
618
619 if (!PyArg_ParseTuple(args, "|i", &duration))
620 return NULL;
621 SysBeep(duration);
622 Py_INCREF(Py_None);
623 return Py_None;
624}
625
Jack Jansen898ac1b1997-09-01 15:38:12 +0000626static char GetTicks_doc[] = "Return number of ticks since bootup";
627
628static PyObject *
629MacOS_GetTicks(PyObject *self, PyObject *args)
630{
Jack Jansene79dc762000-06-02 21:35:07 +0000631 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000632}
633
Jack Jansen76a05891996-02-29 16:11:32 +0000634static char openrf_doc[] = "Open resource fork of a file";
635
636static PyObject *
637MacOS_openrf(PyObject *self, PyObject *args)
638{
639 OSErr err;
640 char *mode = "r";
641 FSSpec fss;
642 SignedByte permission = 1;
643 rfobject *fp;
644
645 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
646 return NULL;
647 while (*mode) {
648 switch (*mode++) {
649 case '*': break;
650 case 'r': permission = 1; break;
651 case 'w': permission = 2; break;
652 case 'b': break;
653 default:
654 PyErr_BadArgument();
655 return NULL;
656 }
657 }
658
659 if ( (fp = newrfobject()) == NULL )
660 return NULL;
661
662 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
663
664 if ( err == fnfErr ) {
665 /* In stead of doing complicated things here to get creator/type
666 ** correct we let the standard i/o library handle it
667 */
668 FILE *tfp;
669 char pathname[257];
670
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000671 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000672 PyMac_Error(err);
673 Py_DECREF(fp);
674 return NULL;
675 }
676
677 if ( (tfp = fopen(pathname, "w")) == NULL ) {
678 PyMac_Error(fnfErr); /* What else... */
679 Py_DECREF(fp);
680 return NULL;
681 }
682 fclose(tfp);
683 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
684 }
685 if ( err ) {
686 Py_DECREF(fp);
687 PyMac_Error(err);
688 return NULL;
689 }
690 fp->isclosed = 0;
691 return (PyObject *)fp;
692}
693
Jack Jansen957d07a2000-02-21 11:07:37 +0000694static char FreeMem_doc[] = "Return the total amount of free space in the heap";
695
696static PyObject *
697MacOS_FreeMem(PyObject *self, PyObject *args)
698{
699 long rv;
700
701 if (!PyArg_ParseTuple(args, ""))
702 return NULL;
703 rv = FreeMem();
704 return Py_BuildValue("l", rv);
705}
706
707static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
708
709static PyObject *
710MacOS_MaxBlock(PyObject *self, PyObject *args)
711{
712 long rv;
713
714 if (!PyArg_ParseTuple(args, ""))
715 return NULL;
716 rv = MaxBlock();
717 return Py_BuildValue("l", rv);
718}
719
720static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
721
722static PyObject *
723MacOS_CompactMem(PyObject *self, PyObject *args)
724{
725 long value;
726 long rv;
727
728 if (!PyArg_ParseTuple(args, "l", &value))
729 return NULL;
730 rv = CompactMem(value);
731 return Py_BuildValue("l", rv);
732}
733
Guido van Rossum2d167031994-09-16 10:54:21 +0000734static PyMethodDef MacOS_Methods[] = {
Jack Jansene79dc762000-06-02 21:35:07 +0000735#ifndef TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000736 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000737#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000738 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
739 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000740#ifdef USE_STDWIN
741 {"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
742#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000743 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
744 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000745 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000746 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
747 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
748 {"openrf", MacOS_openrf, 1, openrf_doc},
749 {"splash", MacOS_splash, 1, splash_doc},
750 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000751 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000752 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansen957d07a2000-02-21 11:07:37 +0000753 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
754 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
755 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000756 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000757};
758
759
760void
Jack Jansend6741631998-07-01 15:48:54 +0000761initMacOS()
Guido van Rossum2d167031994-09-16 10:54:21 +0000762{
763 PyObject *m, *d;
764
765 m = Py_InitModule("MacOS", MacOS_Methods);
766 d = PyModule_GetDict(m);
767
768 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000769 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000770 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000771 Py_FatalError("can't define MacOS.Error");
Jack Jansena755e681997-09-20 17:40:22 +0000772 Rftype.ob_type = &PyType_Type;
773 Py_INCREF(&Rftype);
774 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
775 Py_FatalError("can't define MacOS.ResourceForkType");
Jack Jansenf73bab71997-04-03 14:51:03 +0000776 /*
777 ** This is a hack: the following constant added to the id() of a string
778 ** object gives you the address of the data. Unfortunately, it is needed for
779 ** some of the image and sound processing interfaces on the mac:-(
780 */
781 {
782 PyStringObject *p = 0;
783 long off = (long)&(p->ob_sval[0]);
784
785 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
786 Py_FatalError("Can't define MacOS.string_id_to_buffer");
787 }
Jack Jansen8f5725a1999-12-07 23:08:10 +0000788 if (PyDict_SetItemString(d, "AppearanceCompliant",
789 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
790 Py_FatalError("can't define MacOS.AppearanceCompliant");
Guido van Rossum2d167031994-09-16 10:54:21 +0000791}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000792