mirror of
https://github.com/python/cpython.git
synced 2025-07-24 19:54:21 +00:00
Added UserPane callbacks for HitTest and Tracking. Doesn't fully work yet.
This commit is contained in:
parent
1a7d5b12c0
commit
a27e9fb19f
2 changed files with 92 additions and 4 deletions
|
@ -87,6 +87,8 @@ static PyObject *tracker;
|
||||||
static ControlActionUPP mytracker_upp;
|
static ControlActionUPP mytracker_upp;
|
||||||
static ControlUserPaneDrawUPP mydrawproc_upp;
|
static ControlUserPaneDrawUPP mydrawproc_upp;
|
||||||
static ControlUserPaneIdleUPP myidleproc_upp;
|
static ControlUserPaneIdleUPP myidleproc_upp;
|
||||||
|
static ControlUserPaneHitTestUPP myhittestproc_upp;
|
||||||
|
static ControlUserPaneTrackingUPP mytrackingproc_upp;
|
||||||
|
|
||||||
extern int settrackfunc(PyObject *); /* forward */
|
extern int settrackfunc(PyObject *); /* forward */
|
||||||
extern void clrtrackfunc(void); /* forward */
|
extern void clrtrackfunc(void); /* forward */
|
||||||
|
@ -1982,6 +1984,10 @@ setcallback(self, which, callback, uppp)
|
||||||
*uppp = mydrawproc_upp;
|
*uppp = mydrawproc_upp;
|
||||||
else if ( which == kControlUserPaneIdleProcTag )
|
else if ( which == kControlUserPaneIdleProcTag )
|
||||||
*uppp = myidleproc_upp;
|
*uppp = myidleproc_upp;
|
||||||
|
else if ( which == kControlUserPaneHitTestProcTag )
|
||||||
|
*uppp = myhittestproc_upp;
|
||||||
|
else if ( which == kControlUserPaneTrackingProcTag )
|
||||||
|
*uppp = mytrackingproc_upp;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
/* Only now do we test for clearing of the callback: */
|
/* Only now do we test for clearing of the callback: */
|
||||||
|
@ -2010,12 +2016,12 @@ callcallback(self, which, arglist)
|
||||||
sprintf(keybuf, "%x", which);
|
sprintf(keybuf, "%x", which);
|
||||||
if ( self->ob_callbackdict == NULL ||
|
if ( self->ob_callbackdict == NULL ||
|
||||||
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
|
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
|
||||||
PySys_WriteStderr("Control callback without callback object\n");
|
PySys_WriteStderr("Control callback %x without callback object\n", which);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
rv = PyEval_CallObject(func, arglist);
|
rv = PyEval_CallObject(func, arglist);
|
||||||
if ( rv == NULL )
|
if ( rv == NULL )
|
||||||
PySys_WriteStderr("Exception in control callback handler\n");
|
PySys_WriteStderr("Exception in control callback %x handler\n", which);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2045,6 +2051,42 @@ myidleproc(ControlHandle control)
|
||||||
Py_XDECREF(rv);
|
Py_XDECREF(rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pascal ControlPartCode
|
||||||
|
myhittestproc(ControlHandle control, Point where)
|
||||||
|
{
|
||||||
|
ControlObject *ctl_obj;
|
||||||
|
PyObject *arglist, *rv;
|
||||||
|
short c_rv = -1;
|
||||||
|
|
||||||
|
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
|
||||||
|
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &where);
|
||||||
|
rv = callcallback(ctl_obj, kControlUserPaneHitTestProcTag, arglist);
|
||||||
|
Py_XDECREF(arglist);
|
||||||
|
/* Ignore errors, nothing we can do about them */
|
||||||
|
if ( rv )
|
||||||
|
PyArg_Parse(rv, "h", &c_rv);
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return (ControlPartCode)c_rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pascal ControlPartCode
|
||||||
|
mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc)
|
||||||
|
{
|
||||||
|
ControlObject *ctl_obj;
|
||||||
|
PyObject *arglist, *rv;
|
||||||
|
short c_rv = -1;
|
||||||
|
|
||||||
|
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
|
||||||
|
/* We cannot pass the actionProc without lots of work */
|
||||||
|
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &startPt);
|
||||||
|
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
|
||||||
|
Py_XDECREF(arglist);
|
||||||
|
if ( rv )
|
||||||
|
PyArg_Parse(rv, "h", &c_rv);
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return (ControlPartCode)c_rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void initCtl()
|
void initCtl()
|
||||||
|
@ -2057,6 +2099,8 @@ void initCtl()
|
||||||
mytracker_upp = NewControlActionProc(mytracker);
|
mytracker_upp = NewControlActionProc(mytracker);
|
||||||
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
|
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
|
||||||
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
|
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
|
||||||
|
myhittestproc_upp = NewControlUserPaneHitTestProc(myhittestproc);
|
||||||
|
mytrackingproc_upp = NewControlUserPaneTrackingProc(mytrackingproc);
|
||||||
|
|
||||||
|
|
||||||
m = Py_InitModule("Ctl", Ctl_methods);
|
m = Py_InitModule("Ctl", Ctl_methods);
|
||||||
|
|
|
@ -87,6 +87,8 @@ static PyObject *tracker;
|
||||||
static ControlActionUPP mytracker_upp;
|
static ControlActionUPP mytracker_upp;
|
||||||
static ControlUserPaneDrawUPP mydrawproc_upp;
|
static ControlUserPaneDrawUPP mydrawproc_upp;
|
||||||
static ControlUserPaneIdleUPP myidleproc_upp;
|
static ControlUserPaneIdleUPP myidleproc_upp;
|
||||||
|
static ControlUserPaneHitTestUPP myhittestproc_upp;
|
||||||
|
static ControlUserPaneTrackingUPP mytrackingproc_upp;
|
||||||
|
|
||||||
extern int settrackfunc(PyObject *); /* forward */
|
extern int settrackfunc(PyObject *); /* forward */
|
||||||
extern void clrtrackfunc(void); /* forward */
|
extern void clrtrackfunc(void); /* forward */
|
||||||
|
@ -175,6 +177,10 @@ setcallback(self, which, callback, uppp)
|
||||||
*uppp = mydrawproc_upp;
|
*uppp = mydrawproc_upp;
|
||||||
else if ( which == kControlUserPaneIdleProcTag )
|
else if ( which == kControlUserPaneIdleProcTag )
|
||||||
*uppp = myidleproc_upp;
|
*uppp = myidleproc_upp;
|
||||||
|
else if ( which == kControlUserPaneHitTestProcTag )
|
||||||
|
*uppp = myhittestproc_upp;
|
||||||
|
else if ( which == kControlUserPaneTrackingProcTag )
|
||||||
|
*uppp = mytrackingproc_upp;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
/* Only now do we test for clearing of the callback: */
|
/* Only now do we test for clearing of the callback: */
|
||||||
|
@ -203,12 +209,12 @@ callcallback(self, which, arglist)
|
||||||
sprintf(keybuf, "%x", which);
|
sprintf(keybuf, "%x", which);
|
||||||
if ( self->ob_callbackdict == NULL ||
|
if ( self->ob_callbackdict == NULL ||
|
||||||
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
|
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
|
||||||
PySys_WriteStderr("Control callback without callback object\\n");
|
PySys_WriteStderr("Control callback %x without callback object\\n", which);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
rv = PyEval_CallObject(func, arglist);
|
rv = PyEval_CallObject(func, arglist);
|
||||||
if ( rv == NULL )
|
if ( rv == NULL )
|
||||||
PySys_WriteStderr("Exception in control callback handler\\n");
|
PySys_WriteStderr("Exception in control callback %x handler\\n", which);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,12 +244,50 @@ myidleproc(ControlHandle control)
|
||||||
Py_XDECREF(rv);
|
Py_XDECREF(rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pascal ControlPartCode
|
||||||
|
myhittestproc(ControlHandle control, Point where)
|
||||||
|
{
|
||||||
|
ControlObject *ctl_obj;
|
||||||
|
PyObject *arglist, *rv;
|
||||||
|
short c_rv = -1;
|
||||||
|
|
||||||
|
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
|
||||||
|
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &where);
|
||||||
|
rv = callcallback(ctl_obj, kControlUserPaneHitTestProcTag, arglist);
|
||||||
|
Py_XDECREF(arglist);
|
||||||
|
/* Ignore errors, nothing we can do about them */
|
||||||
|
if ( rv )
|
||||||
|
PyArg_Parse(rv, "h", &c_rv);
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return (ControlPartCode)c_rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pascal ControlPartCode
|
||||||
|
mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc)
|
||||||
|
{
|
||||||
|
ControlObject *ctl_obj;
|
||||||
|
PyObject *arglist, *rv;
|
||||||
|
short c_rv = -1;
|
||||||
|
|
||||||
|
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
|
||||||
|
/* We cannot pass the actionProc without lots of work */
|
||||||
|
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &startPt);
|
||||||
|
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
|
||||||
|
Py_XDECREF(arglist);
|
||||||
|
if ( rv )
|
||||||
|
PyArg_Parse(rv, "h", &c_rv);
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return (ControlPartCode)c_rv;
|
||||||
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
initstuff = initstuff + """
|
initstuff = initstuff + """
|
||||||
mytracker_upp = NewControlActionProc(mytracker);
|
mytracker_upp = NewControlActionProc(mytracker);
|
||||||
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
|
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
|
||||||
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
|
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
|
||||||
|
myhittestproc_upp = NewControlUserPaneHitTestProc(myhittestproc);
|
||||||
|
mytrackingproc_upp = NewControlUserPaneTrackingProc(mytrackingproc);
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class MyObjectDefinition(ObjectIdentityMixin, GlobalObjectDefinition):
|
class MyObjectDefinition(ObjectIdentityMixin, GlobalObjectDefinition):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue