2001-11-05 15:44:23 +01:00
# IBCarbonsupport.py
from macsupport import *
2001-11-05 17:21:45 +01:00
from CarbonEvtscan import RefObjectTypes
2001-11-05 15:44:23 +01:00
# where should this go? macsupport.py?
CFStringRef = OpaqueByValueType ( ' CFStringRef ' )
for typ in RefObjectTypes :
2004-07-18 08:16:08 +02:00
execstr = " %(name)s = OpaqueByValueType( ' %(name)s ' ) " % { " name " : typ }
exec execstr
2001-11-05 15:44:23 +01:00
2001-12-15 00:16:04 +01:00
2001-12-12 21:48:53 +01:00
if 0 :
2004-07-18 08:16:08 +02:00
# these types will have no methods and will merely be opaque blobs
# should write getattr and setattr for them?
2001-11-05 15:44:23 +01:00
2004-07-18 08:16:08 +02:00
StructObjectTypes = [ " EventTypeSpec " ,
" HIPoint " ,
" HICommand " ,
" EventHotKeyID " ,
]
2001-11-05 15:44:23 +01:00
2004-07-18 08:16:08 +02:00
for typ in StructObjectTypes :
execstr = " %(name)s = OpaqueType( ' %(name)s ' ) " % { " name " : typ }
exec execstr
2001-11-05 15:44:23 +01:00
2001-12-12 21:48:53 +01:00
EventHotKeyID = OpaqueByValueType ( " EventHotKeyID " , " EventHotKeyID " )
2001-12-11 22:52:02 +01:00
EventTypeSpec_ptr = OpaqueType ( " EventTypeSpec " , " EventTypeSpec " )
2001-11-05 15:44:23 +01:00
# is this the right type for the void * in GetEventParameter
#void_ptr = FixedInputBufferType(1024)
void_ptr = stringptr
# here are some types that are really other types
2002-01-03 21:45:47 +01:00
class MyVarInputBufferType ( VarInputBufferType ) :
2004-07-18 08:16:08 +02:00
def passInput ( self , name ) :
return " %s __len__, %s __in__ " % ( name , name )
2002-01-03 21:45:47 +01:00
2004-07-18 08:16:08 +02:00
MyInBuffer = MyVarInputBufferType ( ' char ' , ' long ' , ' l ' ) # (buf, len)
2002-01-03 21:45:47 +01:00
2001-11-05 15:44:23 +01:00
EventTime = double
EventTimeout = EventTime
EventTimerInterval = EventTime
EventAttributes = UInt32
EventParamName = OSType
EventParamType = OSType
EventPriority = SInt16
EventMask = UInt16
EventComparatorUPP = FakeType ( " (EventComparatorUPP)0 " )
EventLoopTimerUPP = FakeType ( " (EventLoopTimerUPP)0 " )
EventHandlerUPP = FakeType ( " (EventHandlerUPP)0 " )
EventHandlerUPP = FakeType ( " (EventHandlerUPP)0 " )
EventComparatorProcPtr = FakeType ( " (EventComparatorProcPtr)0 " )
EventLoopTimerProcPtr = FakeType ( " (EventLoopTimerProcPtr)0 " )
EventHandlerProcPtr = FakeType ( " (EventHandlerProcPtr)0 " )
CarbonEventsFunction = OSErrFunctionGenerator
CarbonEventsMethod = OSErrMethodGenerator
2001-12-15 00:16:04 +01:00
class EventHandlerRefMethod ( OSErrMethodGenerator ) :
2004-07-18 08:16:08 +02:00
def precheck ( self ) :
OutLbrace ( ' if (_self->ob_itself == NULL) ' )
Output ( ' PyErr_SetString(CarbonEvents_Error, " Handler has been removed " ); ' )
Output ( ' return NULL; ' )
OutRbrace ( )
2001-12-15 00:16:04 +01:00
2002-01-08 12:49:31 +01:00
RgnHandle = OpaqueByValueType ( " RgnHandle " , " ResObj " )
GrafPtr = OpaqueByValueType ( " GrafPtr " , " GrafObj " )
MouseTrackingResult = UInt16
2003-11-20 14:31:00 +01:00
includestuff = includestuff + r """
2001-11-05 15:44:23 +01:00
#include <Carbon/Carbon.h>
2001-12-11 22:52:02 +01:00
2001-11-05 15:44:23 +01:00
extern int CFStringRef_New ( CFStringRef * ) ;
extern int CFStringRef_Convert ( PyObject * , CFStringRef * ) ;
extern int CFBundleRef_Convert ( PyObject * , CFBundleRef * ) ;
int EventTargetRef_Convert ( PyObject * , EventTargetRef * ) ;
PyObject * EventHandlerCallRef_New ( EventHandlerCallRef itself ) ;
PyObject * EventRef_New ( EventRef itself ) ;
/ * * * * * * * * * * EventTypeSpec * * * * * * * /
static PyObject *
EventTypeSpec_New ( EventTypeSpec * in )
{
2004-07-18 08:16:08 +02:00
return Py_BuildValue ( " ll " , in - > eventClass , in - > eventKind ) ;
2001-11-05 15:44:23 +01:00
}
static int
EventTypeSpec_Convert ( PyObject * v , EventTypeSpec * out )
{
2004-07-18 08:16:08 +02:00
if ( PyArg_Parse ( v , " (O&l) " ,
PyMac_GetOSType , & ( out - > eventClass ) ,
& ( out - > eventKind ) ) )
return 1 ;
return NULL ;
2001-11-05 15:44:23 +01:00
}
/ * * * * * * * * * * end EventTypeSpec * * * * * * * /
/ * * * * * * * * * * HIPoint * * * * * * * /
2001-12-11 22:52:02 +01:00
#if 0 /* XXX doesn't compile */
2001-11-05 15:44:23 +01:00
static PyObject *
HIPoint_New ( HIPoint * in )
{
2004-07-18 08:16:08 +02:00
return Py_BuildValue ( " ff " , in - > x , in - > y ) ;
2001-11-05 15:44:23 +01:00
}
static int
HIPoint_Convert ( PyObject * v , HIPoint * out )
{
2004-07-18 08:16:08 +02:00
if ( PyArg_ParseTuple ( v , " ff " , & ( out - > x ) , & ( out - > y ) ) )
return 1 ;
return NULL ;
2001-11-05 15:44:23 +01:00
}
2001-12-11 22:52:02 +01:00
#endif
2001-11-05 15:44:23 +01:00
/ * * * * * * * * * * end HIPoint * * * * * * * /
/ * * * * * * * * * * EventHotKeyID * * * * * * * /
static PyObject *
EventHotKeyID_New ( EventHotKeyID * in )
{
2004-07-18 08:16:08 +02:00
return Py_BuildValue ( " ll " , in - > signature , in - > id ) ;
2001-11-05 15:44:23 +01:00
}
static int
EventHotKeyID_Convert ( PyObject * v , EventHotKeyID * out )
{
2004-07-18 08:16:08 +02:00
if ( PyArg_ParseTuple ( v , " ll " , & out - > signature , & out - > id ) )
return 1 ;
return NULL ;
2001-11-05 15:44:23 +01:00
}
/ * * * * * * * * * * end EventHotKeyID * * * * * * * /
2001-12-12 21:48:53 +01:00
/ * * * * * * * * myEventHandler * * * * * * * * * * * /
2001-11-05 15:44:23 +01:00
2001-12-12 21:48:53 +01:00
static EventHandlerUPP myEventHandlerUPP ;
2001-12-11 22:52:02 +01:00
2001-12-12 22:48:00 +01:00
static pascal OSStatus
myEventHandler ( EventHandlerCallRef handlerRef , EventRef event , void * outPyObject ) {
2004-07-18 08:16:08 +02:00
PyObject * retValue ;
int status ;
retValue = PyObject_CallFunction ( ( PyObject * ) outPyObject , " O&O& " ,
EventHandlerCallRef_New , handlerRef ,
EventRef_New , event ) ;
if ( retValue == NULL ) {
PySys_WriteStderr ( " Error in event handler callback: \n " ) ;
PyErr_Print ( ) ; / * this also clears the error * /
status = noErr ; / * complain ? how ? * /
} else {
if ( retValue == Py_None )
status = noErr ;
else if ( PyInt_Check ( retValue ) ) {
status = PyInt_AsLong ( retValue ) ;
} else
status = noErr ; / * wrong object type , complain ? * /
Py_DECREF ( retValue ) ;
}
return status ;
2001-11-05 15:44:23 +01:00
}
2001-12-12 21:48:53 +01:00
/ * * * * * * * * end myEventHandler * * * * * * * * * * * /
2001-11-05 15:44:23 +01:00
"""
2001-12-11 22:52:02 +01:00
initstuff = initstuff + """
2001-12-12 21:48:53 +01:00
myEventHandlerUPP = NewEventHandlerUPP ( myEventHandler ) ;
2001-12-11 22:52:02 +01:00
"""
module = MacModule ( ' _CarbonEvt ' , ' CarbonEvents ' , includestuff , finalstuff , initstuff )
2001-11-05 15:44:23 +01:00
2001-12-15 00:16:04 +01:00
2002-12-04 00:40:22 +01:00
class EventHandlerRefObjectDefinition ( PEP253Mixin , GlobalObjectDefinition ) :
2004-07-18 08:16:08 +02:00
def outputStructMembers ( self ) :
Output ( " %s ob_itself; " , self . itselftype )
Output ( " PyObject *ob_callback; " )
def outputInitStructMembers ( self ) :
Output ( " it->ob_itself = %s itself; " , self . argref )
Output ( " it->ob_callback = NULL; " )
def outputFreeIt ( self , name ) :
OutLbrace ( " if (self->ob_itself != NULL) " )
Output ( " RemoveEventHandler(self->ob_itself); " )
Output ( " Py_DECREF(self->ob_callback); " )
OutRbrace ( )
2002-12-04 00:40:22 +01:00
class MyGlobalObjectDefinition ( PEP253Mixin , GlobalObjectDefinition ) :
2004-07-18 08:16:08 +02:00
pass
2001-11-05 15:44:23 +01:00
for typ in RefObjectTypes :
2004-07-18 08:16:08 +02:00
if typ == ' EventHandlerRef ' :
EventHandlerRefobject = EventHandlerRefObjectDefinition ( ' EventHandlerRef ' )
else :
execstr = typ + ' object = MyGlobalObjectDefinition(typ) '
exec execstr
module . addobject ( eval ( typ + ' object ' ) )
2001-11-05 15:44:23 +01:00
2001-12-15 00:16:04 +01:00
2001-11-05 15:44:23 +01:00
functions = [ ]
2001-11-05 17:15:45 +01:00
for typ in RefObjectTypes : ## go thru all ObjectTypes as defined in CarbonEventsscan.py
2004-07-18 08:16:08 +02:00
# initialize the lists for carbongen to fill
execstr = typ + ' methods = [] '
exec execstr
2001-11-05 15:44:23 +01:00
execfile ( ' CarbonEventsgen.py ' )
2001-12-15 00:16:04 +01:00
2004-07-18 08:16:08 +02:00
for f in functions : module . add ( f ) # add all the functions carboneventsgen put in the list
2001-11-05 15:44:23 +01:00
2004-07-18 08:16:08 +02:00
for typ in RefObjectTypes : ## go thru all ObjectTypes as defined in CarbonEventsscan.py
methods = eval ( typ + ' methods ' ) ## get a reference to the method list from the main namespace
obj = eval ( typ + ' object ' ) ## get a reference to the object
for m in methods : obj . add ( m ) ## add each method in the list to the object
2001-11-05 15:44:23 +01:00
2001-12-15 00:16:04 +01:00
removeeventhandler = """
OSStatus _err ;
if ( _self - > ob_itself == NULL ) {
2004-07-18 08:16:08 +02:00
PyErr_SetString ( CarbonEvents_Error , " Handler has been removed " ) ;
return NULL ;
2001-12-15 00:16:04 +01:00
}
if ( ! PyArg_ParseTuple ( _args , " " ) )
2004-07-18 08:16:08 +02:00
return NULL ;
2001-12-15 00:16:04 +01:00
_err = RemoveEventHandler ( _self - > ob_itself ) ;
if ( _err != noErr ) return PyMac_Error ( _err ) ;
_self - > ob_itself = NULL ;
Py_DECREF ( _self - > ob_callback ) ;
_self - > ob_callback = NULL ;
Py_INCREF ( Py_None ) ;
_res = Py_None ;
return _res ; """
f = ManualGenerator ( " RemoveEventHandler " , removeeventhandler ) ;
f . docstring = lambda : " () -> None "
EventHandlerRefobject . add ( f )
2001-11-05 15:44:23 +01:00
installeventhandler = """
EventTypeSpec inSpec ;
PyObject * callback ;
EventHandlerRef outRef ;
OSStatus _err ;
if ( ! PyArg_ParseTuple ( _args , " O&O " , EventTypeSpec_Convert , & inSpec , & callback ) )
2004-07-18 08:16:08 +02:00
return NULL ;
2001-11-05 15:44:23 +01:00
2001-12-12 21:48:53 +01:00
_err = InstallEventHandler ( _self - > ob_itself , myEventHandlerUPP , 1 , & inSpec , ( void * ) callback , & outRef ) ;
2001-11-05 15:44:23 +01:00
if ( _err != noErr ) return PyMac_Error ( _err ) ;
2001-12-15 00:16:04 +01:00
_res = EventHandlerRef_New ( outRef ) ;
if ( _res != NULL ) {
2004-07-18 08:16:08 +02:00
( ( EventHandlerRefObject * ) _res ) - > ob_callback = callback ;
Py_INCREF ( callback ) ;
2001-12-15 00:16:04 +01:00
}
return _res ; """
2001-11-05 15:44:23 +01:00
f = ManualGenerator ( " InstallEventHandler " , installeventhandler ) ;
2001-12-15 00:16:04 +01:00
f . docstring = lambda : " (EventTypeSpec inSpec, Method callback) -> (EventHandlerRef outRef) "
2001-11-05 15:44:23 +01:00
EventTargetRefobject . add ( f )
2001-12-18 13:35:57 +01:00
# This may not be the best, but at least it lets you get the raw data back into python as a string. You'll have to cut it up yourself and parse the result.
geteventparameter = """
UInt32 bufferSize ;
EventParamName inName ;
EventParamType inType ;
OSErr _err ;
void * buffer ;
if ( ! PyArg_ParseTuple ( _args , " O&O& " , PyMac_GetOSType , & inName , PyMac_GetOSType , & inType ) )
return NULL ;
/ * Figure out the size by passing a null buffer to GetEventParameter * /
_err = GetEventParameter ( _self - > ob_itself , inName , inType , NULL , 0 , & bufferSize , NULL ) ;
if ( _err != noErr )
return PyMac_Error ( _err ) ;
buffer = PyMem_NEW ( char , bufferSize ) ;
if ( buffer == NULL )
return PyErr_NoMemory ( ) ;
_err = GetEventParameter ( _self - > ob_itself , inName , inType , NULL , bufferSize , NULL , buffer ) ;
if ( _err != noErr ) {
PyMem_DEL ( buffer ) ;
return PyMac_Error ( _err ) ;
}
_res = Py_BuildValue ( " s# " , buffer , bufferSize ) ;
PyMem_DEL ( buffer ) ;
return _res ;
"""
f = ManualGenerator ( " GetEventParameter " , geteventparameter ) ;
f . docstring = lambda : " (EventParamName eventName, EventParamType eventType) -> (String eventParamData) "
EventRefobject . add ( f )
2001-12-11 22:52:02 +01:00
SetOutputFileName ( ' _CarbonEvtmodule.c ' )
2001-11-05 15:44:23 +01:00
module . generate ( )
2001-11-05 17:21:45 +01:00
##import os
##os.system("python setup.py build")