symbian-qemu-0.9.1-12/python-2.6.1/Mac/Modules/drag/dragsupport.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 # This script generates a Python interface for an Apple Macintosh Manager.
       
     2 # It uses the "bgen" package to generate C code.
       
     3 # The function specifications are generated by scanning the mamager's header file,
       
     4 # using the "scantools" package (customized for this particular manager).
       
     5 
       
     6 import string
       
     7 
       
     8 # Declarations that change for each manager
       
     9 MACHEADERFILE = 'Drag.h'                # The Apple header file
       
    10 MODNAME = '_Drag'                               # The name of the module
       
    11 OBJECTNAME = 'DragObj'                  # The basic name of the objects used here
       
    12 
       
    13 # The following is *usually* unchanged but may still require tuning
       
    14 MODPREFIX = 'Drag'                      # The prefix for module-wide routines
       
    15 OBJECTTYPE = 'DragRef'  # The C type used to represent them
       
    16 OBJECTPREFIX = MODPREFIX + 'Obj'        # The prefix for object methods
       
    17 INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
       
    18 OUTPUTFILE = MODNAME + "module.c"       # The file generated by this program
       
    19 
       
    20 from macsupport import *
       
    21 
       
    22 # Create the type objects
       
    23 
       
    24 DragRef = OpaqueByValueType(OBJECTTYPE, OBJECTPREFIX)
       
    25 DragItemRef = Type("ItemReference", "l")
       
    26 # Old names
       
    27 DragReference = DragRef
       
    28 ItemReference = DragItemRef
       
    29 
       
    30 PixMapHandle = OpaqueByValueType("PixMapHandle", "ResObj")
       
    31 RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
       
    32 AEDesc = OpaqueType('AEDesc')
       
    33 AEDesc_ptr = AEDesc
       
    34 RGBColor = OpaqueType("RGBColor", "QdRGB")
       
    35 
       
    36 FlavorType = OSTypeType("FlavorType")
       
    37 DragAttributes = Type("DragAttributes", "l")
       
    38 DragBehaviors = Type("DragBehaviors", "l")
       
    39 DragImageFlags = Type("DragImageFlags", "l")
       
    40 DragImageTranslucency = Type("DragImageTranslucency", "l")
       
    41 DragRegionMessage = Type("DragRegionMessage", "h")
       
    42 ZoomAcceleration = Type("ZoomAcceleration", "h")
       
    43 FlavorFlags = Type("FlavorFlags", "l")
       
    44 DragTrackingMessage = Type("DragTrackingMessage", "h")
       
    45 
       
    46 includestuff = includestuff + """
       
    47 #include <Carbon/Carbon.h>
       
    48 
       
    49 /* Callback glue routines */
       
    50 DragTrackingHandlerUPP dragglue_TrackingHandlerUPP;
       
    51 DragReceiveHandlerUPP dragglue_ReceiveHandlerUPP;
       
    52 DragSendDataUPP dragglue_SendDataUPP;
       
    53 #if 0
       
    54 DragInputUPP dragglue_InputUPP;
       
    55 DragDrawingUPP dragglue_DrawingUPP;
       
    56 #endif
       
    57 
       
    58 #ifdef USE_TOOLBOX_OBJECT_GLUE
       
    59 extern PyObject *_DragObj_New(DragRef);
       
    60 extern int _DragObj_Convert(PyObject *, DragRef *);
       
    61 
       
    62 #define DragObj_New _DragObj_New
       
    63 #define DragObj_Convert _DragObj_Convert
       
    64 #endif
       
    65 """
       
    66 
       
    67 finalstuff = finalstuff + """
       
    68 static pascal OSErr
       
    69 dragglue_TrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,
       
    70                          void *handlerRefCon, DragReference theDrag)
       
    71 {
       
    72         PyObject *args, *rv;
       
    73         int i;
       
    74 
       
    75         args = Py_BuildValue("hO&O&", theMessage, DragObj_New, theDrag, WinObj_WhichWindow, theWindow);
       
    76         if ( args == NULL )
       
    77                 return -1;
       
    78         rv = PyEval_CallObject((PyObject *)handlerRefCon, args);
       
    79         Py_DECREF(args);
       
    80         if ( rv == NULL ) {
       
    81                 PySys_WriteStderr("Drag: Exception in TrackingHandler\\n");
       
    82                 PyErr_Print();
       
    83                 return -1;
       
    84         }
       
    85         i = -1;
       
    86         if ( rv == Py_None )
       
    87                 i = 0;
       
    88         else
       
    89                 PyArg_Parse(rv, "l", &i);
       
    90         Py_DECREF(rv);
       
    91         return i;
       
    92 }
       
    93 
       
    94 static pascal OSErr
       
    95 dragglue_ReceiveHandler(WindowPtr theWindow, void *handlerRefCon,
       
    96                         DragReference theDrag)
       
    97 {
       
    98         PyObject *args, *rv;
       
    99         int i;
       
   100 
       
   101         args = Py_BuildValue("O&O&", DragObj_New, theDrag, WinObj_WhichWindow, theWindow);
       
   102         if ( args == NULL )
       
   103                 return -1;
       
   104         rv = PyEval_CallObject((PyObject *)handlerRefCon, args);
       
   105         Py_DECREF(args);
       
   106         if ( rv == NULL ) {
       
   107                 PySys_WriteStderr("Drag: Exception in ReceiveHandler\\n");
       
   108                 PyErr_Print();
       
   109                 return -1;
       
   110         }
       
   111         i = -1;
       
   112         if ( rv == Py_None )
       
   113                 i = 0;
       
   114         else
       
   115                 PyArg_Parse(rv, "l", &i);
       
   116         Py_DECREF(rv);
       
   117         return i;
       
   118 }
       
   119 
       
   120 static pascal OSErr
       
   121 dragglue_SendData(FlavorType theType, void *dragSendRefCon,
       
   122                       ItemReference theItem, DragReference theDrag)
       
   123 {
       
   124         DragObjObject *self = (DragObjObject *)dragSendRefCon;
       
   125         PyObject *args, *rv;
       
   126         int i;
       
   127 
       
   128         if ( self->sendproc == NULL )
       
   129                 return -1;
       
   130         args = Py_BuildValue("O&l", PyMac_BuildOSType, theType, theItem);
       
   131         if ( args == NULL )
       
   132                 return -1;
       
   133         rv = PyEval_CallObject(self->sendproc, args);
       
   134         Py_DECREF(args);
       
   135         if ( rv == NULL ) {
       
   136                 PySys_WriteStderr("Drag: Exception in SendDataHandler\\n");
       
   137                 PyErr_Print();
       
   138                 return -1;
       
   139         }
       
   140         i = -1;
       
   141         if ( rv == Py_None )
       
   142                 i = 0;
       
   143         else
       
   144                 PyArg_Parse(rv, "l", &i);
       
   145         Py_DECREF(rv);
       
   146         return i;
       
   147 }
       
   148 
       
   149 #if 0
       
   150 static pascal OSErr
       
   151 dragglue_Input(Point *mouse, short *modifiers,
       
   152                    void *dragSendRefCon, DragReference theDrag)
       
   153 {
       
   154     return 0;
       
   155 }
       
   156 
       
   157 static pascal OSErr
       
   158 dragglue_Drawing(xxxx
       
   159                    void *dragSendRefCon, DragReference theDrag)
       
   160 {
       
   161     return 0;
       
   162 }
       
   163 #endif
       
   164 
       
   165 """
       
   166 
       
   167 initstuff = initstuff + """
       
   168         PyMac_INIT_TOOLBOX_OBJECT_NEW(DragRef, DragObj_New);
       
   169         PyMac_INIT_TOOLBOX_OBJECT_CONVERT(DragRef, DragObj_Convert);
       
   170 """
       
   171 
       
   172 variablestuff = """
       
   173 dragglue_TrackingHandlerUPP = NewDragTrackingHandlerUPP(dragglue_TrackingHandler);
       
   174 dragglue_ReceiveHandlerUPP = NewDragReceiveHandlerUPP(dragglue_ReceiveHandler);
       
   175 dragglue_SendDataUPP = NewDragSendDataUPP(dragglue_SendData);
       
   176 #if 0
       
   177 dragglue_InputUPP = NewDragInputUPP(dragglue_Input);
       
   178 dragglue_DrawingUPP = NewDragDrawingUPP(dragglue_Drawing);
       
   179 #endif
       
   180 """
       
   181 
       
   182 class MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
       
   183     def outputCheckNewArg(self):
       
   184         Output("""if (itself == NULL) {
       
   185                                 PyErr_SetString(Drag_Error,"Cannot create null Drag");
       
   186                                 return NULL;
       
   187                         }""")
       
   188     def outputFreeIt(self, itselfname):
       
   189         ## Output("DisposeDrag(%s);", itselfname)
       
   190         Output("Py_XDECREF(self->sendproc);")
       
   191         ## Output("Py_XDECREF(self->inputproc);")
       
   192         ## Output("Py_XDECREF(self->drawingproc);")
       
   193 
       
   194     def outputStructMembers(self):
       
   195         GlobalObjectDefinition.outputStructMembers(self)
       
   196         Output("PyObject *sendproc;")
       
   197         ## Output("PyObject *inputproc;")
       
   198         ## Output("PyObject *drawingproc;")
       
   199 
       
   200     def outputInitStructMembers(self):
       
   201         GlobalObjectDefinition.outputInitStructMembers(self)
       
   202         Output("it->sendproc = NULL;")
       
   203         ## Output("it->inputproc = NULL;")
       
   204         ## Output("it->drawingproc = NULL;")
       
   205 
       
   206 
       
   207 # Create the generator groups and link them
       
   208 module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
       
   209 object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
       
   210 module.addobject(object)
       
   211 
       
   212 # Create the generator classes used to populate the lists
       
   213 Function = OSErrWeakLinkFunctionGenerator
       
   214 Method = OSErrWeakLinkMethodGenerator
       
   215 
       
   216 # Create and populate the lists
       
   217 functions = []
       
   218 methods = []
       
   219 execfile(INPUTFILE)
       
   220 
       
   221 # add the populated lists to the generator groups
       
   222 for f in functions: module.add(f)
       
   223 for f in methods: object.add(f)
       
   224 
       
   225 # Manual generators for the callbacks
       
   226 
       
   227 installtracking_body = """
       
   228     PyObject *callback;
       
   229     WindowPtr theWindow = NULL;
       
   230     OSErr _err;
       
   231 
       
   232     if ( !PyArg_ParseTuple(_args, "O|O&", &callback, WinObj_Convert, &theWindow) )
       
   233         return NULL;
       
   234     Py_INCREF(callback);        /* Cannot decref later, too bad */
       
   235     _err = InstallTrackingHandler(dragglue_TrackingHandlerUPP, theWindow, (void *)callback);
       
   236         if (_err != noErr) return PyMac_Error(_err);
       
   237         Py_INCREF(Py_None);
       
   238         _res = Py_None;
       
   239         return _res;
       
   240 """
       
   241 installtracking = ManualGenerator("InstallTrackingHandler", installtracking_body)
       
   242 module.add(installtracking)
       
   243 
       
   244 installreceive_body = """
       
   245     PyObject *callback;
       
   246     WindowPtr theWindow = NULL;
       
   247     OSErr _err;
       
   248 
       
   249     if ( !PyArg_ParseTuple(_args, "O|O&", &callback, WinObj_Convert, &theWindow) )
       
   250         return NULL;
       
   251     Py_INCREF(callback);        /* Cannot decref later, too bad */
       
   252     _err = InstallReceiveHandler(dragglue_ReceiveHandlerUPP, theWindow, (void *)callback);
       
   253         if (_err != noErr) return PyMac_Error(_err);
       
   254         Py_INCREF(Py_None);
       
   255         _res = Py_None;
       
   256         return _res;
       
   257 """
       
   258 installreceive = ManualGenerator("InstallReceiveHandler", installreceive_body)
       
   259 module.add(installreceive)
       
   260 
       
   261 removetracking_body = """
       
   262     WindowPtr theWindow = NULL;
       
   263     OSErr _err;
       
   264 
       
   265     if ( !PyArg_ParseTuple(_args, "|O&", WinObj_Convert, &theWindow) )
       
   266         return NULL;
       
   267     _err = RemoveTrackingHandler(dragglue_TrackingHandlerUPP, theWindow);
       
   268         if (_err != noErr) return PyMac_Error(_err);
       
   269         Py_INCREF(Py_None);
       
   270         _res = Py_None;
       
   271         return _res;
       
   272 """
       
   273 removetracking = ManualGenerator("RemoveTrackingHandler", removetracking_body)
       
   274 module.add(removetracking)
       
   275 
       
   276 removereceive_body = """
       
   277     WindowPtr theWindow = NULL;
       
   278     OSErr _err;
       
   279 
       
   280     if ( !PyArg_ParseTuple(_args, "|O&", WinObj_Convert, &theWindow) )
       
   281         return NULL;
       
   282     _err = RemoveReceiveHandler(dragglue_ReceiveHandlerUPP, theWindow);
       
   283         if (_err != noErr) return PyMac_Error(_err);
       
   284         Py_INCREF(Py_None);
       
   285         _res = Py_None;
       
   286         return _res;
       
   287 """
       
   288 removereceive = ManualGenerator("RemoveReceiveHandler", removereceive_body)
       
   289 module.add(removereceive)
       
   290 
       
   291 # generate output (open the output file as late as possible)
       
   292 SetOutputFileName(OUTPUTFILE)
       
   293 module.generate()