diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2002-02-27 23:11:42 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2002-02-27 23:11:42 (GMT) |
commit | 348fff88449ab98ca64572d9c05ee8a4a522d53e (patch) | |
tree | 5e33d61eff2065be4c60a201b7cbaad83129e46c /Mac | |
parent | d597b8bd2803dc199d003e2a7e3005a98e3a4dea (diff) | |
download | cpython-348fff88449ab98ca64572d9c05ee8a4a522d53e.zip cpython-348fff88449ab98ca64572d9c05ee8a4a522d53e.tar.gz cpython-348fff88449ab98ca64572d9c05ee8a4a522d53e.tar.bz2 |
Backport of 1.4 thru 1.16 (of _Ctlmodule.c):
- added support for UserPaneKeyDownProc and UserPaneFocusProc
- clear error after failing PyArg_Parse()
- Oops, forgot to mark CreateScrollBarControl and CreateSliderControl
as Carbon-only
- added support for ControlActionProcs, exposing the following calls:
- ctl.SetControlAction()
- CreateScrollBarControl()
- CreateSliderControl()
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/ctl/_Ctlmodule.c | 204 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctlscan.py | 8 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctlsupport.py | 96 |
3 files changed, 297 insertions, 11 deletions
diff --git a/Mac/Modules/ctl/_Ctlmodule.c b/Mac/Modules/ctl/_Ctlmodule.c index d15ed90..cf1c459 100644 --- a/Mac/Modules/ctl/_Ctlmodule.c +++ b/Mac/Modules/ctl/_Ctlmodule.c @@ -128,8 +128,12 @@ DataBrowserListViewColumnDesc_Convert(PyObject *v, DataBrowserListViewColumnDesc } /* TrackControl and HandleControlClick callback support */ +#define kMyControlActionProcTag 'ACTN' /* not an official tag, only for internal use */ static PyObject *tracker; static ControlActionUPP mytracker_upp; +static ControlActionUPP myactionproc_upp; +static ControlUserPaneKeyDownUPP mykeydownproc_upp; +static ControlUserPaneFocusUPP myfocusproc_upp; static ControlUserPaneDrawUPP mydrawproc_upp; static ControlUserPaneIdleUPP myidleproc_upp; static ControlUserPaneHitTestUPP myhittestproc_upp; @@ -1183,6 +1187,25 @@ static PyObject *CtlObj_GetControlVariant(ControlObject *_self, PyObject *_args) return _res; } +static PyObject *CtlObj_SetControlAction(ControlObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + PyObject* actionProc; + UniversalProcPtr c_callback; +#ifndef SetControlAction + PyMac_PRECHECK(SetControlAction); +#endif + if (!PyArg_ParseTuple(_args, "O", + &actionProc)) + return NULL; + SetControlAction(_self->ob_itself, + myactionproc_upp); + Py_INCREF(Py_None); + _res = Py_None; + setcallback((PyObject*)_self, kMyControlActionProcTag, actionProc, &c_callback); + return _res; +} + static PyObject *CtlObj_SetControlReference(ControlObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -4004,6 +4027,8 @@ static PyMethodDef CtlObj_methods[] = { "(ControlPartCode inPart, RgnHandle outRegion) -> None"}, {"GetControlVariant", (PyCFunction)CtlObj_GetControlVariant, 1, "() -> (ControlVariant _rv)"}, + {"SetControlAction", (PyCFunction)CtlObj_SetControlAction, 1, + "(PyObject* actionProc) -> None"}, {"SetControlReference", (PyCFunction)CtlObj_SetControlReference, 1, "(SInt32 data) -> None"}, {"GetControlReference", (PyCFunction)CtlObj_GetControlReference, 1, @@ -4991,6 +5016,55 @@ static PyObject *Ctl_CreateBevelButtonControl(PyObject *_self, PyObject *_args) #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreateSliderControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + SInt32 value; + SInt32 minimum; + SInt32 maximum; + UInt16 orientation; + UInt16 numTickMarks; + Boolean liveTracking; + PyObject* liveTrackingProc; + UniversalProcPtr c_callback; + ControlHandle outControl; +#ifndef CreateSliderControl + PyMac_PRECHECK(CreateSliderControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&lllHHbO", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + &value, + &minimum, + &maximum, + &orientation, + &numTickMarks, + &liveTracking, + &liveTrackingProc)) + return NULL; + _err = CreateSliderControl(window, + &boundsRect, + value, + minimum, + maximum, + orientation, + numTickMarks, + liveTracking, + myactionproc_upp, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreateDisclosureTriangleControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -5757,6 +5831,52 @@ static PyObject *Ctl_CreateCheckBoxControl(PyObject *_self, PyObject *_args) #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreateScrollBarControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + SInt32 value; + SInt32 minimum; + SInt32 maximum; + SInt32 viewSize; + Boolean liveTracking; + PyObject* liveTrackingProc; + UniversalProcPtr c_callback; + ControlHandle outControl; +#ifndef CreateScrollBarControl + PyMac_PRECHECK(CreateScrollBarControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&llllbO", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + &value, + &minimum, + &maximum, + &viewSize, + &liveTracking, + &liveTrackingProc)) + return NULL; + _err = CreateScrollBarControl(window, + &boundsRect, + value, + minimum, + maximum, + viewSize, + liveTracking, + myactionproc_upp, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreatePopupButtonControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -6146,6 +6266,11 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreateSliderControl", (PyCFunction)Ctl_CreateSliderControl, 1, + "(WindowPtr window, Rect boundsRect, SInt32 value, SInt32 minimum, SInt32 maximum, UInt16 orientation, UInt16 numTickMarks, Boolean liveTracking, PyObject* liveTrackingProc) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreateDisclosureTriangleControl", (PyCFunction)Ctl_CreateDisclosureTriangleControl, 1, "(WindowPtr window, Rect boundsRect, UInt16 orientation, CFStringRef title, SInt32 initialValue, Boolean drawTitle, Boolean autoToggles) -> (ControlHandle outControl)"}, #endif @@ -6261,6 +6386,11 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreateScrollBarControl", (PyCFunction)Ctl_CreateScrollBarControl, 1, + "(WindowPtr window, Rect boundsRect, SInt32 value, SInt32 minimum, SInt32 maximum, SInt32 viewSize, Boolean liveTracking, PyObject* liveTrackingProc) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreatePopupButtonControl", (PyCFunction)Ctl_CreatePopupButtonControl, 1, "(WindowPtr window, Rect boundsRect, CFStringRef title, SInt16 menuID, Boolean variableWidth, SInt16 titleWidth, SInt16 titleJustification, Style titleStyle) -> (ControlHandle outControl)"}, #endif @@ -6371,8 +6501,10 @@ mytracker(ControlHandle ctl, short part) } if (rv) Py_DECREF(rv); - else + else { PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\n"); + PyErr_Print(); + } } static int @@ -6381,7 +6513,13 @@ setcallback(PyObject *myself, OSType which, PyObject *callback, UniversalProcPtr ControlObject *self = (ControlObject *)myself; char keybuf[9]; - if ( which == kControlUserPaneDrawProcTag ) + if ( which == kMyControlActionProcTag ) + *uppp = (UniversalProcPtr)myactionproc_upp; + else if ( which == kControlUserPaneKeyDownProcTag ) + *uppp = (UniversalProcPtr)mykeydownproc_upp; + else if ( which == kControlUserPaneFocusProcTag ) + *uppp = (UniversalProcPtr)myfocusproc_upp; + else if ( which == kControlUserPaneDrawProcTag ) *uppp = (UniversalProcPtr)mydrawproc_upp; else if ( which == kControlUserPaneIdleProcTag ) *uppp = (UniversalProcPtr)myidleproc_upp; @@ -6418,12 +6556,63 @@ callcallback(ControlObject *self, OSType which, PyObject *arglist) return NULL; } rv = PyEval_CallObject(func, arglist); - if ( rv == NULL ) + if ( rv == NULL ) { PySys_WriteStderr("Exception in control callback %x handler\n", (unsigned)which); + PyErr_Print(); + } return rv; } static pascal void +myactionproc(ControlHandle control, SInt16 part) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Oh", ctl_obj, part); + rv = callcallback(ctl_obj, kMyControlActionProcTag, arglist); + Py_XDECREF(arglist); + Py_XDECREF(rv); +} + +static pascal ControlPartCode +mykeydownproc(ControlHandle control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + short c_rv = 0; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Ohhh", ctl_obj, keyCode, charCode, modifiers); + rv = callcallback(ctl_obj, kControlUserPaneKeyDownProcTag, arglist); + Py_XDECREF(arglist); + if ( rv ) + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); + Py_XDECREF(rv); + return (ControlPartCode)c_rv; +} + +static pascal ControlPartCode +myfocusproc(ControlHandle control, ControlPartCode part) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + short c_rv = kControlFocusNoPart; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Oh", ctl_obj, part); + rv = callcallback(ctl_obj, kControlUserPaneFocusProcTag, arglist); + Py_XDECREF(arglist); + if ( rv ) + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); + Py_XDECREF(rv); + return (ControlPartCode)c_rv; +} + +static pascal void mydrawproc(ControlHandle control, SInt16 part) { ControlObject *ctl_obj; @@ -6462,7 +6651,8 @@ myhittestproc(ControlHandle control, Point where) Py_XDECREF(arglist); /* Ignore errors, nothing we can do about them */ if ( rv ) - PyArg_Parse(rv, "h", &c_rv); + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); Py_XDECREF(rv); return (ControlPartCode)c_rv; } @@ -6480,7 +6670,8 @@ mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist); Py_XDECREF(arglist); if ( rv ) - PyArg_Parse(rv, "h", &c_rv); + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); Py_XDECREF(rv); return (ControlPartCode)c_rv; } @@ -6494,6 +6685,9 @@ void init_Ctl(void) mytracker_upp = NewControlActionUPP(mytracker); + myactionproc_upp = NewControlActionUPP(myactionproc); + mykeydownproc_upp = NewControlUserPaneKeyDownUPP(mykeydownproc); + myfocusproc_upp = NewControlUserPaneFocusUPP(myfocusproc); mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc); myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc); myhittestproc_upp = NewControlUserPaneHitTestUPP(myhittestproc); diff --git a/Mac/Modules/ctl/ctlscan.py b/Mac/Modules/ctl/ctlscan.py index 61f79eb..0e0a80a 100644 --- a/Mac/Modules/ctl/ctlscan.py +++ b/Mac/Modules/ctl/ctlscan.py @@ -88,6 +88,7 @@ class MyScanner(Scanner): 'GetControlPropertySize', 'SendControlMessage', # Parameter changed from long to void* from UH3.3 to UH3.4 'CreateTabsControl', # wrote manually + 'GetControlAction', # too much effort for too little usefulness # too lazy for now 'GetImageWellContentInfo', @@ -125,6 +126,8 @@ class MyScanner(Scanner): 'GetControlClickActivation', 'HandleControlContextualMenuClick', + "CreateScrollBarControl", + "CreateSliderControl", "CreateBevelButtonControl", "CreateImageWellControl", "CreatePictureControl", @@ -259,7 +262,7 @@ class MyScanner(Scanner): def makeblacklisttypes(self): return [ 'ProcPtr', - 'ControlActionUPP', +# 'ControlActionUPP', 'Ptr', 'ControlDefSpec', # Don't know how to do this yet 'ControlDefSpec_ptr', # ditto @@ -319,6 +322,9 @@ class MyScanner(Scanner): ([("ControlButtonContentInfo", '*', "OutMode")], [("ControlButtonContentInfo", '*', "InMode")]), + + ([("ControlActionUPP", 'liveTrackingProc', "InMode")], + [("ControlActionUPPNewControl", 'liveTrackingProc', "InMode")]), ] if __name__ == "__main__": diff --git a/Mac/Modules/ctl/ctlsupport.py b/Mac/Modules/ctl/ctlsupport.py index 5538608..b773290 100644 --- a/Mac/Modules/ctl/ctlsupport.py +++ b/Mac/Modules/ctl/ctlsupport.py @@ -94,6 +94,24 @@ ControlBevelButtonMenuBehavior = UInt16 ControlBevelButtonMenuPlacement = UInt16 ControlPushButtonIconAlignment = UInt16 +class ControlActionDefinition(Type): + def declare(self, name): + Output("%s %s;", self.typeName, name) + Output("UniversalProcPtr c_callback;") + def passInput(self, name): + return "myactionproc_upp" + def cleanup(self, name): + Output("setcallback((PyObject*)_self, kMyControlActionProcTag, actionProc, &c_callback);") + +class ControlActionDefinitionNewControl(ControlActionDefinition): + def cleanup(self, name): + Output("setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback);") + +ControlActionUPP = ControlActionDefinition("PyObject*", "O") +ControlActionUPPNewControl = ControlActionDefinitionNewControl("PyObject*", "O") +ControlSliderOrientation = UInt16 + + includestuff = includestuff + """ #ifdef WITHOUT_FRAMEWORKS #include <Controls.h> @@ -203,8 +221,12 @@ DataBrowserListViewColumnDesc_Convert(PyObject *v, DataBrowserListViewColumnDesc } /* TrackControl and HandleControlClick callback support */ +#define kMyControlActionProcTag 'ACTN' /* not an official tag, only for internal use */ static PyObject *tracker; static ControlActionUPP mytracker_upp; +static ControlActionUPP myactionproc_upp; +static ControlUserPaneKeyDownUPP mykeydownproc_upp; +static ControlUserPaneFocusUPP myfocusproc_upp; static ControlUserPaneDrawUPP mydrawproc_upp; static ControlUserPaneIdleUPP myidleproc_upp; static ControlUserPaneHitTestUPP myhittestproc_upp; @@ -279,8 +301,10 @@ mytracker(ControlHandle ctl, short part) } if (rv) Py_DECREF(rv); - else + else { PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\\n"); + PyErr_Print(); + } } static int @@ -289,7 +313,13 @@ setcallback(PyObject *myself, OSType which, PyObject *callback, UniversalProcPtr ControlObject *self = (ControlObject *)myself; char keybuf[9]; - if ( which == kControlUserPaneDrawProcTag ) + if ( which == kMyControlActionProcTag ) + *uppp = (UniversalProcPtr)myactionproc_upp; + else if ( which == kControlUserPaneKeyDownProcTag ) + *uppp = (UniversalProcPtr)mykeydownproc_upp; + else if ( which == kControlUserPaneFocusProcTag ) + *uppp = (UniversalProcPtr)myfocusproc_upp; + else if ( which == kControlUserPaneDrawProcTag ) *uppp = (UniversalProcPtr)mydrawproc_upp; else if ( which == kControlUserPaneIdleProcTag ) *uppp = (UniversalProcPtr)myidleproc_upp; @@ -326,12 +356,63 @@ callcallback(ControlObject *self, OSType which, PyObject *arglist) return NULL; } rv = PyEval_CallObject(func, arglist); - if ( rv == NULL ) + if ( rv == NULL ) { PySys_WriteStderr("Exception in control callback %x handler\\n", (unsigned)which); + PyErr_Print(); + } return rv; } static pascal void +myactionproc(ControlHandle control, SInt16 part) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Oh", ctl_obj, part); + rv = callcallback(ctl_obj, kMyControlActionProcTag, arglist); + Py_XDECREF(arglist); + Py_XDECREF(rv); +} + +static pascal ControlPartCode +mykeydownproc(ControlHandle control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + short c_rv = 0; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Ohhh", ctl_obj, keyCode, charCode, modifiers); + rv = callcallback(ctl_obj, kControlUserPaneKeyDownProcTag, arglist); + Py_XDECREF(arglist); + if ( rv ) + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); + Py_XDECREF(rv); + return (ControlPartCode)c_rv; +} + +static pascal ControlPartCode +myfocusproc(ControlHandle control, ControlPartCode part) +{ + ControlObject *ctl_obj; + PyObject *arglist, *rv; + short c_rv = kControlFocusNoPart; + + ctl_obj = (ControlObject *)CtlObj_WhichControl(control); + arglist = Py_BuildValue("Oh", ctl_obj, part); + rv = callcallback(ctl_obj, kControlUserPaneFocusProcTag, arglist); + Py_XDECREF(arglist); + if ( rv ) + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); + Py_XDECREF(rv); + return (ControlPartCode)c_rv; +} + +static pascal void mydrawproc(ControlHandle control, SInt16 part) { ControlObject *ctl_obj; @@ -370,7 +451,8 @@ myhittestproc(ControlHandle control, Point where) Py_XDECREF(arglist); /* Ignore errors, nothing we can do about them */ if ( rv ) - PyArg_Parse(rv, "h", &c_rv); + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); Py_XDECREF(rv); return (ControlPartCode)c_rv; } @@ -388,7 +470,8 @@ mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist); Py_XDECREF(arglist); if ( rv ) - PyArg_Parse(rv, "h", &c_rv); + if (!PyArg_Parse(rv, "h", &c_rv)) + PyErr_Clear(); Py_XDECREF(rv); return (ControlPartCode)c_rv; } @@ -396,6 +479,9 @@ mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc initstuff = initstuff + """ mytracker_upp = NewControlActionUPP(mytracker); +myactionproc_upp = NewControlActionUPP(myactionproc); +mykeydownproc_upp = NewControlUserPaneKeyDownUPP(mykeydownproc); +myfocusproc_upp = NewControlUserPaneFocusUPP(myfocusproc); mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc); myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc); myhittestproc_upp = NewControlUserPaneHitTestUPP(myhittestproc); |