Kaydet (Commit) 348fff88 authored tarafından Jack Jansen's avatar Jack Jansen

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()
üst d597b8bd
This diff is collapsed.
......@@ -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__":
......
......@@ -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,11 +356,62 @@ 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)
{
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment