blob: b3dec5400d18097457e471238c6d6cc62faf1605 [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 Jansenee23d6e1995-01-27 14:43:25 +000031#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000032#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000033#include <LowMem.h>
Jack Jansencbe6a531998-02-20 15:59:59 +000034#include <Sound.h>
Jack Jansene79dc762000-06-02 21:35:07 +000035#include <Events.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000036
Guido van Rossum2d167031994-09-16 10:54:21 +000037static PyObject *MacOS_Error; /* Exception MacOS.Error */
38
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000039#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000040#define bufferIsSmall -607 /*error returns from Post and Accept */
41#endif
42
Jack Jansen76a05891996-02-29 16:11:32 +000043static PyObject *ErrorObject;
44
45/* ----------------------------------------------------- */
46
47/* Declarations for objects of type Resource fork */
48
49typedef struct {
50 PyObject_HEAD
51 short fRefNum;
52 int isclosed;
53} rfobject;
54
55staticforward PyTypeObject Rftype;
56
57
58
59/* ---------------------------------------------------------------- */
60
61static void
62do_close(self)
63 rfobject *self;
64{
65 if (self->isclosed ) return;
66 (void)FSClose(self->fRefNum);
67 self->isclosed = 1;
68}
69
70static char rf_read__doc__[] =
71"Read data from resource fork"
72;
73
74static PyObject *
75rf_read(self, args)
76 rfobject *self;
77 PyObject *args;
78{
79 long n;
80 PyObject *v;
81 OSErr err;
82
83 if (self->isclosed) {
84 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
85 return NULL;
86 }
87
88 if (!PyArg_ParseTuple(args, "l", &n))
89 return NULL;
90
91 v = PyString_FromStringAndSize((char *)NULL, n);
92 if (v == NULL)
93 return NULL;
94
95 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
96 if (err && err != eofErr) {
97 PyMac_Error(err);
98 Py_DECREF(v);
99 return NULL;
100 }
101 _PyString_Resize(&v, n);
102 return v;
103}
104
105
106static char rf_write__doc__[] =
107"Write to resource fork"
108;
109
110static PyObject *
111rf_write(self, args)
112 rfobject *self;
113 PyObject *args;
114{
115 char *buffer;
116 long size;
117 OSErr err;
118
119 if (self->isclosed) {
120 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
121 return NULL;
122 }
Jack Janseneeccca91997-05-07 15:46:31 +0000123 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000124 return NULL;
125 err = FSWrite(self->fRefNum, &size, buffer);
126 if (err) {
127 PyMac_Error(err);
128 return NULL;
129 }
130 Py_INCREF(Py_None);
131 return Py_None;
132}
133
134
135static char rf_seek__doc__[] =
136"Set file position"
137;
138
139static PyObject *
140rf_seek(self, args)
141 rfobject *self;
142 PyObject *args;
143{
144 long amount, pos;
145 int whence = SEEK_SET;
146 long eof;
147 OSErr err;
148
149 if (self->isclosed) {
150 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
151 return NULL;
152 }
153 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
154 return NULL;
155
156 if ( err = GetEOF(self->fRefNum, &eof))
157 goto ioerr;
158
159 switch (whence) {
160 case SEEK_CUR:
161 if (err = GetFPos(self->fRefNum, &pos))
162 goto ioerr;
163 break;
164 case SEEK_END:
165 pos = eof;
166 break;
167 case SEEK_SET:
168 pos = 0;
169 break;
170 default:
171 PyErr_BadArgument();
172 return NULL;
173 }
174
175 pos += amount;
176
177 /* Don't bother implementing seek past EOF */
178 if (pos > eof || pos < 0) {
179 PyErr_BadArgument();
180 return NULL;
181 }
182
183 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
184ioerr:
185 PyMac_Error(err);
186 return NULL;
187 }
188 Py_INCREF(Py_None);
189 return Py_None;
190}
191
192
193static char rf_tell__doc__[] =
194"Get file position"
195;
196
197static PyObject *
198rf_tell(self, args)
199 rfobject *self;
200 PyObject *args;
201{
202 long where;
203 OSErr err;
204
205 if (self->isclosed) {
206 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
207 return NULL;
208 }
209 if (!PyArg_ParseTuple(args, ""))
210 return NULL;
211 if ( err = GetFPos(self->fRefNum, &where) ) {
212 PyMac_Error(err);
213 return NULL;
214 }
215 return PyInt_FromLong(where);
216}
217
218static char rf_close__doc__[] =
219"Close resource fork"
220;
221
222static PyObject *
223rf_close(self, args)
224 rfobject *self;
225 PyObject *args;
226{
Jack Jansen76a05891996-02-29 16:11:32 +0000227 if (!PyArg_ParseTuple(args, ""))
228 return NULL;
229 do_close(self);
230 Py_INCREF(Py_None);
231 return Py_None;
232}
233
234
235static struct PyMethodDef rf_methods[] = {
236 {"read", rf_read, 1, rf_read__doc__},
237 {"write", rf_write, 1, rf_write__doc__},
238 {"seek", rf_seek, 1, rf_seek__doc__},
239 {"tell", rf_tell, 1, rf_tell__doc__},
240 {"close", rf_close, 1, rf_close__doc__},
241
242 {NULL, NULL} /* sentinel */
243};
244
245/* ---------- */
246
247
248static rfobject *
249newrfobject()
250{
251 rfobject *self;
252
253 self = PyObject_NEW(rfobject, &Rftype);
254 if (self == NULL)
255 return NULL;
256 self->isclosed = 1;
257 return self;
258}
259
260
261static void
262rf_dealloc(self)
263 rfobject *self;
264{
265 do_close(self);
266 PyMem_DEL(self);
267}
268
269static PyObject *
270rf_getattr(self, name)
271 rfobject *self;
272 char *name;
273{
274 return Py_FindMethod(rf_methods, (PyObject *)self, name);
275}
276
277static char Rftype__doc__[] =
278"Resource fork file object"
279;
280
281static PyTypeObject Rftype = {
282 PyObject_HEAD_INIT(&PyType_Type)
283 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000284 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000285 sizeof(rfobject), /*tp_basicsize*/
286 0, /*tp_itemsize*/
287 /* methods */
288 (destructor)rf_dealloc, /*tp_dealloc*/
289 (printfunc)0, /*tp_print*/
290 (getattrfunc)rf_getattr, /*tp_getattr*/
291 (setattrfunc)0, /*tp_setattr*/
292 (cmpfunc)0, /*tp_compare*/
293 (reprfunc)0, /*tp_repr*/
294 0, /*tp_as_number*/
295 0, /*tp_as_sequence*/
296 0, /*tp_as_mapping*/
297 (hashfunc)0, /*tp_hash*/
298 (ternaryfunc)0, /*tp_call*/
299 (reprfunc)0, /*tp_str*/
300
301 /* Space for future expansion */
302 0L,0L,0L,0L,
303 Rftype__doc__ /* Documentation string */
304};
305
306/* End of code for Resource fork objects */
307/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000308
309/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000310/* Miscellaneous File System Operations */
311
Jack Jansen120a1051997-06-03 15:29:41 +0000312static char getcrtp_doc[] = "Obsolete, use macfs module";
313
Guido van Rossume791c2e1995-01-09 13:20:04 +0000314static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000315MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000316{
Jack Jansene79dc762000-06-02 21:35:07 +0000317 FSSpec fss;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000318 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000319 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000320 OSErr err;
321
Jack Jansene79dc762000-06-02 21:35:07 +0000322 if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000323 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000324 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000325 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000326 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000327 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
328 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000329 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000330 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000331 return res;
332}
333
Jack Jansen120a1051997-06-03 15:29:41 +0000334static char setcrtp_doc[] = "Obsolete, use macfs module";
335
Guido van Rossume791c2e1995-01-09 13:20:04 +0000336static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000337MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000338{
Jack Jansene79dc762000-06-02 21:35:07 +0000339 FSSpec fss;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000340 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000341 FInfo info;
342 OSErr err;
343
344 if (!PyArg_ParseTuple(args, "O&O&O&",
Jack Jansene79dc762000-06-02 21:35:07 +0000345 PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000346 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000347 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000348 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000349 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000350 info.fdType = type;
Jack Jansene79dc762000-06-02 21:35:07 +0000351 if ((err = FSpSetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000352 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000353 Py_INCREF(Py_None);
354 return Py_None;
355}
356
357/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000358/* STDWIN High Level Event interface */
359
360#include <EPPC.h>
361#include <Events.h>
362
Jack Jansen74a1e632000-07-14 22:37:27 +0000363#if !TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000364static char accepthle_doc[] = "Get arguments of pending high-level event";
365
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000366static PyObject *
367MacOS_AcceptHighLevelEvent(self, args)
368 PyObject *self;
369 PyObject *args;
370{
371 TargetID sender;
372 unsigned long refcon;
373 Ptr buf;
374 unsigned long len;
375 OSErr err;
376 PyObject *res;
377
378 buf = NULL;
379 len = 0;
380 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
381 if (err == bufferIsSmall) {
382 buf = malloc(len);
383 if (buf == NULL)
384 return PyErr_NoMemory();
385 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
386 if (err != noErr) {
387 free(buf);
388 return PyErr_Mac(MacOS_Error, (int)err);
389 }
390 }
391 else if (err != noErr)
392 return PyErr_Mac(MacOS_Error, (int)err);
393 res = Py_BuildValue("s#ls#",
394 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
395 free(buf);
396 return res;
397}
Jack Jansene79dc762000-06-02 21:35:07 +0000398#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000399static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
400
Jack Jansene8e8ae01995-01-26 16:36:45 +0000401/*
Jack Jansen120a1051997-06-03 15:29:41 +0000402** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000403*/
404static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000405MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000406{
Jack Jansen120a1051997-06-03 15:29:41 +0000407 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000408
Jack Jansen120a1051997-06-03 15:29:41 +0000409 PyMac_GetSchedParams(&old);
410 new = old;
411 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
412 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000413 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000414 PyMac_SetSchedParams(&new);
415 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
416 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000417}
418
Jack Jansen120a1051997-06-03 15:29:41 +0000419static char appswitch_doc[] = "Obsolete, use SchedParams";
420
421/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000422static PyObject *
423MacOS_EnableAppswitch(PyObject *self, PyObject *args)
424{
Jack Jansen120a1051997-06-03 15:29:41 +0000425 int new, old;
426 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000427
Guido van Rossume7134aa1995-02-26 10:20:53 +0000428 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000429 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000430 PyMac_GetSchedParams(&schp);
431 if ( schp.process_events )
432 old = 1;
433 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000434 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000435 else
436 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000437 if ( new > 0 ) {
438 schp.process_events = mDownMask|keyDownMask|osMask;
439 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000440 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000441 schp.process_events = 0;
442 schp.check_interrupt = 1;
443 } else {
444 schp.process_events = 0;
445 schp.check_interrupt = 0;
446 }
447 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000448 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000449}
450
Jack Jansen883765e1997-06-20 16:19:38 +0000451static char setevh_doc[] = "Set python event handler to be called in mainloop";
452
453static PyObject *
454MacOS_SetEventHandler(self, args)
455 PyObject *self;
456 PyObject *args;
457{
458 PyObject *evh = NULL;
459
460 if (!PyArg_ParseTuple(args, "|O", &evh))
461 return NULL;
462 if (evh == Py_None)
463 evh = NULL;
464 if ( evh && !PyCallable_Check(evh) ) {
465 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
466 return NULL;
467 }
468 if ( !PyMac_SetEventHandler(evh) )
469 return NULL;
470 Py_INCREF(Py_None);
471 return Py_None;
472}
473
Jack Jansen120a1051997-06-03 15:29:41 +0000474static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000475
476static PyObject *
477MacOS_HandleEvent(PyObject *self, PyObject *args)
478{
479 EventRecord ev;
480
481 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
482 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000483 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000484 Py_INCREF(Py_None);
485 return Py_None;
486}
487
Jack Jansen120a1051997-06-03 15:29:41 +0000488static char geterr_doc[] = "Convert OSErr number to string";
489
Jack Jansen829f88c1995-07-17 11:36:01 +0000490static PyObject *
491MacOS_GetErrorString(PyObject *self, PyObject *args)
492{
493 int errn;
494
495 if (!PyArg_ParseTuple(args, "i", &errn))
496 return NULL;
497 return Py_BuildValue("s", PyMac_StrError(errn));
498}
499
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000500static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
501
502static PyObject *
503MacOS_splash(PyObject *self, PyObject *args)
504{
Jack Jansendf34cf11996-09-15 22:12:00 +0000505 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000506 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000507 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000508 WindowRef theWindow;
509 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000510#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000511 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000512#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000513
Jack Jansendf34cf11996-09-15 22:12:00 +0000514 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000515 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000516 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000517 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000518
Jack Jansendf34cf11996-09-15 22:12:00 +0000519 if ( resid != -1 ) {
520 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000521 if ( curdialog ) {
522 theWindow = GetDialogWindow(curdialog);
523 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000524#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000525 width = thePort->portRect.right - thePort->portRect.left;
526 height = thePort->portRect.bottom - thePort->portRect.top;
527 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
528 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
529 xpos = (swidth-width)/2;
530 ypos = (sheight-height)/5 + LMGetMBarHeight();
531 MoveWindow(theWindow, xpos, ypos, 0);
532 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000533#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000534 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000535 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000536 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000537 if (olddialog)
538 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000539 Py_INCREF(Py_None);
540 return Py_None;
541}
542
Jack Janseneb76b841996-09-30 14:43:22 +0000543static char DebugStr_doc[] = "Switch to low-level debugger with a message";
544
545static PyObject *
546MacOS_DebugStr(PyObject *self, PyObject *args)
547{
548 Str255 message;
549 PyObject *object = 0;
550
551 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
552 return NULL;
553 DebugStr(message);
554 Py_INCREF(Py_None);
555 return Py_None;
556}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000557
Jack Jansen2e871e41997-09-08 13:23:19 +0000558static char SysBeep_doc[] = "BEEEEEP!!!";
559
560static PyObject *
561MacOS_SysBeep(PyObject *self, PyObject *args)
562{
563 int duration = 6;
564
565 if (!PyArg_ParseTuple(args, "|i", &duration))
566 return NULL;
567 SysBeep(duration);
568 Py_INCREF(Py_None);
569 return Py_None;
570}
571
Jack Jansen898ac1b1997-09-01 15:38:12 +0000572static char GetTicks_doc[] = "Return number of ticks since bootup";
573
574static PyObject *
575MacOS_GetTicks(PyObject *self, PyObject *args)
576{
Jack Jansene79dc762000-06-02 21:35:07 +0000577 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000578}
579
Jack Jansen76a05891996-02-29 16:11:32 +0000580static char openrf_doc[] = "Open resource fork of a file";
581
582static PyObject *
583MacOS_openrf(PyObject *self, PyObject *args)
584{
585 OSErr err;
586 char *mode = "r";
587 FSSpec fss;
588 SignedByte permission = 1;
589 rfobject *fp;
590
591 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
592 return NULL;
593 while (*mode) {
594 switch (*mode++) {
595 case '*': break;
596 case 'r': permission = 1; break;
597 case 'w': permission = 2; break;
598 case 'b': break;
599 default:
600 PyErr_BadArgument();
601 return NULL;
602 }
603 }
604
605 if ( (fp = newrfobject()) == NULL )
606 return NULL;
607
608 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
609
610 if ( err == fnfErr ) {
611 /* In stead of doing complicated things here to get creator/type
612 ** correct we let the standard i/o library handle it
613 */
614 FILE *tfp;
615 char pathname[257];
616
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000617 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000618 PyMac_Error(err);
619 Py_DECREF(fp);
620 return NULL;
621 }
622
623 if ( (tfp = fopen(pathname, "w")) == NULL ) {
624 PyMac_Error(fnfErr); /* What else... */
625 Py_DECREF(fp);
626 return NULL;
627 }
628 fclose(tfp);
629 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
630 }
631 if ( err ) {
632 Py_DECREF(fp);
633 PyMac_Error(err);
634 return NULL;
635 }
636 fp->isclosed = 0;
637 return (PyObject *)fp;
638}
639
Jack Jansen957d07a2000-02-21 11:07:37 +0000640static char FreeMem_doc[] = "Return the total amount of free space in the heap";
641
642static PyObject *
643MacOS_FreeMem(PyObject *self, PyObject *args)
644{
645 long rv;
646
647 if (!PyArg_ParseTuple(args, ""))
648 return NULL;
649 rv = FreeMem();
650 return Py_BuildValue("l", rv);
651}
652
653static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
654
655static PyObject *
656MacOS_MaxBlock(PyObject *self, PyObject *args)
657{
658 long rv;
659
660 if (!PyArg_ParseTuple(args, ""))
661 return NULL;
662 rv = MaxBlock();
663 return Py_BuildValue("l", rv);
664}
665
666static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
667
668static PyObject *
669MacOS_CompactMem(PyObject *self, PyObject *args)
670{
671 long value;
672 long rv;
673
674 if (!PyArg_ParseTuple(args, "l", &value))
675 return NULL;
676 rv = CompactMem(value);
677 return Py_BuildValue("l", rv);
678}
679
Jack Jansenb19c6672000-10-12 21:24:05 +0000680static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always";
681
682static PyObject *
683MacOS_KeepConsole(PyObject *self, PyObject *args)
684{
685 int value;
686
687 if (!PyArg_ParseTuple(args, "i", &value))
688 return NULL;
689 PyMac_options.keep_console = value;
690 Py_INCREF(Py_None);
691 return Py_None;
692}
693
Jack Jansen8413b472000-10-19 22:02:16 +0000694static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option";
695
696static PyObject *
697MacOS_OutputSeen(PyObject *self, PyObject *args)
698{
699 if (!PyArg_ParseTuple(args, ""))
700 return NULL;
701 PyMac_OutputSeen();
702 Py_INCREF(Py_None);
703 return Py_None;
704}
705
Guido van Rossum2d167031994-09-16 10:54:21 +0000706static PyMethodDef MacOS_Methods[] = {
Jack Jansen74a1e632000-07-14 22:37:27 +0000707#if !TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000708 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000709#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000710 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
711 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000712 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
713 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000714 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000715 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
716 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
717 {"openrf", MacOS_openrf, 1, openrf_doc},
718 {"splash", MacOS_splash, 1, splash_doc},
719 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000720 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000721 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
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},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000727 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000728};
729
730
731void
Jack Jansend6741631998-07-01 15:48:54 +0000732initMacOS()
Guido van Rossum2d167031994-09-16 10:54:21 +0000733{
734 PyObject *m, *d;
735
736 m = Py_InitModule("MacOS", MacOS_Methods);
737 d = PyModule_GetDict(m);
738
739 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000740 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000741 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000742 return;
Jack Jansena755e681997-09-20 17:40:22 +0000743 Rftype.ob_type = &PyType_Type;
744 Py_INCREF(&Rftype);
745 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000746 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000747 /*
748 ** This is a hack: the following constant added to the id() of a string
749 ** object gives you the address of the data. Unfortunately, it is needed for
750 ** some of the image and sound processing interfaces on the mac:-(
751 */
752 {
753 PyStringObject *p = 0;
754 long off = (long)&(p->ob_sval[0]);
755
756 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000757 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000758 }
Jack Jansen8f5725a1999-12-07 23:08:10 +0000759 if (PyDict_SetItemString(d, "AppearanceCompliant",
760 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000761 return;
Guido van Rossum2d167031994-09-16 10:54:21 +0000762}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000763