]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport of 1.4 thru 1.16 (of _Ctlmodule.c):
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 27 Feb 2002 23:11:42 +0000 (23:11 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 27 Feb 2002 23:11:42 +0000 (23:11 +0000)
- 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()

Mac/Modules/ctl/_Ctlmodule.c
Mac/Modules/ctl/ctlscan.py
Mac/Modules/ctl/ctlsupport.py

index d15ed906d4d91c9e8c61f6087702440faf17252b..cf1c4599686d70d60bd065b9728dcfe512dc22d8 100644 (file)
@@ -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;
@@ -6145,6 +6265,11 @@ static PyMethodDef Ctl_methods[] = {
         "(WindowPtr window, Rect boundsRect, CFStringRef title, UInt16 thickness, UInt16 behavior, ControlButtonContentInfo info, SInt16 menuID, UInt16 menuBehavior, UInt16 menuPlacement) -> (ControlHandle outControl)"},
 #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)"},
@@ -6260,6 +6385,11 @@ static PyMethodDef Ctl_methods[] = {
         "(WindowPtr window, Rect boundsRect, CFStringRef title, SInt32 initialValue, Boolean autoToggle) -> (ControlHandle outControl)"},
 #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)"},
@@ -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,11 +6556,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)
 {
@@ -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);
index 61f79eb093a93b605da7f79cb454a162ef0c06b7..0e0a80aa1584aae08b00482170235c4a1f96b3bc 100644 (file)
@@ -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__":
index 553860891975c0b089850dc7c5a64d57ad228e52..b773290ceeb21b19980c5211afed6c3c3cf9fad8 100644 (file)
@@ -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);