Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a27e9fb

Browse files
committed
Added UserPane callbacks for HitTest and Tracking. Doesn't fully work yet.
1 parent 1a7d5b1 commit a27e9fb

2 files changed

Lines changed: 92 additions & 4 deletions

File tree

Mac/Modules/ctl/Ctlmodule.c

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ static PyObject *tracker;
8787
static ControlActionUPP mytracker_upp;
8888
static ControlUserPaneDrawUPP mydrawproc_upp;
8989
static ControlUserPaneIdleUPP myidleproc_upp;
90+
static ControlUserPaneHitTestUPP myhittestproc_upp;
91+
static ControlUserPaneTrackingUPP mytrackingproc_upp;
9092

9193
extern int settrackfunc(PyObject *); /* forward */
9294
extern void clrtrackfunc(void); /* forward */
@@ -1982,6 +1984,10 @@ setcallback(self, which, callback, uppp)
19821984
*uppp = mydrawproc_upp;
19831985
else if ( which == kControlUserPaneIdleProcTag )
19841986
*uppp = myidleproc_upp;
1987+
else if ( which == kControlUserPaneHitTestProcTag )
1988+
*uppp = myhittestproc_upp;
1989+
else if ( which == kControlUserPaneTrackingProcTag )
1990+
*uppp = mytrackingproc_upp;
19851991
else
19861992
return -1;
19871993
/* Only now do we test for clearing of the callback: */
@@ -2010,12 +2016,12 @@ callcallback(self, which, arglist)
20102016
sprintf(keybuf, "%x", which);
20112017
if ( self->ob_callbackdict == NULL ||
20122018
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
2013-
PySys_WriteStderr("Control callback without callback object\n");
2019+
PySys_WriteStderr("Control callback %x without callback object\n", which);
20142020
return NULL;
20152021
}
20162022
rv = PyEval_CallObject(func, arglist);
20172023
if ( rv == NULL )
2018-
PySys_WriteStderr("Exception in control callback handler\n");
2024+
PySys_WriteStderr("Exception in control callback %x handler\n", which);
20192025
return rv;
20202026
}
20212027

@@ -2045,6 +2051,42 @@ myidleproc(ControlHandle control)
20452051
Py_XDECREF(rv);
20462052
}
20472053

2054+
static pascal ControlPartCode
2055+
myhittestproc(ControlHandle control, Point where)
2056+
{
2057+
ControlObject *ctl_obj;
2058+
PyObject *arglist, *rv;
2059+
short c_rv = -1;
2060+
2061+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
2062+
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &where);
2063+
rv = callcallback(ctl_obj, kControlUserPaneHitTestProcTag, arglist);
2064+
Py_XDECREF(arglist);
2065+
/* Ignore errors, nothing we can do about them */
2066+
if ( rv )
2067+
PyArg_Parse(rv, "h", &c_rv);
2068+
Py_XDECREF(rv);
2069+
return (ControlPartCode)c_rv;
2070+
}
2071+
2072+
static pascal ControlPartCode
2073+
mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc)
2074+
{
2075+
ControlObject *ctl_obj;
2076+
PyObject *arglist, *rv;
2077+
short c_rv = -1;
2078+
2079+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
2080+
/* We cannot pass the actionProc without lots of work */
2081+
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &startPt);
2082+
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
2083+
Py_XDECREF(arglist);
2084+
if ( rv )
2085+
PyArg_Parse(rv, "h", &c_rv);
2086+
Py_XDECREF(rv);
2087+
return (ControlPartCode)c_rv;
2088+
}
2089+
20482090

20492091

20502092
void initCtl()
@@ -2057,6 +2099,8 @@ void initCtl()
20572099
mytracker_upp = NewControlActionProc(mytracker);
20582100
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
20592101
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
2102+
myhittestproc_upp = NewControlUserPaneHitTestProc(myhittestproc);
2103+
mytrackingproc_upp = NewControlUserPaneTrackingProc(mytrackingproc);
20602104

20612105

20622106
m = Py_InitModule("Ctl", Ctl_methods);

Mac/Modules/ctl/ctlsupport.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@
8787
static ControlActionUPP mytracker_upp;
8888
static ControlUserPaneDrawUPP mydrawproc_upp;
8989
static ControlUserPaneIdleUPP myidleproc_upp;
90+
static ControlUserPaneHitTestUPP myhittestproc_upp;
91+
static ControlUserPaneTrackingUPP mytrackingproc_upp;
9092
9193
extern int settrackfunc(PyObject *); /* forward */
9294
extern void clrtrackfunc(void); /* forward */
@@ -175,6 +177,10 @@
175177
*uppp = mydrawproc_upp;
176178
else if ( which == kControlUserPaneIdleProcTag )
177179
*uppp = myidleproc_upp;
180+
else if ( which == kControlUserPaneHitTestProcTag )
181+
*uppp = myhittestproc_upp;
182+
else if ( which == kControlUserPaneTrackingProcTag )
183+
*uppp = mytrackingproc_upp;
178184
else
179185
return -1;
180186
/* Only now do we test for clearing of the callback: */
@@ -203,12 +209,12 @@
203209
sprintf(keybuf, "%x", which);
204210
if ( self->ob_callbackdict == NULL ||
205211
(func = PyDict_GetItemString(self->ob_callbackdict, keybuf)) == NULL ) {
206-
PySys_WriteStderr("Control callback without callback object\\n");
212+
PySys_WriteStderr("Control callback %x without callback object\\n", which);
207213
return NULL;
208214
}
209215
rv = PyEval_CallObject(func, arglist);
210216
if ( rv == NULL )
211-
PySys_WriteStderr("Exception in control callback handler\\n");
217+
PySys_WriteStderr("Exception in control callback %x handler\\n", which);
212218
return rv;
213219
}
214220
@@ -238,12 +244,50 @@
238244
Py_XDECREF(rv);
239245
}
240246
247+
static pascal ControlPartCode
248+
myhittestproc(ControlHandle control, Point where)
249+
{
250+
ControlObject *ctl_obj;
251+
PyObject *arglist, *rv;
252+
short c_rv = -1;
253+
254+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
255+
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &where);
256+
rv = callcallback(ctl_obj, kControlUserPaneHitTestProcTag, arglist);
257+
Py_XDECREF(arglist);
258+
/* Ignore errors, nothing we can do about them */
259+
if ( rv )
260+
PyArg_Parse(rv, "h", &c_rv);
261+
Py_XDECREF(rv);
262+
return (ControlPartCode)c_rv;
263+
}
264+
265+
static pascal ControlPartCode
266+
mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc)
267+
{
268+
ControlObject *ctl_obj;
269+
PyObject *arglist, *rv;
270+
short c_rv = -1;
271+
272+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
273+
/* We cannot pass the actionProc without lots of work */
274+
arglist = Py_BuildValue("OO&", ctl_obj, PyMac_BuildPoint, &startPt);
275+
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
276+
Py_XDECREF(arglist);
277+
if ( rv )
278+
PyArg_Parse(rv, "h", &c_rv);
279+
Py_XDECREF(rv);
280+
return (ControlPartCode)c_rv;
281+
}
282+
241283
"""
242284

243285
initstuff = initstuff + """
244286
mytracker_upp = NewControlActionProc(mytracker);
245287
mydrawproc_upp = NewControlUserPaneDrawProc(mydrawproc);
246288
myidleproc_upp = NewControlUserPaneDrawProc(myidleproc);
289+
myhittestproc_upp = NewControlUserPaneHitTestProc(myhittestproc);
290+
mytrackingproc_upp = NewControlUserPaneTrackingProc(mytrackingproc);
247291
"""
248292

249293
class MyObjectDefinition(ObjectIdentityMixin, GlobalObjectDefinition):

0 commit comments

Comments
 (0)