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

Skip to content

Commit c4cf27e

Browse files
committed
- added support for UserPaneKeyDownProc and UserPaneFocusProc
- clear error after failing PyArg_Parse()
1 parent a22a7b7 commit c4cf27e

2 files changed

Lines changed: 96 additions & 4 deletions

File tree

Mac/Modules/ctl/_Ctlmodule.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ DataBrowserListViewColumnDesc_Convert(PyObject *v, DataBrowserListViewColumnDesc
132132
static PyObject *tracker;
133133
static ControlActionUPP mytracker_upp;
134134
static ControlActionUPP myactionproc_upp;
135+
static ControlUserPaneKeyDownUPP mykeydownproc_upp;
136+
static ControlUserPaneFocusUPP myfocusproc_upp;
135137
static ControlUserPaneDrawUPP mydrawproc_upp;
136138
static ControlUserPaneIdleUPP myidleproc_upp;
137139
static ControlUserPaneHitTestUPP myhittestproc_upp;
@@ -6513,6 +6515,10 @@ setcallback(PyObject *myself, OSType which, PyObject *callback, UniversalProcPtr
65136515

65146516
if ( which == kMyControlActionProcTag )
65156517
*uppp = (UniversalProcPtr)myactionproc_upp;
6518+
else if ( which == kControlUserPaneKeyDownProcTag )
6519+
*uppp = (UniversalProcPtr)mykeydownproc_upp;
6520+
else if ( which == kControlUserPaneFocusProcTag )
6521+
*uppp = (UniversalProcPtr)myfocusproc_upp;
65166522
else if ( which == kControlUserPaneDrawProcTag )
65176523
*uppp = (UniversalProcPtr)mydrawproc_upp;
65186524
else if ( which == kControlUserPaneIdleProcTag )
@@ -6570,6 +6576,42 @@ myactionproc(ControlHandle control, SInt16 part)
65706576
Py_XDECREF(rv);
65716577
}
65726578

6579+
static pascal ControlPartCode
6580+
mykeydownproc(ControlHandle control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers)
6581+
{
6582+
ControlObject *ctl_obj;
6583+
PyObject *arglist, *rv;
6584+
short c_rv = 0;
6585+
6586+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
6587+
arglist = Py_BuildValue("Ohhh", ctl_obj, keyCode, charCode, modifiers);
6588+
rv = callcallback(ctl_obj, kControlUserPaneKeyDownProcTag, arglist);
6589+
Py_XDECREF(arglist);
6590+
if ( rv )
6591+
if (!PyArg_Parse(rv, "h", &c_rv))
6592+
PyErr_Clear();
6593+
Py_XDECREF(rv);
6594+
return (ControlPartCode)c_rv;
6595+
}
6596+
6597+
static pascal ControlPartCode
6598+
myfocusproc(ControlHandle control, ControlPartCode part)
6599+
{
6600+
ControlObject *ctl_obj;
6601+
PyObject *arglist, *rv;
6602+
short c_rv = kControlFocusNoPart;
6603+
6604+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
6605+
arglist = Py_BuildValue("Oh", ctl_obj, part);
6606+
rv = callcallback(ctl_obj, kControlUserPaneFocusProcTag, arglist);
6607+
Py_XDECREF(arglist);
6608+
if ( rv )
6609+
if (!PyArg_Parse(rv, "h", &c_rv))
6610+
PyErr_Clear();
6611+
Py_XDECREF(rv);
6612+
return (ControlPartCode)c_rv;
6613+
}
6614+
65736615
static pascal void
65746616
mydrawproc(ControlHandle control, SInt16 part)
65756617
{
@@ -6609,7 +6651,8 @@ myhittestproc(ControlHandle control, Point where)
66096651
Py_XDECREF(arglist);
66106652
/* Ignore errors, nothing we can do about them */
66116653
if ( rv )
6612-
PyArg_Parse(rv, "h", &c_rv);
6654+
if (!PyArg_Parse(rv, "h", &c_rv))
6655+
PyErr_Clear();
66136656
Py_XDECREF(rv);
66146657
return (ControlPartCode)c_rv;
66156658
}
@@ -6627,7 +6670,8 @@ mytrackingproc(ControlHandle control, Point startPt, ControlActionUPP actionProc
66276670
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
66286671
Py_XDECREF(arglist);
66296672
if ( rv )
6630-
PyArg_Parse(rv, "h", &c_rv);
6673+
if (!PyArg_Parse(rv, "h", &c_rv))
6674+
PyErr_Clear();
66316675
Py_XDECREF(rv);
66326676
return (ControlPartCode)c_rv;
66336677
}
@@ -6642,6 +6686,8 @@ void init_Ctl(void)
66426686

66436687
mytracker_upp = NewControlActionUPP(mytracker);
66446688
myactionproc_upp = NewControlActionUPP(myactionproc);
6689+
mykeydownproc_upp = NewControlUserPaneKeyDownUPP(mykeydownproc);
6690+
myfocusproc_upp = NewControlUserPaneFocusUPP(myfocusproc);
66456691
mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc);
66466692
myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc);
66476693
myhittestproc_upp = NewControlUserPaneHitTestUPP(myhittestproc);

Mac/Modules/ctl/ctlsupport.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,8 @@ def cleanup(self, name):
225225
static PyObject *tracker;
226226
static ControlActionUPP mytracker_upp;
227227
static ControlActionUPP myactionproc_upp;
228+
static ControlUserPaneKeyDownUPP mykeydownproc_upp;
229+
static ControlUserPaneFocusUPP myfocusproc_upp;
228230
static ControlUserPaneDrawUPP mydrawproc_upp;
229231
static ControlUserPaneIdleUPP myidleproc_upp;
230232
static ControlUserPaneHitTestUPP myhittestproc_upp;
@@ -313,6 +315,10 @@ def cleanup(self, name):
313315
314316
if ( which == kMyControlActionProcTag )
315317
*uppp = (UniversalProcPtr)myactionproc_upp;
318+
else if ( which == kControlUserPaneKeyDownProcTag )
319+
*uppp = (UniversalProcPtr)mykeydownproc_upp;
320+
else if ( which == kControlUserPaneFocusProcTag )
321+
*uppp = (UniversalProcPtr)myfocusproc_upp;
316322
else if ( which == kControlUserPaneDrawProcTag )
317323
*uppp = (UniversalProcPtr)mydrawproc_upp;
318324
else if ( which == kControlUserPaneIdleProcTag )
@@ -370,6 +376,42 @@ def cleanup(self, name):
370376
Py_XDECREF(rv);
371377
}
372378
379+
static pascal ControlPartCode
380+
mykeydownproc(ControlHandle control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers)
381+
{
382+
ControlObject *ctl_obj;
383+
PyObject *arglist, *rv;
384+
short c_rv = 0;
385+
386+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
387+
arglist = Py_BuildValue("Ohhh", ctl_obj, keyCode, charCode, modifiers);
388+
rv = callcallback(ctl_obj, kControlUserPaneKeyDownProcTag, arglist);
389+
Py_XDECREF(arglist);
390+
if ( rv )
391+
if (!PyArg_Parse(rv, "h", &c_rv))
392+
PyErr_Clear();
393+
Py_XDECREF(rv);
394+
return (ControlPartCode)c_rv;
395+
}
396+
397+
static pascal ControlPartCode
398+
myfocusproc(ControlHandle control, ControlPartCode part)
399+
{
400+
ControlObject *ctl_obj;
401+
PyObject *arglist, *rv;
402+
short c_rv = kControlFocusNoPart;
403+
404+
ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
405+
arglist = Py_BuildValue("Oh", ctl_obj, part);
406+
rv = callcallback(ctl_obj, kControlUserPaneFocusProcTag, arglist);
407+
Py_XDECREF(arglist);
408+
if ( rv )
409+
if (!PyArg_Parse(rv, "h", &c_rv))
410+
PyErr_Clear();
411+
Py_XDECREF(rv);
412+
return (ControlPartCode)c_rv;
413+
}
414+
373415
static pascal void
374416
mydrawproc(ControlHandle control, SInt16 part)
375417
{
@@ -409,7 +451,8 @@ def cleanup(self, name):
409451
Py_XDECREF(arglist);
410452
/* Ignore errors, nothing we can do about them */
411453
if ( rv )
412-
PyArg_Parse(rv, "h", &c_rv);
454+
if (!PyArg_Parse(rv, "h", &c_rv))
455+
PyErr_Clear();
413456
Py_XDECREF(rv);
414457
return (ControlPartCode)c_rv;
415458
}
@@ -427,7 +470,8 @@ def cleanup(self, name):
427470
rv = callcallback(ctl_obj, kControlUserPaneTrackingProcTag, arglist);
428471
Py_XDECREF(arglist);
429472
if ( rv )
430-
PyArg_Parse(rv, "h", &c_rv);
473+
if (!PyArg_Parse(rv, "h", &c_rv))
474+
PyErr_Clear();
431475
Py_XDECREF(rv);
432476
return (ControlPartCode)c_rv;
433477
}
@@ -436,6 +480,8 @@ def cleanup(self, name):
436480
initstuff = initstuff + """
437481
mytracker_upp = NewControlActionUPP(mytracker);
438482
myactionproc_upp = NewControlActionUPP(myactionproc);
483+
mykeydownproc_upp = NewControlUserPaneKeyDownUPP(mykeydownproc);
484+
myfocusproc_upp = NewControlUserPaneFocusUPP(myfocusproc);
439485
mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc);
440486
myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc);
441487
myhittestproc_upp = NewControlUserPaneHitTestUPP(myhittestproc);

0 commit comments

Comments
 (0)