menusupport.py 3.91 KB
Newer Older
1 2 3 4 5 6 7 8 9
# This script generates a Python interface for an Apple Macintosh Manager.
# It uses the "bgen" package to generate C code.
# The function specifications are generated by scanning the mamager's header file,
# using the "scantools" package (customized for this particular manager).

import string

# Declarations that change for each manager
MACHEADERFILE = 'Menus.h'		# The Apple header file
10
MODNAME = '_Menu'			# The name of the module
11 12 13
OBJECTNAME = 'Menu'			# The basic name of the objects used here

# The following is *usually* unchanged but may still require tuning
14
MODPREFIX = 'Menu'			# The prefix for module-wide routines
15 16 17
OBJECTTYPE = OBJECTNAME + 'Handle'	# The C type used to represent them
OBJECTPREFIX = MODPREFIX + 'Obj'	# The prefix for object methods
INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
18
EXTRAFILE = string.lower(MODPREFIX) + 'edit.py' # A similar file but hand-made
19 20 21 22 23 24 25
OUTPUTFILE = MODNAME + "module.c"	# The file generated by this program

from macsupport import *

# Create the type objects

MenuHandle = OpaqueByValueType(OBJECTTYPE, OBJECTPREFIX)
26
MenuRef = MenuHandle
27
OptMenuRef = OpaqueByValueType(OBJECTTYPE, "Opt" + OBJECTPREFIX)
28
Handle = OpaqueByValueType("Handle", "ResObj")
29 30 31
MenuBarHandle = OpaqueByValueType("MenuBarHandle", "ResObj")
MenuID = Type("MenuID", "h")
MenuItemIndex = Type("MenuItemIndex", "h")
32
MenuItemID = Type("MenuItemID", "l")
33 34 35
MenuCommand = Type("MenuCommand", "l")
MenuAttributes = Type("MenuAttributes", "l")
MenuItemAttributes = Type("MenuItemAttributes", "l")
36
unsigned_char = Type('unsigned char', 'b')
37 38
FMFontFamily = Type("FMFontFamily", "h")
FMFontStyle = Type("FMFontStyle", "h")
39 40
CFStringRef = OpaqueByValueType("CFStringRef", "CFStringRefObj")
UniChar = Type("UniChar", "h")
41 42

includestuff = includestuff + """
43
#ifdef WITHOUT_FRAMEWORKS
44
#include <Devices.h> /* Defines OpenDeskAcc in universal headers */
45 46 47 48 49
#include <Menus.h>
#else
#include <Carbon/Carbon.h>
#endif

50

51 52 53 54 55 56 57 58 59
#ifdef USE_TOOLBOX_OBJECT_GLUE

extern PyObject *_MenuObj_New(MenuHandle);
extern int _MenuObj_Convert(PyObject *, MenuHandle *);

#define MenuObj_New _MenuObj_New
#define MenuObj_Convert _MenuObj_Convert 
#endif

60 61 62 63 64 65 66 67 68 69
#if !ACCESSOR_CALLS_ARE_FUNCTIONS
#define GetMenuID(menu) ((*(menu))->menuID)
#define GetMenuWidth(menu) ((*(menu))->menuWidth)
#define GetMenuHeight(menu) ((*(menu))->menuHeight)

#define SetMenuID(menu, id) ((*(menu))->menuID = (id))
#define SetMenuWidth(menu, width) ((*(menu))->menuWidth = (width))
#define SetMenuHeight(menu, height) ((*(menu))->menuHeight = (height))
#endif

70
#define as_Menu(h) ((MenuHandle)h)
71
#define as_Resource(h) ((Handle)h)
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94


/* Alternative version of MenuObj_New, which returns None for NULL argument */
PyObject *OptMenuObj_New(MenuRef itself)
{
	if (itself == NULL) {
		Py_INCREF(Py_None);
		return Py_None;
	}
	return MenuObj_New(itself);
}

/* Alternative version of MenuObj_Convert, which returns NULL for a None argument */
int OptMenuObj_Convert(PyObject *v, MenuRef *p_itself)
{
	PyObject *tmp;
	
	if ( v == Py_None ) {
		*p_itself = NULL;
		return 1;
	}
	return MenuObj_Convert(v, p_itself);
}
95 96
"""

97
initstuff = initstuff + """
98 99
	PyMac_INIT_TOOLBOX_OBJECT_NEW(MenuHandle, MenuObj_New);
	PyMac_INIT_TOOLBOX_OBJECT_CONVERT(MenuHandle, MenuObj_Convert);
100 101
"""

102 103 104 105 106 107 108 109 110
class MyObjectDefinition(GlobalObjectDefinition):
	pass

# Create the generator groups and link them
module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
module.addobject(object)

# Create the generator classes used to populate the lists
111 112
Function = OSErrWeakLinkFunctionGenerator
Method = OSErrWeakLinkMethodGenerator
113 114 115 116 117

# Create and populate the lists
functions = []
methods = []
execfile(INPUTFILE)
118
execfile(EXTRAFILE)
119 120 121 122 123 124 125 126

# add the populated lists to the generator groups
for f in functions: module.add(f)
for f in methods: object.add(f)

# generate output (open the output file as late as possible)
SetOutputFileName(OUTPUTFILE)
module.generate()