summaryrefslogtreecommitdiffstats
path: root/Mac
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-02-27 23:11:42 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-02-27 23:11:42 (GMT)
commit348fff88449ab98ca64572d9c05ee8a4a522d53e (patch)
tree5e33d61eff2065be4c60a201b7cbaad83129e46c /Mac
parentd597b8bd2803dc199d003e2a7e3005a98e3a4dea (diff)
downloadcpython-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.c204
-rw-r--r--Mac/Modules/ctl/ctlscan.py8
-rw-r--r--Mac/Modules/ctl/ctlsupport.py96
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);