cpython/Mac/Modules/ctl/Ctlmodule.c

740 lines
18 KiB
C

/* =========================== Module Ctl =========================== */
#include "Python.h"
#define SystemSevenOrLater 1
#include "macglue.h"
#include <Memory.h>
#include <Dialogs.h>
#include <Menus.h>
#include <Controls.h>
extern PyObject *ResObj_New(Handle);
extern int ResObj_Convert(PyObject *, Handle *);
extern PyObject *OptResObj_New(Handle);
extern int OptResObj_Convert(PyObject *, Handle *);
extern PyObject *WinObj_New(WindowPtr);
extern int WinObj_Convert(PyObject *, WindowPtr *);
extern PyTypeObject Window_Type;
#define WinObj_Check(x) ((x)->ob_type == &Window_Type)
extern PyObject *DlgObj_New(DialogPtr);
extern int DlgObj_Convert(PyObject *, DialogPtr *);
extern PyTypeObject Dialog_Type;
#define DlgObj_Check(x) ((x)->ob_type == &Dialog_Type)
extern PyObject *MenuObj_New(MenuHandle);
extern int MenuObj_Convert(PyObject *, MenuHandle *);
extern PyObject *CtlObj_New(ControlHandle);
extern int CtlObj_Convert(PyObject *, ControlHandle *);
extern PyObject *GrafObj_New(GrafPtr);
extern int GrafObj_Convert(PyObject *, GrafPtr *);
extern PyObject *BMObj_New(BitMapPtr);
extern int BMObj_Convert(PyObject *, BitMapPtr *);
extern PyObject *WinObj_WhichWindow(WindowPtr);
#include <Controls.h>
#define resNotFound -192 /* Can't include <Errors.h> because of Python's "errors.h" */
extern PyObject *CtlObj_WhichControl(ControlHandle); /* Forward */
#ifdef THINK_C
#define ControlActionUPP ProcPtr
#endif
static PyObject *Ctl_Error;
/* ---------------------- Object type Control ----------------------- */
PyTypeObject Control_Type;
#define CtlObj_Check(x) ((x)->ob_type == &Control_Type)
typedef struct ControlObject {
PyObject_HEAD
ControlHandle ob_itself;
} ControlObject;
PyObject *CtlObj_New(itself)
ControlHandle itself;
{
ControlObject *it;
if (itself == NULL) return PyMac_Error(resNotFound);
it = PyObject_NEW(ControlObject, &Control_Type);
if (it == NULL) return NULL;
it->ob_itself = itself;
SetControlReference(itself, (long)it);
return (PyObject *)it;
}
CtlObj_Convert(v, p_itself)
PyObject *v;
ControlHandle *p_itself;
{
if (!CtlObj_Check(v))
{
PyErr_SetString(PyExc_TypeError, "Control required");
return 0;
}
*p_itself = ((ControlObject *)v)->ob_itself;
return 1;
}
static void CtlObj_dealloc(self)
ControlObject *self;
{
if (self->ob_itself) SetControlReference(self->ob_itself, (long)0); /* Make it forget about us */
PyMem_DEL(self);
}
static PyObject *CtlObj_ShowControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
ShowControl(_self->ob_itself);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_HideControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
HideControl(_self->ob_itself);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_Draw1Control(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
Draw1Control(_self->ob_itself);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_HiliteControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlPartCode hiliteState;
if (!PyArg_ParseTuple(_args, "h",
&hiliteState))
return NULL;
HiliteControl(_self->ob_itself,
hiliteState);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_TrackControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlPartCode _rv;
Point thePoint;
if (!PyArg_ParseTuple(_args, "O&",
PyMac_GetPoint, &thePoint))
return NULL;
_rv = TrackControl(_self->ob_itself,
thePoint,
(ControlActionUPP)0);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_DragControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
Point startPoint;
Rect limitRect;
Rect slopRect;
DragConstraint axis;
if (!PyArg_ParseTuple(_args, "O&O&O&h",
PyMac_GetPoint, &startPoint,
PyMac_GetRect, &limitRect,
PyMac_GetRect, &slopRect,
&axis))
return NULL;
DragControl(_self->ob_itself,
startPoint,
&limitRect,
&slopRect,
axis);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_TestControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlPartCode _rv;
Point thePoint;
if (!PyArg_ParseTuple(_args, "O&",
PyMac_GetPoint, &thePoint))
return NULL;
_rv = TestControl(_self->ob_itself,
thePoint);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_MoveControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 h;
SInt16 v;
if (!PyArg_ParseTuple(_args, "hh",
&h,
&v))
return NULL;
MoveControl(_self->ob_itself,
h,
v);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_SizeControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 w;
SInt16 h;
if (!PyArg_ParseTuple(_args, "hh",
&w,
&h))
return NULL;
SizeControl(_self->ob_itself,
w,
h);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_SetControlTitle(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
Str255 title;
if (!PyArg_ParseTuple(_args, "O&",
PyMac_GetStr255, title))
return NULL;
SetControlTitle(_self->ob_itself,
title);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlTitle(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
Str255 title;
if (!PyArg_ParseTuple(_args, "O&",
PyMac_GetStr255, title))
return NULL;
GetControlTitle(_self->ob_itself,
title);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlValue(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 _rv;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetControlValue(_self->ob_itself);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_SetControlValue(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 newValue;
if (!PyArg_ParseTuple(_args, "h",
&newValue))
return NULL;
SetControlValue(_self->ob_itself,
newValue);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlMinimum(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 _rv;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetControlMinimum(_self->ob_itself);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_SetControlMinimum(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 newMinimum;
if (!PyArg_ParseTuple(_args, "h",
&newMinimum))
return NULL;
SetControlMinimum(_self->ob_itself,
newMinimum);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlMaximum(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 _rv;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetControlMaximum(_self->ob_itself);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_SetControlMaximum(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 newMaximum;
if (!PyArg_ParseTuple(_args, "h",
&newMaximum))
return NULL;
SetControlMaximum(_self->ob_itself,
newMaximum);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlVariant(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt16 _rv;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetControlVariant(_self->ob_itself);
_res = Py_BuildValue("h",
_rv);
return _res;
}
static PyObject *CtlObj_SetControlAction(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
SetControlAction(_self->ob_itself,
(ControlActionUPP)0);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_SetControlReference(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt32 data;
if (!PyArg_ParseTuple(_args, "l",
&data))
return NULL;
SetControlReference(_self->ob_itself,
data);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_GetControlReference(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
SInt32 _rv;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetControlReference(_self->ob_itself);
_res = Py_BuildValue("l",
_rv);
return _res;
}
static PyObject *CtlObj_GetAuxiliaryControlRecord(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
Boolean _rv;
AuxCtlHandle acHndl;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
_rv = GetAuxiliaryControlRecord(_self->ob_itself,
&acHndl);
_res = Py_BuildValue("bO&",
_rv,
ResObj_New, acHndl);
return _res;
}
static PyObject *CtlObj_SetControlColor(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
CCTabHandle newColorTable;
if (!PyArg_ParseTuple(_args, "O&",
ResObj_Convert, &newColorTable))
return NULL;
SetControlColor(_self->ob_itself,
newColorTable);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *CtlObj_as_Resource(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
return ResObj_New((Handle)_self->ob_itself);
}
static PyObject *CtlObj_DisposeControl(_self, _args)
ControlObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
if (!PyArg_ParseTuple(_args, ""))
return NULL;
if ( _self->ob_itself ) {
SetControlReference(_self->ob_itself, (long)0); /* Make it forget about us */
DisposeControl(_self->ob_itself);
_self->ob_itself = NULL;
}
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyMethodDef CtlObj_methods[] = {
{"ShowControl", (PyCFunction)CtlObj_ShowControl, 1,
"() -> None"},
{"HideControl", (PyCFunction)CtlObj_HideControl, 1,
"() -> None"},
{"Draw1Control", (PyCFunction)CtlObj_Draw1Control, 1,
"() -> None"},
{"HiliteControl", (PyCFunction)CtlObj_HiliteControl, 1,
"(ControlPartCode hiliteState) -> None"},
{"TrackControl", (PyCFunction)CtlObj_TrackControl, 1,
"(Point thePoint) -> (ControlPartCode _rv)"},
{"DragControl", (PyCFunction)CtlObj_DragControl, 1,
"(Point startPoint, Rect limitRect, Rect slopRect, DragConstraint axis) -> None"},
{"TestControl", (PyCFunction)CtlObj_TestControl, 1,
"(Point thePoint) -> (ControlPartCode _rv)"},
{"MoveControl", (PyCFunction)CtlObj_MoveControl, 1,
"(SInt16 h, SInt16 v) -> None"},
{"SizeControl", (PyCFunction)CtlObj_SizeControl, 1,
"(SInt16 w, SInt16 h) -> None"},
{"SetControlTitle", (PyCFunction)CtlObj_SetControlTitle, 1,
"(Str255 title) -> None"},
{"GetControlTitle", (PyCFunction)CtlObj_GetControlTitle, 1,
"(Str255 title) -> None"},
{"GetControlValue", (PyCFunction)CtlObj_GetControlValue, 1,
"() -> (SInt16 _rv)"},
{"SetControlValue", (PyCFunction)CtlObj_SetControlValue, 1,
"(SInt16 newValue) -> None"},
{"GetControlMinimum", (PyCFunction)CtlObj_GetControlMinimum, 1,
"() -> (SInt16 _rv)"},
{"SetControlMinimum", (PyCFunction)CtlObj_SetControlMinimum, 1,
"(SInt16 newMinimum) -> None"},
{"GetControlMaximum", (PyCFunction)CtlObj_GetControlMaximum, 1,
"() -> (SInt16 _rv)"},
{"SetControlMaximum", (PyCFunction)CtlObj_SetControlMaximum, 1,
"(SInt16 newMaximum) -> None"},
{"GetControlVariant", (PyCFunction)CtlObj_GetControlVariant, 1,
"() -> (SInt16 _rv)"},
{"SetControlAction", (PyCFunction)CtlObj_SetControlAction, 1,
"() -> None"},
{"SetControlReference", (PyCFunction)CtlObj_SetControlReference, 1,
"(SInt32 data) -> None"},
{"GetControlReference", (PyCFunction)CtlObj_GetControlReference, 1,
"() -> (SInt32 _rv)"},
{"GetAuxiliaryControlRecord", (PyCFunction)CtlObj_GetAuxiliaryControlRecord, 1,
"() -> (Boolean _rv, AuxCtlHandle acHndl)"},
{"SetControlColor", (PyCFunction)CtlObj_SetControlColor, 1,
"(CCTabHandle newColorTable) -> None"},
{"as_Resource", (PyCFunction)CtlObj_as_Resource, 1,
"Return this Control as a Resource"},
{"DisposeControl", (PyCFunction)CtlObj_DisposeControl, 1,
"() -> None"},
{NULL, NULL, 0}
};
PyMethodChain CtlObj_chain = { CtlObj_methods, NULL };
static PyObject *CtlObj_getattr(self, name)
ControlObject *self;
char *name;
{
return Py_FindMethodInChain(&CtlObj_chain, (PyObject *)self, name);
}
#define CtlObj_setattr NULL
PyTypeObject Control_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*ob_size*/
"Control", /*tp_name*/
sizeof(ControlObject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor) CtlObj_dealloc, /*tp_dealloc*/
0, /*tp_print*/
(getattrfunc) CtlObj_getattr, /*tp_getattr*/
(setattrfunc) CtlObj_setattr, /*tp_setattr*/
};
/* -------------------- End object type Control --------------------- */
static PyObject *Ctl_NewControl(_self, _args)
PyObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlHandle _rv;
WindowPtr theWindow;
Rect boundsRect;
Str255 title;
Boolean visible;
SInt16 value;
SInt16 min;
SInt16 max;
SInt16 procID;
SInt32 refCon;
if (!PyArg_ParseTuple(_args, "O&O&O&bhhhhl",
WinObj_Convert, &theWindow,
PyMac_GetRect, &boundsRect,
PyMac_GetStr255, title,
&visible,
&value,
&min,
&max,
&procID,
&refCon))
return NULL;
_rv = NewControl(theWindow,
&boundsRect,
title,
visible,
value,
min,
max,
procID,
refCon);
_res = Py_BuildValue("O&",
CtlObj_New, _rv);
return _res;
}
static PyObject *Ctl_GetNewControl(_self, _args)
PyObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlHandle _rv;
SInt16 controlID;
WindowPtr owner;
if (!PyArg_ParseTuple(_args, "hO&",
&controlID,
WinObj_Convert, &owner))
return NULL;
_rv = GetNewControl(controlID,
owner);
_res = Py_BuildValue("O&",
CtlObj_New, _rv);
return _res;
}
static PyObject *Ctl_DrawControls(_self, _args)
PyObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
WindowPtr theWindow;
if (!PyArg_ParseTuple(_args, "O&",
WinObj_Convert, &theWindow))
return NULL;
DrawControls(theWindow);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *Ctl_UpdateControls(_self, _args)
PyObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
WindowPtr theWindow;
RgnHandle updateRegion;
if (!PyArg_ParseTuple(_args, "O&O&",
WinObj_Convert, &theWindow,
ResObj_Convert, &updateRegion))
return NULL;
UpdateControls(theWindow,
updateRegion);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *Ctl_FindControl(_self, _args)
PyObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
ControlPartCode _rv;
Point thePoint;
WindowPtr theWindow;
ControlHandle theControl;
if (!PyArg_ParseTuple(_args, "O&O&",
PyMac_GetPoint, &thePoint,
WinObj_Convert, &theWindow))
return NULL;
_rv = FindControl(thePoint,
theWindow,
&theControl);
_res = Py_BuildValue("hO&",
_rv,
CtlObj_WhichControl, theControl);
return _res;
}
static PyMethodDef Ctl_methods[] = {
{"NewControl", (PyCFunction)Ctl_NewControl, 1,
"(WindowPtr theWindow, Rect boundsRect, Str255 title, Boolean visible, SInt16 value, SInt16 min, SInt16 max, SInt16 procID, SInt32 refCon) -> (ControlHandle _rv)"},
{"GetNewControl", (PyCFunction)Ctl_GetNewControl, 1,
"(SInt16 controlID, WindowPtr owner) -> (ControlHandle _rv)"},
{"DrawControls", (PyCFunction)Ctl_DrawControls, 1,
"(WindowPtr theWindow) -> None"},
{"UpdateControls", (PyCFunction)Ctl_UpdateControls, 1,
"(WindowPtr theWindow, RgnHandle updateRegion) -> None"},
{"FindControl", (PyCFunction)Ctl_FindControl, 1,
"(Point thePoint, WindowPtr theWindow) -> (ControlPartCode _rv, ControlHandle theControl)"},
{NULL, NULL, 0}
};
PyObject *
CtlObj_WhichControl(ControlHandle c)
{
PyObject *it;
/* XXX What if we find a control belonging to some other package? */
if (c == NULL)
it = NULL;
else
it = (PyObject *) GetControlReference(c);
if (it == NULL || ((ControlObject *)it)->ob_itself != c)
it = Py_None;
Py_INCREF(it);
return it;
}
void initCtl()
{
PyObject *m;
PyObject *d;
m = Py_InitModule("Ctl", Ctl_methods);
d = PyModule_GetDict(m);
Ctl_Error = PyMac_GetOSErrException();
if (Ctl_Error == NULL ||
PyDict_SetItemString(d, "Error", Ctl_Error) != 0)
Py_FatalError("can't initialize Ctl.Error");
}
/* ========================= End module Ctl ========================= */