blob: 2ff58958537b969f19dabffa9097a6ed25f7a27f [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
Jeremy Hylton938ace62002-07-17 16:30:39 +000063static PyTypeObject Rftype;
Jack Jansen76a05891996-02-29 16:11:32 +000064
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);
Jack Jansen0e2f7982002-05-22 14:31:48 +0000262 PyObject_DEL(self);
Jack Jansen76a05891996-02-29 16:11:32 +0000263}
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*/
Guido van Rossum14648392001-12-08 18:02:58 +0000278 "MacOS.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 Jansenf3163302001-05-19 12:50:05 +0000351#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000352static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
353
Jack Jansene8e8ae01995-01-26 16:36:45 +0000354/*
Jack Jansen120a1051997-06-03 15:29:41 +0000355** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000356*/
357static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000358MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000359{
Jack Jansen120a1051997-06-03 15:29:41 +0000360 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000361
Jack Jansen120a1051997-06-03 15:29:41 +0000362 PyMac_GetSchedParams(&old);
363 new = old;
364 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
365 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000366 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000367 PyMac_SetSchedParams(&new);
368 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
369 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000370}
371
Jack Jansen120a1051997-06-03 15:29:41 +0000372static char appswitch_doc[] = "Obsolete, use SchedParams";
373
374/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000375static PyObject *
376MacOS_EnableAppswitch(PyObject *self, PyObject *args)
377{
Jack Jansen120a1051997-06-03 15:29:41 +0000378 int new, old;
379 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000380
Guido van Rossume7134aa1995-02-26 10:20:53 +0000381 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000382 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000383 PyMac_GetSchedParams(&schp);
384 if ( schp.process_events )
385 old = 1;
386 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000387 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000388 else
389 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000390 if ( new > 0 ) {
391 schp.process_events = mDownMask|keyDownMask|osMask;
392 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000393 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000394 schp.process_events = 0;
395 schp.check_interrupt = 1;
396 } else {
397 schp.process_events = 0;
398 schp.check_interrupt = 0;
399 }
400 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000401 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000402}
403
Jack Jansen883765e1997-06-20 16:19:38 +0000404static char setevh_doc[] = "Set python event handler to be called in mainloop";
405
406static PyObject *
Jack Jansendeefbe52001-08-08 13:46:49 +0000407MacOS_SetEventHandler(PyObject *self, PyObject *args)
Jack Jansen883765e1997-06-20 16:19:38 +0000408{
409 PyObject *evh = NULL;
410
411 if (!PyArg_ParseTuple(args, "|O", &evh))
412 return NULL;
413 if (evh == Py_None)
414 evh = NULL;
415 if ( evh && !PyCallable_Check(evh) ) {
416 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
417 return NULL;
418 }
419 if ( !PyMac_SetEventHandler(evh) )
420 return NULL;
421 Py_INCREF(Py_None);
422 return Py_None;
423}
424
Jack Jansen120a1051997-06-03 15:29:41 +0000425static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000426
427static PyObject *
428MacOS_HandleEvent(PyObject *self, PyObject *args)
429{
430 EventRecord ev;
431
432 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
433 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000434 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000435 Py_INCREF(Py_None);
436 return Py_None;
437}
Jack Jansenf3163302001-05-19 12:50:05 +0000438#endif /* !TARGET_API_MAC_OSX */
Jack Jansena76382a1995-02-02 14:25:56 +0000439
Jack Jansen120a1051997-06-03 15:29:41 +0000440static char geterr_doc[] = "Convert OSErr number to string";
441
Jack Jansen829f88c1995-07-17 11:36:01 +0000442static PyObject *
443MacOS_GetErrorString(PyObject *self, PyObject *args)
444{
445 int errn;
446
447 if (!PyArg_ParseTuple(args, "i", &errn))
448 return NULL;
449 return Py_BuildValue("s", PyMac_StrError(errn));
450}
451
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000452static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
453
454static PyObject *
455MacOS_splash(PyObject *self, PyObject *args)
456{
Jack Jansendf34cf11996-09-15 22:12:00 +0000457 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000458 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000459 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000460 WindowRef theWindow;
461 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000462#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000463 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000464#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000465
Jack Jansendf34cf11996-09-15 22:12:00 +0000466 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000467 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000468 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000469 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000470
Jack Jansendf34cf11996-09-15 22:12:00 +0000471 if ( resid != -1 ) {
472 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000473 if ( curdialog ) {
474 theWindow = GetDialogWindow(curdialog);
475 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000476#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000477 width = thePort->portRect.right - thePort->portRect.left;
478 height = thePort->portRect.bottom - thePort->portRect.top;
479 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
480 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
481 xpos = (swidth-width)/2;
482 ypos = (sheight-height)/5 + LMGetMBarHeight();
483 MoveWindow(theWindow, xpos, ypos, 0);
484 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000485#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000486 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000487 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000488 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000489 if (olddialog)
490 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000491 Py_INCREF(Py_None);
492 return Py_None;
493}
494
Jack Janseneb76b841996-09-30 14:43:22 +0000495static char DebugStr_doc[] = "Switch to low-level debugger with a message";
496
497static PyObject *
498MacOS_DebugStr(PyObject *self, PyObject *args)
499{
500 Str255 message;
501 PyObject *object = 0;
502
503 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
504 return NULL;
505 DebugStr(message);
506 Py_INCREF(Py_None);
507 return Py_None;
508}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000509
Jack Jansen2e871e41997-09-08 13:23:19 +0000510static char SysBeep_doc[] = "BEEEEEP!!!";
511
512static PyObject *
513MacOS_SysBeep(PyObject *self, PyObject *args)
514{
515 int duration = 6;
516
517 if (!PyArg_ParseTuple(args, "|i", &duration))
518 return NULL;
519 SysBeep(duration);
520 Py_INCREF(Py_None);
521 return Py_None;
522}
523
Jack Jansen898ac1b1997-09-01 15:38:12 +0000524static char GetTicks_doc[] = "Return number of ticks since bootup";
525
526static PyObject *
527MacOS_GetTicks(PyObject *self, PyObject *args)
528{
Jack Jansene79dc762000-06-02 21:35:07 +0000529 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000530}
531
Jack Jansen76a05891996-02-29 16:11:32 +0000532static char openrf_doc[] = "Open resource fork of a file";
533
534static PyObject *
535MacOS_openrf(PyObject *self, PyObject *args)
536{
537 OSErr err;
538 char *mode = "r";
539 FSSpec fss;
540 SignedByte permission = 1;
541 rfobject *fp;
542
543 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
544 return NULL;
545 while (*mode) {
546 switch (*mode++) {
547 case '*': break;
548 case 'r': permission = 1; break;
549 case 'w': permission = 2; break;
550 case 'b': break;
551 default:
552 PyErr_BadArgument();
553 return NULL;
554 }
555 }
556
557 if ( (fp = newrfobject()) == NULL )
558 return NULL;
559
560 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
561
562 if ( err == fnfErr ) {
563 /* In stead of doing complicated things here to get creator/type
564 ** correct we let the standard i/o library handle it
565 */
566 FILE *tfp;
Jack Jansen697842f2001-09-10 22:00:39 +0000567 char pathname[PATHNAMELEN];
Jack Jansen76a05891996-02-29 16:11:32 +0000568
Jack Jansen697842f2001-09-10 22:00:39 +0000569 if ( err=PyMac_GetFullPathname(&fss, pathname, PATHNAMELEN) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000570 PyMac_Error(err);
571 Py_DECREF(fp);
572 return NULL;
573 }
574
575 if ( (tfp = fopen(pathname, "w")) == NULL ) {
576 PyMac_Error(fnfErr); /* What else... */
577 Py_DECREF(fp);
578 return NULL;
579 }
580 fclose(tfp);
581 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
582 }
583 if ( err ) {
584 Py_DECREF(fp);
585 PyMac_Error(err);
586 return NULL;
587 }
588 fp->isclosed = 0;
589 return (PyObject *)fp;
590}
591
Jack Jansenf3163302001-05-19 12:50:05 +0000592#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000593static char FreeMem_doc[] = "Return the total amount of free space in the heap";
594
595static PyObject *
596MacOS_FreeMem(PyObject *self, PyObject *args)
597{
598 long rv;
599
600 if (!PyArg_ParseTuple(args, ""))
601 return NULL;
602 rv = FreeMem();
603 return Py_BuildValue("l", rv);
604}
605
606static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
607
608static PyObject *
609MacOS_MaxBlock(PyObject *self, PyObject *args)
610{
611 long rv;
612
613 if (!PyArg_ParseTuple(args, ""))
614 return NULL;
615 rv = MaxBlock();
616 return Py_BuildValue("l", rv);
617}
618
619static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
620
621static PyObject *
622MacOS_CompactMem(PyObject *self, PyObject *args)
623{
624 long value;
625 long rv;
626
627 if (!PyArg_ParseTuple(args, "l", &value))
628 return NULL;
629 rv = CompactMem(value);
630 return Py_BuildValue("l", rv);
631}
632
Jack Jansenb19c6672000-10-12 21:24:05 +0000633static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always";
634
635static PyObject *
636MacOS_KeepConsole(PyObject *self, PyObject *args)
637{
638 int value;
639
640 if (!PyArg_ParseTuple(args, "i", &value))
641 return NULL;
642 PyMac_options.keep_console = value;
643 Py_INCREF(Py_None);
644 return Py_None;
645}
646
Jack Jansen8413b472000-10-19 22:02:16 +0000647static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option";
648
649static PyObject *
650MacOS_OutputSeen(PyObject *self, PyObject *args)
651{
652 if (!PyArg_ParseTuple(args, ""))
653 return NULL;
654 PyMac_OutputSeen();
655 Py_INCREF(Py_None);
656 return Py_None;
657}
Jack Jansenf3163302001-05-19 12:50:05 +0000658#endif /* !TARGET_API_MAC_OSX */
Jack Jansen8413b472000-10-19 22:02:16 +0000659
Guido van Rossum2d167031994-09-16 10:54:21 +0000660static PyMethodDef MacOS_Methods[] = {
Jack Jansen120a1051997-06-03 15:29:41 +0000661 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
662 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000663#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000664 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
665 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000666 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000667 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000668#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000669 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
670 {"openrf", MacOS_openrf, 1, openrf_doc},
671 {"splash", MacOS_splash, 1, splash_doc},
672 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000673 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000674 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000675#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000676 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
677 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
678 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Jack Jansenb19c6672000-10-12 21:24:05 +0000679 {"KeepConsole", MacOS_KeepConsole, 1, KeepConsole_doc},
Jack Jansen8413b472000-10-19 22:02:16 +0000680 {"OutputSeen", MacOS_OutputSeen, 1, OutputSeen_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000681#endif
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000682 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000683};
684
685
686void
Jack Jansendeefbe52001-08-08 13:46:49 +0000687initMacOS(void)
Guido van Rossum2d167031994-09-16 10:54:21 +0000688{
689 PyObject *m, *d;
690
691 m = Py_InitModule("MacOS", MacOS_Methods);
692 d = PyModule_GetDict(m);
693
694 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000695 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000696 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000697 return;
Jack Jansena755e681997-09-20 17:40:22 +0000698 Rftype.ob_type = &PyType_Type;
699 Py_INCREF(&Rftype);
700 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000701 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000702 /*
703 ** This is a hack: the following constant added to the id() of a string
704 ** object gives you the address of the data. Unfortunately, it is needed for
705 ** some of the image and sound processing interfaces on the mac:-(
706 */
707 {
708 PyStringObject *p = 0;
709 long off = (long)&(p->ob_sval[0]);
710
711 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000712 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000713 }
Jack Jansenf3163302001-05-19 12:50:05 +0000714#if TARGET_API_MAC_OSX
715#define PY_RUNTIMEMODEL "macho"
Jack Jansenf3163302001-05-19 12:50:05 +0000716#elif TARGET_API_MAC_CARBON
717#define PY_RUNTIMEMODEL "carbon"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000718#else
719#error "None of the TARGET_API_MAC_XXX I know about is set"
Jack Jansen193509b2001-01-23 22:38:23 +0000720#endif
721 if (PyDict_SetItemString(d, "runtimemodel",
722 Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0)
723 return;
Guido van Rossum2d167031994-09-16 10:54:21 +0000724}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000725