| # Scan <Controls.h>, generating ctlgen.py. | |
| import sys | |
| from bgenlocations import TOOLBOXDIR, BGENDIR | |
| sys.path.append(BGENDIR) | |
| from scantools import Scanner | |
| def main(): | |
| # input = "Controls.h" # Universal Headers < 3.3 | |
| input = ["Controls.h", "ControlDefinitions.h"] # Universal Headers >= 3.3 | |
| output = "ctlgen.py" | |
| defsoutput = TOOLBOXDIR + "Controls.py" | |
| scanner = MyScanner(input, output, defsoutput) | |
| scanner.scan() | |
| scanner.close() | |
| print "=== Testing definitions output code ===" | |
| execfile(defsoutput, {}, {}) | |
| print "=== Done scanning and generating, now doing 'import ctlsupport' ===" | |
| import ctlsupport | |
| print "=== Done. It's up to you to compile Ctlmodule.c ===" | |
| class MyScanner(Scanner): | |
| def destination(self, type, name, arglist): | |
| classname = "Function" | |
| listname = "functions" | |
| if arglist: | |
| t, n, m = arglist[0] | |
| if t in ("ControlHandle", "ControlRef") and m == "InMode": | |
| classname = "Method" | |
| listname = "methods" | |
| return classname, listname | |
| def writeinitialdefs(self): | |
| self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n") | |
| self.defsfile.write("from Carbon.TextEdit import *\n") | |
| self.defsfile.write("from Carbon.QuickDraw import *\n") | |
| self.defsfile.write("from Carbon.Dragconst import *\n") | |
| self.defsfile.write("from Carbon.CarbonEvents import *\n") | |
| self.defsfile.write("from Carbon.Appearance import *\n") | |
| self.defsfile.write("kDataBrowserItemAnyState = -1\n") | |
| self.defsfile.write("kControlBevelButtonCenterPopupGlyphTag = -1\n") | |
| self.defsfile.write("kDataBrowserClientPropertyFlagsMask = 0xFF000000\n") | |
| self.defsfile.write("\n") | |
| def makeblacklistnames(self): | |
| return [ | |
| 'FindControlUnderMouse', # Generated manually, returns an existing control, not a new one. | |
| 'DisposeControl', # Generated manually | |
| 'KillControls', # Implied by close of dialog | |
| 'SetCtlAction', | |
| 'TrackControl', # Generated manually | |
| 'HandleControlClick', # Generated manually | |
| 'SetControlData', # Generated manually | |
| 'GetControlData', # Generated manually | |
| 'kControlBevelButtonCenterPopupGlyphTag', # Constant with funny definition | |
| 'kDataBrowserClientPropertyFlagsMask', # ditto | |
| 'kDataBrowserItemAnyState', # and ditto | |
| # The following are unavailable for static 68k (appearance manager) | |
| ## 'GetBevelButtonMenuValue', | |
| ## 'SetBevelButtonMenuValue', | |
| ## 'GetBevelButtonMenuHandle', | |
| ## 'SetBevelButtonTransform', | |
| 'SetBevelButtonGraphicAlignment', | |
| 'SetBevelButtonTextAlignment', | |
| 'SetBevelButtonTextPlacement', | |
| ## 'SetImageWellTransform', | |
| ## 'GetTabContentRect', | |
| ## 'SetTabEnabled', | |
| ## 'SetDisclosureTriangleLastValue', | |
| ## # Unavailable in CW Pro 3 libraries | |
| ## 'SetUpControlTextColor', | |
| ## # Unavailable in Jack's CW Pro 5.1 libraries | |
| ## 'GetControlRegion', | |
| ## 'RemoveControlProperty', | |
| ## 'IsValidControlHandle', | |
| ## 'SetControl32BitMinimum', | |
| ## 'GetControl32BitMinimum', | |
| ## 'SetControl32BitMaximum', | |
| ## 'GetControl32BitMaximum', | |
| ## 'SetControl32BitValue', | |
| ## 'GetControl32BitValue', | |
| ## 'SetControlViewSize', | |
| ## 'GetControlViewSize', | |
| # Generally Bad News | |
| 'GetControlProperty', | |
| 'SetControlProperty', | |
| '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', | |
| 'GetBevelButtonContentInfo', | |
| # OS8 only | |
| 'GetAuxiliaryControlRecord', | |
| 'SetControlColor', | |
| ] | |
| def makeblacklisttypes(self): | |
| return [ | |
| 'ProcPtr', | |
| # 'ControlActionUPP', | |
| 'Ptr', | |
| 'ControlDefSpec', # Don't know how to do this yet | |
| 'ControlDefSpec_ptr', # ditto | |
| 'Collection', # Ditto | |
| # not-yet-supported stuff in Universal Headers 3.4: | |
| 'ControlColorUPP', | |
| 'ControlKind', # XXX easy: 2-tuple containing 2 OSType's | |
| # 'ControlTabEntry_ptr', # XXX needed for tabs | |
| # 'ControlButtonContentInfoPtr', | |
| # 'ControlButtonContentInfo', # XXX ugh: a union | |
| # 'ControlButtonContentInfo_ptr', # XXX ugh: a union | |
| 'ListDefSpec_ptr', # XXX see _Listmodule.c, tricky but possible | |
| 'DataBrowserItemID_ptr', # XXX array of UInt32, for BrowserView | |
| 'DataBrowserItemUPP', | |
| 'DataBrowserItemDataRef', # XXX void * | |
| 'DataBrowserCallbacks', # difficult struct | |
| 'DataBrowserCallbacks_ptr', | |
| 'DataBrowserCustomCallbacks', | |
| 'DataBrowserCustomCallbacks_ptr', | |
| ## 'DataBrowserTableViewColumnDesc', | |
| ## 'DataBrowserListViewColumnDesc', | |
| 'CFDataRef', | |
| 'DataBrowserListViewHeaderDesc', # difficult struct | |
| ] | |
| def makerepairinstructions(self): | |
| return [ | |
| ([("void_ptr", "*", "InMode"), ("long", "*", "InMode")], | |
| [("InBuffer", "*", "*")]), | |
| ([("void", "*", "OutMode"), ("long", "*", "InMode"), | |
| ("long", "*", "OutMode")], | |
| [("VarVarOutBuffer", "*", "InOutMode")]), | |
| ## # For TrackControl | |
| ## ([("ProcPtr", "actionProc", "InMode")], | |
| ## [("FakeType('(ControlActionUPP)0')", "*", "*")]), | |
| ## ([("ControlActionUPP", "actionProc", "InMode")], | |
| ## [("FakeType('(ControlActionUPP)0')", "*", "*")]), | |
| # For GetControlTitle | |
| ([('Str255', 'title', 'InMode')], | |
| [('Str255', 'title', 'OutMode')]), | |
| ([("ControlHandle", "*", "OutMode")], | |
| [("ExistingControlHandle", "*", "*")]), | |
| ([("ControlRef", "*", "OutMode")], # Ditto, for Universal Headers | |
| [("ExistingControlHandle", "*", "*")]), | |
| ([("Rect_ptr", "*", "ReturnMode")], # GetControlBounds | |
| [("void", "*", "ReturnMode")]), | |
| ([("DataBrowserListViewColumnDesc", "*", "OutMode")], | |
| [("DataBrowserListViewColumnDesc", "*", "InMode")]), | |
| ([("ControlButtonContentInfoPtr", 'outContent', "InMode")], | |
| [("ControlButtonContentInfoPtr", '*', "OutMode")]), | |
| ([("ControlButtonContentInfo", '*', "OutMode")], | |
| [("ControlButtonContentInfo", '*', "InMode")]), | |
| ([("ControlActionUPP", 'liveTrackingProc', "InMode")], | |
| [("ControlActionUPPNewControl", 'liveTrackingProc', "InMode")]), | |
| ] | |
| if __name__ == "__main__": | |
| main() |