QuickTime support (not yet functional)
diff --git a/Mac/Lib/toolbox/QuickTime.py b/Mac/Lib/toolbox/QuickTime.py
new file mode 100644
index 0000000..f4e0259
--- /dev/null
+++ b/Mac/Lib/toolbox/QuickTime.py
@@ -0,0 +1,234 @@
+# Generated from 'Sap:CodeWarrior7:Metrowerks CodeWarrior:MacOS Support:Headers:Universal Headers:Movies.h'
+
+MovieFileType = 'MooV'
+MediaHandlerType = 'mhlr'
+DataHandlerType = 'dhlr'
+VideoMediaType = 'vide'
+SoundMediaType = 'soun'
+TextMediaType = 'text'
+BaseMediaType = 'gnrc'
+MPEGMediaType = 'MPEG'
+MusicMediaType = 'musi'
+TimeCodeMediaType = 'tmcd'
+HandleDataHandlerSubType = 'hndl'
+VisualMediaCharacteristic = 'eyes'
+AudioMediaCharacteristic = 'ears'
+DoTheRightThing = 0
+dfDontDisplay = 1 << 0
+dfDontAutoScale = 1 << 1
+dfClipToTextBox = 1 << 2
+dfUseMovieBGColor = 1 << 3
+dfShrinkTextBoxToFit = 1 << 4
+dfScrollIn = 1 << 5
+dfScrollOut = 1 << 6
+dfHorizScroll = 1 << 7
+dfReverseScroll = 1 << 8
+dfContinuousScroll = 1 << 9
+dfFlowHoriz = 1 << 10
+dfDropShadow = 1 << 12
+dfAntiAlias = 1 << 13
+dfKeyedText = 1 << 14
+dfInverseHilite = 1 << 15
+searchTextDontGoToFoundTime = 1L << 16
+searchTextDontHiliteFoundText = 1L << 17
+searchTextOneTrackOnly = 1L << 18
+searchTextEnabledTracksOnly = 1L << 19
+movieProgressOpen = 0
+movieProgressUpdatePercent = 1
+movieProgressClose = 2
+progressOpFlatten = 1
+mediaQualityDraft = 0x0000
+mediaQualityNormal = 0x0040
+mediaQualityBetter = 0x0080
+mediaQualityBest = 0x00C0
+loopTimeBase = 1
+palindromeLoopTimeBase = 2
+maintainTimeBaseZero = 4
+triggerTimeFwd = 0x0001
+triggerTimeBwd = 0x0002
+triggerTimeEither = 0x0003
+triggerRateLT = 0x0004
+triggerRateGT = 0x0008
+triggerRateEqual = 0x0010
+triggerRateChange = 0
+triggerAtStart = 0x0001
+triggerAtStop = 0x0002
+timeBaseBeforeStartTime = 1
+timeBaseAfterStopTime = 2
+callBackAtTime = 1
+callBackAtRate = 2
+callBackAtTimeJump = 3
+callBackAtExtremes = 4
+callBackAtInterrupt = 0x8000
+callBackAtDeferredTask = 0x4000
+qtcbNeedsRateChanges = 1
+qtcbNeedsTimeChanges = 2
+qtcbNeedsStartStopChanges = 4
+keepInRam = 1 << 0
+unkeepInRam = 1 << 1
+flushFromRam = 1 << 2
+loadForwardTrackEdits = 1 << 3
+loadBackwardTrackEdits = 1 << 4
+newMovieActive = 1 << 0
+newMovieDontResolveDataRefs = 1 << 1
+newMovieDontAskUnresolvedDataRefs = 1 << 2
+newMovieDontAutoAlternates = 1 << 3
+trackUsageInMovie = 1 << 1
+trackUsageInPreview = 1 << 2
+trackUsageInPoster = 1 << 3
+mediaSampleNotSync = 1 << 0
+mediaSampleShadowSync = 1 << 1
+pasteInParallel = 1
+showUserSettingsDialog = 2
+movieToFileOnlyExport = 4
+nextTimeMediaSample = 1 << 0
+nextTimeMediaEdit = 1 << 1
+nextTimeTrackEdit = 1 << 2
+nextTimeSyncSample = 1 << 3
+nextTimeEdgeOK = 1 << 14
+nextTimeIgnoreActiveSegment = 1 << 15
+createMovieFileDeleteCurFile = 1L << 31
+createMovieFileDontCreateMovie = 1L << 30
+createMovieFileDontOpenFile = 1L << 29
+flattenAddMovieToDataFork = 1L << 0
+flattenActiveTracksOnly = 1L << 2
+flattenDontInterleaveFlatten = 1L << 3
+movieInDataForkResID = -1
+mcTopLeftMovie = 1 << 0
+mcScaleMovieToFit = 1 << 1
+mcWithBadge = 1 << 2
+mcNotVisible = 1 << 3
+mcWithFrame = 1 << 4
+movieScrapDontZeroScrap = 1 << 0
+movieScrapOnlyPutMovie = 1 << 1
+dataRefSelfReference = 1 << 0
+dataRefWasNotResolved = 1 << 1
+hintsScrubMode = 1 << 0
+hintsLoop = 1 << 1
+hintsDontPurge = 1 << 2
+hintsUseScreenBuffer = 1 << 5
+hintsAllowInterlace = 1 << 6
+hintsUseSoundInterp = 1 << 7
+hintsHighQuality = 1 << 8
+hintsPalindrome = 1 << 9
+hintsInactive = 1 << 11
+mediaHandlerFlagBaseClient = 1
+movieTrackMediaType = 1 << 0
+movieTrackCharacteristic = 1 << 1
+movieTrackEnabledOnly = 1 << 2
+movieDrawingCallWhenChanged = 0
+movieDrawingCallAlways = 1
+txtProcDefaultDisplay = 0
+txtProcDontDisplay = 1
+txtProcDoDisplay = 2
+findTextEdgeOK = 1 << 0
+findTextCaseSensitive = 1 << 1
+findTextReverseSearch = 1 << 2
+findTextWrapAround = 1 << 3
+findTextUseOffset = 1 << 4
+dropShadowOffsetType = 'drpo'
+dropShadowTranslucencyType = 'drpt'
+preloadAlways = 1L << 0
+preloadOnlyIfEnabled = 1L << 1
+MovieControllerComponentType = 'play'
+mcActionIdle = 1
+mcActionDraw = 2
+mcActionActivate = 3
+mcActionDeactivate = 4
+mcActionMouseDown = 5
+mcActionKey = 6
+mcActionPlay = 8
+mcActionGoToTime = 12
+mcActionSetVolume = 14
+mcActionGetVolume = 15
+mcActionStep = 18
+mcActionSetLooping = 21
+mcActionGetLooping = 22
+mcActionSetLoopIsPalindrome = 23
+mcActionGetLoopIsPalindrome = 24
+mcActionSetGrowBoxBounds = 25
+mcActionControllerSizeChanged = 26
+mcActionSetSelectionBegin = 29
+mcActionSetSelectionDuration = 30
+mcActionSetKeysEnabled = 32
+mcActionGetKeysEnabled = 33
+mcActionSetPlaySelection = 34
+mcActionGetPlaySelection = 35
+mcActionSetUseBadge = 36
+mcActionGetUseBadge = 37
+mcActionSetFlags = 38
+mcActionGetFlags = 39
+mcActionSetPlayEveryFrame = 40
+mcActionGetPlayEveryFrame = 41
+mcActionGetPlayRate = 42
+mcActionShowBalloon = 43
+mcActionBadgeClick = 44
+mcActionMovieClick = 45
+mcActionSuspend = 46
+mcActionResume = 47
+mcActionSetControllerKeysEnabled = 48
+mcActionGetTimeSliderRect = 49
+mcActionMovieEdited = 50
+mcActionGetDragEnabled = 51
+mcActionSetDragEnabled = 52
+mcFlagSuppressMovieFrame = 1 << 0
+mcFlagSuppressStepButtons = 1 << 1
+mcFlagSuppressSpeakerButton = 1 << 2
+mcFlagsUseWindowPalette = 1 << 3
+mcFlagsDontInvalidate = 1 << 4
+mcPositionDontInvalidate = 1 << 5
+mcInfoUndoAvailable = 1 << 0
+mcInfoCutAvailable = 1 << 1
+mcInfoCopyAvailable = 1 << 2
+mcInfoPasteAvailable = 1 << 3
+mcInfoClearAvailable = 1 << 4
+mcInfoHasSound = 1 << 5
+mcInfoIsPlaying = 1 << 6
+mcInfoIsLooping = 1 << 7
+mcInfoIsInPalindrome = 1 << 8
+mcInfoEditingEnabled = 1 << 9
+mcMenuUndo = 1
+mcMenuCut = 3
+mcMenuCopy = 4
+mcMenuPaste = 5
+mcMenuClear = 6
+kMCSetMovieSelect = 0x2
+kMCGetIndMovieSelect = 0x5
+kMCRemoveMovieSelect = 0x6
+kMCIsPlayerEventSelect = 0x7
+kMCSetActionFilterSelect = 0x8
+kMCDoActionSelect = 0x9
+kMCSetControllerAttachedSelect = 0xA
+kMCIsControllerAttachedSelect = 0xB
+kMCSetControllerPortSelect = 0xC
+kMCGetControllerPortSelect = 0xD
+kMCSetVisibleSelect = 0xE
+kMCGetVisibleSelect = 0xF
+kMCGetControllerBoundsRectSelect = 0x10
+kMCSetControllerBoundsRectSelect = 0x11
+kMCGetControllerBoundsRgnSelect = 0x12
+kMCGetWindowRgnSelect = 0x13
+kMCMovieChangedSelect = 0x14
+kMCSetDurationSelect = 0x15
+kMCGetCurrentTimeSelect = 0x16
+kMCNewAttachedControllerSelect = 0x17
+kMCDrawSelect = 0x18
+kMCActivateSelect = 0x19
+kMCIdleSelect = 0x1A
+kMCKeySelect = 0x1B
+kMCClickSelect = 0x1C
+kMCEnableEditingSelect = 0x1D
+kMCIsEditingEnabledSelect = 0x1E
+kMCCopySelect = 0x1F
+kMCCutSelect = 0x20
+kMCPasteSelect = 0x21
+kMCClearSelect = 0x22
+kMCUndoSelect = 0x23
+kMCPositionControllerSelect = 0x24
+kMCGetControllerInfoSelect = 0x25
+kMCSetClipSelect = 0x28
+kMCGetClipSelect = 0x29
+kMCDrawBadgeSelect = 0x2A
+kMCSetUpEditMenuSelect = 0x2B
+kMCGetMenuStringSelect = 0x2C
+kMCSetActionFilterWithRefConSelect = 0x2D
diff --git a/Mac/Modules/qt/qtgen.py b/Mac/Modules/qt/qtgen.py
new file mode 100644
index 0000000..5b9e5a7
--- /dev/null
+++ b/Mac/Modules/qt/qtgen.py
@@ -0,0 +1,949 @@
+# Generated from 'Sap:CodeWarrior7:Metrowerks CodeWarrior:MacOS Support:Headers:Universal Headers:Movies.h'
+
+f = Function(OSErr, 'EnterMovies',
+)
+functions.append(f)
+
+f = Function(void, 'ExitMovies',
+)
+functions.append(f)
+
+f = Function(OSErr, 'GetMoviesError',
+)
+functions.append(f)
+
+f = Function(void, 'ClearMoviesStickyError',
+)
+functions.append(f)
+
+f = Function(OSErr, 'GetMoviesStickyError',
+)
+functions.append(f)
+
+f = Method(void, 'MoviesTask',
+    (Movie, 'theMovie', InMode),
+    (long, 'maxMilliSecToUse', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'PrerollMovie',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'time', InMode),
+    (Fixed, 'Rate', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'LoadMovieIntoRam',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'time', InMode),
+    (TimeValue, 'duration', InMode),
+    (long, 'flags', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieActive',
+    (Movie, 'theMovie', InMode),
+    (Boolean, 'active', InMode),
+)
+methods.append(f)
+
+f = Method(Boolean, 'GetMovieActive',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'StartMovie',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'StopMovie',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GoToBeginningOfMovie',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GoToEndOfMovie',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(Boolean, 'IsMovieDone',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(Boolean, 'GetMoviePreviewMode',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMoviePreviewMode',
+    (Movie, 'theMovie', InMode),
+    (Boolean, 'usePreview', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'ShowMoviePoster',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(PicHandle, 'GetMoviePict',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'time', InMode),
+)
+methods.append(f)
+
+f = Method(PicHandle, 'GetMoviePosterPict',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'UpdateMovie',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetMovieBox',
+    (Movie, 'theMovie', InMode),
+    (Rect, 'boxRect', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieBox',
+    (Movie, 'theMovie', InMode),
+    (Rect_ptr, 'boxRect', InMode),
+)
+methods.append(f)
+
+f = Method(RgnHandle, 'GetMovieDisplayClipRgn',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieDisplayClipRgn',
+    (Movie, 'theMovie', InMode),
+    (RgnHandle, 'theClip', InMode),
+)
+methods.append(f)
+
+f = Method(RgnHandle, 'GetMovieClipRgn',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieClipRgn',
+    (Movie, 'theMovie', InMode),
+    (RgnHandle, 'theClip', InMode),
+)
+methods.append(f)
+
+f = Method(RgnHandle, 'GetMovieDisplayBoundsRgn',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(RgnHandle, 'GetMovieBoundsRgn',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Function(Movie, 'NewMovie',
+    (long, 'flags', InMode),
+)
+functions.append(f)
+
+f = Method(OSErr, 'PutMovieIntoHandle',
+    (Movie, 'theMovie', InMode),
+    (Handle, 'publicMovie', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'PutMovieIntoDataFork',
+    (Movie, 'theMovie', InMode),
+    (short, 'fRefNum', InMode),
+    (long, 'offset', InMode),
+    (long, 'maxSize', InMode),
+)
+methods.append(f)
+
+f = Method(TimeScale, 'GetMovieTimeScale',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieTimeScale',
+    (Movie, 'theMovie', InMode),
+    (TimeScale, 'timeScale', InMode),
+)
+methods.append(f)
+
+f = Method(TimeValue, 'GetMovieDuration',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(Fixed, 'GetMovieRate',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieRate',
+    (Movie, 'theMovie', InMode),
+    (Fixed, 'rate', InMode),
+)
+methods.append(f)
+
+f = Method(Fixed, 'GetMoviePreferredRate',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMoviePreferredRate',
+    (Movie, 'theMovie', InMode),
+    (Fixed, 'rate', InMode),
+)
+methods.append(f)
+
+f = Method(short, 'GetMoviePreferredVolume',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMoviePreferredVolume',
+    (Movie, 'theMovie', InMode),
+    (short, 'volume', InMode),
+)
+methods.append(f)
+
+f = Method(short, 'GetMovieVolume',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieVolume',
+    (Movie, 'theMovie', InMode),
+    (short, 'volume', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetMoviePreviewTime',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'previewTime', OutMode),
+    (TimeValue, 'previewDuration', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMoviePreviewTime',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'previewTime', InMode),
+    (TimeValue, 'previewDuration', InMode),
+)
+methods.append(f)
+
+f = Method(TimeValue, 'GetMoviePosterTime',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMoviePosterTime',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'posterTime', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetMovieSelection',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'selectionTime', OutMode),
+    (TimeValue, 'selectionDuration', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieSelection',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'selectionTime', InMode),
+    (TimeValue, 'selectionDuration', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieActiveSegment',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'startTime', InMode),
+    (TimeValue, 'duration', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetMovieActiveSegment',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'startTime', OutMode),
+    (TimeValue, 'duration', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieTimeValue',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'newtime', InMode),
+)
+methods.append(f)
+
+f = Method(long, 'GetMovieTrackCount',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetAutoTrackAlternatesEnabled',
+    (Movie, 'theMovie', InMode),
+    (Boolean, 'enable', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SelectMovieAlternates',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'InsertMovieSegment',
+    (Movie, 'srcMovie', InMode),
+    (Movie, 'dstMovie', InMode),
+    (TimeValue, 'srcIn', InMode),
+    (TimeValue, 'srcDuration', InMode),
+    (TimeValue, 'dstIn', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'InsertEmptyMovieSegment',
+    (Movie, 'dstMovie', InMode),
+    (TimeValue, 'dstIn', InMode),
+    (TimeValue, 'dstDuration', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'DeleteMovieSegment',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'startTime', InMode),
+    (TimeValue, 'duration', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'ScaleMovieSegment',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'startTime', InMode),
+    (TimeValue, 'oldDuration', InMode),
+    (TimeValue, 'newDuration', InMode),
+)
+methods.append(f)
+
+f = Method(Movie, 'CutMovieSelection',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(Movie, 'CopyMovieSelection',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'PasteMovieSelection',
+    (Movie, 'theMovie', InMode),
+    (Movie, 'src', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'AddMovieSelection',
+    (Movie, 'theMovie', InMode),
+    (Movie, 'src', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'ClearMovieSelection',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Function(OSErr, 'PasteHandleIntoMovie',
+    (Handle, 'h', InMode),
+    (OSType, 'handleType', InMode),
+    (Movie, 'theMovie', InMode),
+    (long, 'flags', InMode),
+    (ComponentInstance, 'userComp', InMode),
+)
+functions.append(f)
+
+f = Method(OSErr, 'CopyMovieSettings',
+    (Movie, 'srcMovie', InMode),
+    (Movie, 'dstMovie', InMode),
+)
+methods.append(f)
+
+f = Method(long, 'GetMovieDataSize',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'startTime', InMode),
+    (TimeValue, 'duration', InMode),
+)
+methods.append(f)
+
+f = Method(Boolean, 'PtInMovie',
+    (Movie, 'theMovie', InMode),
+    (Point, 'pt', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetMovieLanguage',
+    (Movie, 'theMovie', InMode),
+    (long, 'language', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetMovieNextInterestingTime',
+    (Movie, 'theMovie', InMode),
+    (short, 'interestingTimeFlags', InMode),
+    (short, 'numMediaTypes', InMode),
+    (OSType_ptr, 'whichMediaTypes', InMode),
+    (TimeValue, 'time', InMode),
+    (Fixed, 'rate', InMode),
+    (TimeValue, 'interestingTime', OutMode),
+    (TimeValue, 'interestingDuration', OutMode),
+)
+methods.append(f)
+
+f = Function(OSErr, 'CreateMovieFile',
+    (FSSpec_ptr, 'fileSpec', InMode),
+    (OSType, 'creator', InMode),
+    (ScriptCode, 'scriptTag', InMode),
+    (long, 'createMovieFileFlags', InMode),
+    (short, 'resRefNum', OutMode),
+    (Movie, 'newmovie', OutMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'OpenMovieFile',
+    (FSSpec_ptr, 'fileSpec', InMode),
+    (short, 'resRefNum', OutMode),
+    (SInt8, 'permission', InMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'CloseMovieFile',
+    (short, 'resRefNum', InMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'DeleteMovieFile',
+    (FSSpec_ptr, 'fileSpec', InMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'NewMovieFromFile',
+    (Movie, 'theMovie', OutMode),
+    (short, 'resRefNum', InMode),
+    (short, 'resId', OutMode),
+    (StringPtr, 'resName', InMode),
+    (short, 'newMovieFlags', InMode),
+    (Boolean, 'dataRefWasChanged', OutMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'NewMovieFromHandle',
+    (Movie, 'theMovie', OutMode),
+    (Handle, 'h', InMode),
+    (short, 'newMovieFlags', InMode),
+    (Boolean, 'dataRefWasChanged', OutMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'NewMovieFromDataFork',
+    (Movie, 'theMovie', OutMode),
+    (short, 'fRefNum', InMode),
+    (long, 'fileOffset', InMode),
+    (short, 'newMovieFlags', InMode),
+    (Boolean, 'dataRefWasChanged', OutMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'NewMovieFromUserProc',
+    (Movie, 'm', OutMode),
+    (short, 'flags', InMode),
+    (Boolean, 'dataRefWasChanged', OutMode),
+    (GetMovieUPP, 'getProc', InMode),
+    (void, 'refCon', OutMode),
+    (Handle, 'defaultDataRef', InMode),
+    (OSType, 'dataRefType', InMode),
+)
+functions.append(f)
+
+f = Method(OSErr, 'AddMovieResource',
+    (Movie, 'theMovie', InMode),
+    (short, 'resRefNum', InMode),
+    (short, 'resId', OutMode),
+    (ConstStr255Param, 'resName', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'UpdateMovieResource',
+    (Movie, 'theMovie', InMode),
+    (short, 'resRefNum', InMode),
+    (short, 'resId', InMode),
+    (ConstStr255Param, 'resName', InMode),
+)
+methods.append(f)
+
+f = Function(OSErr, 'RemoveMovieResource',
+    (short, 'resRefNum', InMode),
+    (short, 'resId', InMode),
+)
+functions.append(f)
+
+f = Method(Boolean, 'HasMovieChanged',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'ClearMovieChanged',
+    (Movie, 'theMovie', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'SetMovieDefaultDataRef',
+    (Movie, 'theMovie', InMode),
+    (Handle, 'dataRef', InMode),
+    (OSType, 'dataRefType', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'GetMovieDefaultDataRef',
+    (Movie, 'theMovie', InMode),
+    (Handle, 'dataRef', OutMode),
+    (OSType, 'dataRefType', OutMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'SetMovieColorTable',
+    (Movie, 'theMovie', InMode),
+    (CTabHandle, 'ctab', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'GetMovieColorTable',
+    (Movie, 'theMovie', InMode),
+    (CTabHandle, 'ctab', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'FlattenMovie',
+    (Movie, 'theMovie', InMode),
+    (long, 'movieFlattenFlags', InMode),
+    (FSSpec_ptr, 'theFile', InMode),
+    (OSType, 'creator', InMode),
+    (ScriptCode, 'scriptTag', InMode),
+    (long, 'createMovieFileFlags', InMode),
+    (short, 'resId', OutMode),
+    (ConstStr255Param, 'resName', InMode),
+)
+methods.append(f)
+
+f = Method(Movie, 'FlattenMovieData',
+    (Movie, 'theMovie', InMode),
+    (long, 'movieFlattenFlags', InMode),
+    (FSSpec_ptr, 'theFile', InMode),
+    (OSType, 'creator', InMode),
+    (ScriptCode, 'scriptTag', InMode),
+    (long, 'createMovieFileFlags', InMode),
+)
+methods.append(f)
+
+f = Function(HandlerError, 'GetVideoMediaGraphicsMode',
+    (MediaHandler, 'mh', InMode),
+    (long, 'graphicsMode', OutMode),
+    (RGBColor, 'opColor', OutMode),
+)
+functions.append(f)
+
+f = Function(HandlerError, 'SetVideoMediaGraphicsMode',
+    (MediaHandler, 'mh', InMode),
+    (long, 'graphicsMode', InMode),
+    (RGBColor_ptr, 'opColor', InMode),
+)
+functions.append(f)
+
+f = Function(HandlerError, 'GetSoundMediaBalance',
+    (MediaHandler, 'mh', InMode),
+    (short, 'balance', OutMode),
+)
+functions.append(f)
+
+f = Function(HandlerError, 'SetSoundMediaBalance',
+    (MediaHandler, 'mh', InMode),
+    (short, 'balance', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'AddTextSample',
+    (MediaHandler, 'mh', InMode),
+    (Ptr, 'text', InMode),
+    (unsigned_long, 'size', InMode),
+    (short, 'fontNumber', InMode),
+    (short, 'fontSize', InMode),
+    (short, 'textFace', InMode),
+    (RGBColor, 'textColor', OutMode),
+    (RGBColor, 'backColor', OutMode),
+    (short, 'textJustification', InMode),
+    (Rect, 'textBox', OutMode),
+    (long, 'displayFlags', InMode),
+    (TimeValue, 'scrollDelay', InMode),
+    (short, 'hiliteStart', InMode),
+    (short, 'hiliteEnd', InMode),
+    (RGBColor, 'rgbHiliteColor', OutMode),
+    (TimeValue, 'duration', InMode),
+    (TimeValue, 'sampleTime', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'AddTESample',
+    (MediaHandler, 'mh', InMode),
+    (TEHandle, 'hTE', InMode),
+    (RGBColor, 'backColor', OutMode),
+    (short, 'textJustification', InMode),
+    (Rect, 'textBox', OutMode),
+    (long, 'displayFlags', InMode),
+    (TimeValue, 'scrollDelay', InMode),
+    (short, 'hiliteStart', InMode),
+    (short, 'hiliteEnd', InMode),
+    (RGBColor, 'rgbHiliteColor', OutMode),
+    (TimeValue, 'duration', InMode),
+    (TimeValue, 'sampleTime', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'AddHiliteSample',
+    (MediaHandler, 'mh', InMode),
+    (short, 'hiliteStart', InMode),
+    (short, 'hiliteEnd', InMode),
+    (RGBColor, 'rgbHiliteColor', OutMode),
+    (TimeValue, 'duration', InMode),
+    (TimeValue, 'sampleTime', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'FindNextText',
+    (MediaHandler, 'mh', InMode),
+    (Ptr, 'text', InMode),
+    (long, 'size', InMode),
+    (short, 'findFlags', InMode),
+    (TimeValue, 'startTime', InMode),
+    (TimeValue, 'foundTime', OutMode),
+    (TimeValue, 'foundDuration', OutMode),
+    (long, 'offset', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'HiliteTextSample',
+    (MediaHandler, 'mh', InMode),
+    (TimeValue, 'sampleTime', InMode),
+    (short, 'hiliteStart', InMode),
+    (short, 'hiliteEnd', InMode),
+    (RGBColor, 'rgbHiliteColor', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'SetTextSampleData',
+    (MediaHandler, 'mh', InMode),
+    (void, 'data', OutMode),
+    (OSType, 'dataType', InMode),
+)
+functions.append(f)
+
+f = Method(void, 'GetPosterBox',
+    (Movie, 'theMovie', InMode),
+    (Rect, 'boxRect', OutMode),
+)
+methods.append(f)
+
+f = Method(void, 'SetPosterBox',
+    (Movie, 'theMovie', InMode),
+    (Rect_ptr, 'boxRect', InMode),
+)
+methods.append(f)
+
+f = Method(RgnHandle, 'GetMovieSegmentDisplayBoundsRgn',
+    (Movie, 'theMovie', InMode),
+    (TimeValue, 'time', InMode),
+    (TimeValue, 'duration', InMode),
+)
+methods.append(f)
+
+f = Method(ComponentInstance, 'NewMovieController',
+    (Movie, 'theMovie', InMode),
+    (Rect_ptr, 'movieRect', InMode),
+    (long, 'someFlags', InMode),
+)
+methods.append(f)
+
+f = Function(void, 'DisposeMovieController',
+    (ComponentInstance, 'mc', InMode),
+)
+functions.append(f)
+
+f = Method(void, 'ShowMovieInformation',
+    (Movie, 'theMovie', InMode),
+    (ModalFilterUPP, 'filterProc', InMode),
+    (long, 'refCon', InMode),
+)
+methods.append(f)
+
+f = Method(OSErr, 'PutMovieOnScrap',
+    (Movie, 'theMovie', InMode),
+    (long, 'movieScrapFlags', InMode),
+)
+methods.append(f)
+
+f = Function(Movie, 'NewMovieFromScrap',
+    (long, 'newMovieFlags', InMode),
+)
+functions.append(f)
+
+f = Method(void, 'SetMoviePlayHints',
+    (Movie, 'theMovie', InMode),
+    (long, 'flags', InMode),
+    (long, 'flagsMask', InMode),
+)
+methods.append(f)
+
+f = Function(ComponentResult, 'MCSetMovie',
+    (MovieController, 'mc', InMode),
+    (Movie, 'theMovie', InMode),
+    (WindowPtr, 'movieWindow', InMode),
+    (Point, 'where', InMode),
+)
+functions.append(f)
+
+f = Function(Movie, 'MCGetIndMovie',
+    (MovieController, 'mc', InMode),
+    (short, 'index', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCRemoveMovie',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCIsPlayerEvent',
+    (MovieController, 'mc', InMode),
+    (EventRecord_ptr, 'e', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCDoAction',
+    (MovieController, 'mc', InMode),
+    (short, 'action', InMode),
+    (void, 'params', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetControllerAttached',
+    (MovieController, 'mc', InMode),
+    (Boolean, 'attach', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCIsControllerAttached',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetVisible',
+    (MovieController, 'mc', InMode),
+    (Boolean, 'visible', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCGetVisible',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCGetControllerBoundsRect',
+    (MovieController, 'mc', InMode),
+    (Rect, 'bounds', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetControllerBoundsRect',
+    (MovieController, 'mc', InMode),
+    (Rect_ptr, 'bounds', InMode),
+)
+functions.append(f)
+
+f = Function(RgnHandle, 'MCGetControllerBoundsRgn',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(RgnHandle, 'MCGetWindowRgn',
+    (MovieController, 'mc', InMode),
+    (WindowPtr, 'w', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCMovieChanged',
+    (MovieController, 'mc', InMode),
+    (Movie, 'm', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetDuration',
+    (MovieController, 'mc', InMode),
+    (TimeValue, 'duration', InMode),
+)
+functions.append(f)
+
+f = Function(TimeValue, 'MCGetCurrentTime',
+    (MovieController, 'mc', InMode),
+    (TimeScale, 'scale', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCNewAttachedController',
+    (MovieController, 'mc', InMode),
+    (Movie, 'theMovie', InMode),
+    (WindowPtr, 'w', InMode),
+    (Point, 'where', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCDraw',
+    (MovieController, 'mc', InMode),
+    (WindowPtr, 'w', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCActivate',
+    (MovieController, 'mc', InMode),
+    (WindowPtr, 'w', InMode),
+    (Boolean, 'activate', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCIdle',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCKey',
+    (MovieController, 'mc', InMode),
+    (SInt8, 'key', InMode),
+    (long, 'modifiers', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCClick',
+    (MovieController, 'mc', InMode),
+    (WindowPtr, 'w', InMode),
+    (Point, 'where', InMode),
+    (long, 'when', InMode),
+    (long, 'modifiers', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCEnableEditing',
+    (MovieController, 'mc', InMode),
+    (Boolean, 'enabled', InMode),
+)
+functions.append(f)
+
+f = Function(long, 'MCIsEditingEnabled',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(Movie, 'MCCopy',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(Movie, 'MCCut',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCPaste',
+    (MovieController, 'mc', InMode),
+    (Movie, 'srcMovie', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCClear',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCUndo',
+    (MovieController, 'mc', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCPositionController',
+    (MovieController, 'mc', InMode),
+    (Rect_ptr, 'movieRect', InMode),
+    (Rect_ptr, 'controllerRect', InMode),
+    (long, 'someFlags', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCGetControllerInfo',
+    (MovieController, 'mc', InMode),
+    (long, 'someFlags', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetClip',
+    (MovieController, 'mc', InMode),
+    (RgnHandle, 'theClip', InMode),
+    (RgnHandle, 'movieClip', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCGetClip',
+    (MovieController, 'mc', InMode),
+    (RgnHandle, 'theClip', OutMode),
+    (RgnHandle, 'movieClip', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCDrawBadge',
+    (MovieController, 'mc', InMode),
+    (RgnHandle, 'movieRgn', InMode),
+    (RgnHandle, 'badgeRgn', OutMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCSetUpEditMenu',
+    (MovieController, 'mc', InMode),
+    (long, 'modifiers', InMode),
+    (MenuHandle, 'mh', InMode),
+)
+functions.append(f)
+
+f = Function(ComponentResult, 'MCGetMenuString',
+    (MovieController, 'mc', InMode),
+    (long, 'modifiers', InMode),
+    (short, 'item', InMode),
+    (Str255, 'aString', InMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'QueueSyncTask',
+    (QTSyncTaskPtr, 'task', InMode),
+)
+functions.append(f)
+
+f = Function(OSErr, 'DequeueSyncTask',
+    (QTSyncTaskPtr, 'qElem', InMode),
+)
+functions.append(f)
+
diff --git a/Mac/Modules/qt/qtscan.py b/Mac/Modules/qt/qtscan.py
new file mode 100644
index 0000000..4a715d6
--- /dev/null
+++ b/Mac/Modules/qt/qtscan.py
@@ -0,0 +1,78 @@
+# Scan an Apple header file, generating a Python file of generator calls.
+
+import addpack
+addpack.addpack(':tools:bgen:bgen')
+from scantools import Scanner
+
+LONG = "QuickTime"
+SHORT = "qt"
+OBJECT = "Movie"
+
+def main():
+	input = "Movies.h"
+	output = SHORT + "gen.py"
+	defsoutput = LONG + ".py"
+	scanner = MyScanner(input, output, defsoutput)
+	scanner.scan()
+	scanner.close()
+	print "=== Done scanning and generating, now importing the generated code... ==="
+	exec "import " + SHORT + "support"
+	print "=== Done.  It's up to you to compile it now! ==="
+
+class MyScanner(Scanner):
+
+	def destination(self, type, name, arglist):
+		classname = "Function"
+		listname = "functions"
+		if arglist:
+			t, n, m = arglist[0]
+			if t == OBJECT and m == "InMode":
+				classname = "Method"
+				listname = "methods"
+		return classname, listname
+
+	def makeblacklistnames(self):
+		return [
+			"DisposeMovie",		# Done on python-object disposal
+			"GetMovieCreationTime",	# type "unsigned long" in C, inparseable
+			"GetMovieModificationTime",	# Ditto
+			]
+
+	def makeblacklisttypes(self):
+		return [
+			"MoviesErrorUPP",
+			"Track",	# XXXX To be done in the future
+			"Media",
+			"UserData",
+			"TimeBase",
+			"QTCallBack",
+			"Component",
+			"TimeRecord",
+			"TimeRecord_ptr",
+			"TrackEditState",
+			"MovieEditState",
+			"MoviePreviewCallOutUPP",
+			"CGrafPtr",
+			"GDHandle",
+			"MovieDrawingCompleteUPP",
+			"PixMapHandle",
+			"MatrixRecord",
+			"MatrixRecord_ptr",
+			"QTCallBackUPP",
+			"TextMediaUPP",
+			"MovieProgressUPP",
+			"MovieRgnCoverUPP",
+			"MCActionFilterUPP",
+			"MCActionFilterWithRefConUPP",
+			"SampleDescription",
+			"SoundDescription",
+			"TextDescription",
+			"MusicDescription",
+			]
+
+	def makerepairinstructions(self):
+		return [
+			]
+			
+if __name__ == "__main__":
+	main()
diff --git a/Mac/Modules/qt/qtsupport.py b/Mac/Modules/qt/qtsupport.py
new file mode 100644
index 0000000..5c29b75
--- /dev/null
+++ b/Mac/Modules/qt/qtsupport.py
@@ -0,0 +1,79 @@
+# 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 = 'Movies.h'		# The Apple header file
+MODNAME = 'qt'				# The name of the module
+OBJECTNAME = 'Movie'			# The basic name of the objects used here
+
+# The following is *usually* unchanged but may still require tuning
+MODPREFIX = MODNAME			# The prefix for module-wide routines
+OBJECTTYPE = "Movie"		# 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
+OUTPUTFILE = MODNAME + "module.c"	# The file generated by this program
+
+from macsupport import *
+
+# Create the type objects
+
+includestuff = includestuff + """
+#include <%s>""" % MACHEADERFILE + """
+"""
+
+Movie = OpaqueByValueType(OBJECTTYPE, OBJECTPREFIX)
+TimeValue = Type("TimeValue", "l")
+TimeScale = Type("TimeScale", "l")
+TimeBaseFlags = Type("TimeBaseFlags", "l")
+QTCallBackFlags = Type("QTCallBackFlags", "h")
+TimeBaseStatus = Type("TimeBaseStatus", "l")
+QTCallBackType = Type("QTCallBackType", "h")
+nextTimeFlagsEnum = Type("nextTimeFlagsEnum", "h")
+createMovieFileFlagsEnum = Type("createMovieFileFlagsEnum", "l")
+movieFlattenFlagsEnum = Type("movieFlattenFlagsEnum", "l")
+dataRefAttributesFlags = Type("dataRefAttributesFlags", "l")
+playHintsEnum = Type("playHintsEnum", "l")
+mediaHandlerFlagsEnum = Type("mediaHandlerFlagsEnum", "l")
+
+RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
+PicHandle = OpaqueByValueType("PicHandle", "ResObj")
+
+
+class MyObjectDefinition(GlobalObjectDefinition):
+	def outputCheckNewArg(self):
+		Output("""if (itself == NULL) {
+					PyErr_SetString(Qt_Error,"Cannot create null Movie");
+					return NULL;
+				}""")
+	def outputFreeIt(self, itselfname):
+		Output("DisposeMovie(%s);", itselfname)
+
+# From here on it's basically all boiler plate...
+
+# 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
+Function = FunctionGenerator
+Method = MethodGenerator
+
+# Create and populate the lists
+functions = []
+methods = []
+execfile(INPUTFILE)
+
+# add the populated lists to the generator groups
+# (in a different wordl the scan program would generate this)
+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()
+