|
Volume Number: | 7 | |
Issue Number: | 1 | |
Column Tag: | Pascal Procedures |
Related Info: Window Manager
Project X: Configurable Window
By Rod Magnuson, Lincoln, NE
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
[Rod Magnuson: Has been programming the Macintosh for 2 1/2 years. Founded MindVision software with Steve Kiene in early 1988. Co-author of Elaborate!, a HyperCard XCMD that adds extensive reporting abilities to HyperCard. Worked on the development team of Chroma-32, a scanning application that allows color scans to be scanned on a grey-scale scanner. Currently working with Steve Kiene on Power Pack Vol. #1, a forth coming INIT package.]
WHAT IS IT?
Project X is a small, quick and dirty application that illustrates an idea for Macintosh windows. The window in the application is user configurable; that is: the user can move the go-away box, title bar, zoom box, content area, scrollbars, and grow box by holding down the command key and dragging it where the user wants. The window part will then move when the window is dragged in the same corresponding position to the rest of the window parts. The idea belongs to Scott Boyd; I am not sure that he imagined what I have come up with, but he did originally think of a customizable window definition. Sorry Scott, it is not a WDEF, but it does illustrate the idea.
The code is not important and most-likely has bugs, it was written as quickly as my mind could think and my fingers could type; it was one of those applications that you really could not justify spending large amounts of time on because you couldn’t get anything out of it, and, therefore, you wrote it as quickly as possible. What is important about this application is the idea!
Original window
Customized window
UTOPIA?
I will not say that this idea is perfect. It is not. It needs to be worked on and possibly trashed altogether. It is, however, a new idea that could make the Macintosh user interface more customizable.
MindVision Software
1721 Benton Street.
Lincoln, NE 68512
(402)477-3269
{--------------------------------------------------------------} Program ProjectX; USES Types, { Nothing } Errors,{ Nothing } Memory,{ Types } OSUtils, { Types } QuickDraw, { Types } Resources, { Types } SegLoad, { Types } Controls,{ QuickDraw } Events,{ QuickDraw } Fonts, { QuickDraw } Menus, { QuickDraw } TextEdit,{ QuickDraw } ToolUtils, { QuickDraw } OSEvents,{ Types, Events, OSUtils } Desk, { Types, QuickDraw, Events } Windows, { Events, Controls } Dialogs, { Windows, TextEdit } Devices, { OSUtils, Files, QuickDraw } Lists, { Controls } Packages,{ Dialogs, Files } Script;{ Packages } (* The following lines will rez, compile, link, and execute ProjectX Rez Types.r SysTypes.r Pict.r ProjectX.rsrc -rd -a -o ProjectX Pascal ProjectX.p Link ProjectX.p.o {PLibraries}PasLib.o {Libraries}Interface.o {Libraries}Runtime.o -o ProjectX ProjectX *) CONST TitleBarHeight = 19; ScrollBarWidth = 16; Lastmenu = 4; appleMenu= 1; AboutItem= 1; fileMenu = 2; QuitItem = 1; editMenu = 3; windowMenu = 4; ReAdjustItem = 1; projXwindowKind = 2000; MainWindowType = 10; TitleWindowType = 11; GoAwayWindowType= 12; ZoomBoxWindowType = 13; GrowBoxWindowType = 14; VScrollWindowType = 15; HScrollWindowType = 16; VAR theEvent : EventRecord; theChar: Char; tempWindow : WindowPtr; Doneflag : Boolean; theScreen: Rect; theItem: Integer; theMenu: Integer; ItemHit: Integer; myMenus: Array[1..Lastmenu] of MenuHandle; itype : Integer; item : Handle; box : Rect; GrowReturn : Longint; WNEExists: Boolean; { * Window vars * } theMainWindow : WindowPtr; theTitleWindow : WindowPtr; theGoAwayWindow : WindowPtr; theZoomWindow : WindowPtr; theGrowWindow : WindowPtr; theVScrollWindow: WindowPtr; theHScrollWindow: WindowPtr; MainWindowRect : Rect; GoAwayBoxWidth : Integer; ZoomBoxWidth : Integer; function MyGetNextEvent(evtMask:Integer):Boolean; forward; {--------------------------------------------------------------} Function Str(i:longInt):str255; var myStr : Str255; begin NumToString(i,myStr); Str:=myStr; end; {--------------------------------------------------------------} Function Val(s:str255):Longint; var myVal : Longint; begin StringToNum(s,myVal); Val:=myVal; end; {--------------------------------------------------------------} function GetScreenBits:Rect; type IntPtr = ^Integer; var WMGRPort : GrafPtr; begin If IntPtr($28E)^=$3FFF then GetScreenBits:=GetGDevice^^.gdRect else begin GetWMGRPort(WMGRPort); GetScreenBits:=WMGRPort^.portRect; end; end; {--------------------------------------------------------------} Procedure SetUpMenus; var i : Integer; begin InitMenus; { * Get and insert menus * } for i:=1 to Lastmenu do begin MyMenus[i]:=GetMenu(i); InsertMenu(myMenus[i],0); end; AddResMenu(MyMenus[appleMenu],’DRVR’); DrawMenuBar; end; {--------------------------------------------------------------} Procedure DoMyUpdate; var TitleOffSet: Integer; savePort : GrafPtr; thePICT: PicHandle; eRect : Rect; begin tempWindow:=WindowPtr(theEvent.message); GetPort(savePort); SetPort(tempWindow); BeginUpdate(tempWindow); with windowPeek(tempWindow)^ do If windowKind=projXwindowKind then begin EraseRect(port.portRect); If dataHandle=handle(TitleWindowType) then begin with port.portRect do begin MoveTo(left,top+3); LineTo(right,top+3); MoveTo(left,top+5); LineTo(right,top+5); MoveTo(left,top+7); LineTo(right,top+7); MoveTo(left,top+9); LineTo(right,top+9); MoveTo(left,top+11); LineTo(right,top+11); MoveTo(left,top+13); LineTo(right,top+13); TitleOffSet:=Right Div 2-TitleWidth Div 2; SetRect(eRect,left+TitleOffSet-3,top,left+TitleOffSet+titleWidth+3,bottom); EraseRect(eRect); MoveTo(left+TitleOffSet,13); HLock(handle(titleHandle)); DrawString(titleHandle^^); HunLock(handle(titleHandle)); end; end else if (dataHandle=handle(VScrollWindowType)) OR (dataHandle=handle(HScrollWindowType)) then DrawControls(tempWindow); end; EndUpdate(tempWindow); SetPort(savePort); end; {--------------------------------------------------------------} Procedure DoAbout; var SavePort : GrafPtr; Dialog : DialogPtr; begin GetPort(SavePort); Dialog:=GetNewDialog(1,Nil,Pointer(-1)); DrawDialog(Dialog); Repeat Until MyGetNextEvent(mDownMask+keyDownMask+autoKeyMask); SetPort(SavePort); DisposDialog(Dialog); end; {--------------------------------------------------------------} procedure SizeTheWindow; begin MainWindowRect:=windowPeek(theMainWindow)^.strucRgn^^.RgnBBox; with MainWindowRect do begin MoveWindow(theGoAwayWindow,left+1,top-TitleBarHeight+2,false); MoveWindow(theTitleWindow,left+GoAwayBoxWidth+1,top-TitleBarHeight+2,false); MoveWindow(theZoomWindow,right+ScrollBarWidth-2-ZoomBoxWidth,top-TitleBarHeight+2,false); MoveWindow(theVScrollWindow,right,top+1,false); MoveWindow(theGrowWindow,right,bottom,false); MoveWindow(theHScrollWindow,left+1,bottom,false); end; end; {--------------------------------------------------------------} procedure CreateNewWindow; var savePort : GrafPtr; thePict: PicHandle; bounds : Rect; theCTRL: ControlHandle; begin GetPort(savePort); { * Set up main window * } with theScreen do SetRect(bounds,left+40,top+50,right-40,bottom-40); theMainWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); with windowPeek(theMainWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(MainWindowType); end; { * Make global copy * } MainWindowRect:=windowPeek(theMainWindow)^.strucRgn^^.RgnBBox; { * Set up go away box * } thePict:=PicHandle(GetResource(‘PICT’,1002)); with thePict^^.picFrame do SetRect(bounds,0,0,right-left,bottom-top); theGoAwayWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); SetWindowPic(theGoAwayWindow,thePict); with windowPeek(theGoAwayWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(GoAwayWindowType); end; with theGoAwayWindow^.portRect do GoAwayBoxWidth:=(right-left); { * Set up zoom box * } thePict:=PicHandle(GetResource(‘PICT’,1000)); with thePict^^.picFrame do SetRect(bounds,0,0,right-left,bottom-top); theZoomWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); SetWindowPic(theZoomWindow,thePict); with windowPeek(theZoomWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(ZoomBoxWindowType); end; with theZoomWindow^.portRect do ZoomBoxWidth:=(right-left); { * Set up the title window * } with MainWindowRect do SetRect(bounds,left+GoAwayBoxWidth+1,top-TitleBarHeight+1,right-ZoomBoxWidth+ScrollBarWidth-1,top-1); theTitleWindow:=NewWindow(Nil,bounds,’Untitled’,true,plainDBox,pointer(-1),false,0); with windowPeek(theTitleWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(TitleWindowType); end; SetPort(theTitleWindow); TextFont(SystemFont); { * Set up grow box * } thePict:=PicHandle(GetResource(‘PICT’,1001)); with thePict^^.picFrame do SetRect(bounds,0,0,right-left,bottom-top); theGrowWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); SetWindowPic(theGrowWindow,thePict); with windowPeek(theGrowWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(GrowBoxWindowType); end; { * Set up the vertical scrollbar window * } with MainWindowRect do SetRect(bounds,right,top+1,right+ScrollBarWidth-2,bottom-1); theVScrollWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); with windowPeek(theVScrollWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(VScrollWindowType); end; SetPort(theVScrollWindow); ValidRect(theVScrollWindow^.portRect); bounds:=theVScrollWindow^.portRect; InsetRect(bounds,-1,-1); theCTRL:=NewControl(theVScrollWindow,bounds,’’,true,1,1,255,scrollBarProc,0); { * Set up the horizontal scrollbar window * } with MainWindowRect do SetRect(bounds,left+1,bottom,right-1,bottom+ScrollBarWidth-2); theHScrollWindow:=NewWindow(Nil,bounds,’’,true,plainDBox,pointer(-1),false,0); with windowPeek(theHScrollWindow)^ do begin windowKind:=projXwindowKind; dataHandle:=handle(HScrollWindowType); end; SetPort(theHScrollWindow); ValidRect(theHScrollWindow^.portRect); bounds:=theHScrollWindow^.portRect; InsetRect(bounds,-1,-1); theCTRL:=NewControl(theHScrollWindow,bounds,’’,true,1,1,255,scrollBarProc,0); { * Hilite the title window * } HiliteWindow(theTitleWindow,true); SizeTheWindow; SetPort(savePort); end; {--------------------------------------------------------------} Procedure DoCommand(mResult:longint); var DArefNum : Integer; DAname : Str255; begin theMenu:=HiWrd(mResult); theItem:=LoWrd(mResult); case theMenu of appleMenu: If theItem=AboutItem then DoAbout else begin GetItem(myMenus[appleMenu],theItem,DAname); DArefNum:=OpenDeskAcc(DAname); end; fileMenu: If theItem=QuitItem then DoneFlag:=true; windowMenu: Case theItem of ReAdjustItem: SizeTheWindow; end; end;{case} HiliteMenu(0); end; {--------------------------------------------------------------} procedure DragMyWindow(startingPt:Point); var AllWindowsRgn : RgnHandle; moveMent : Longint; dx,dy : Integer; begin AllWindowsRgn:=NewRgn; OpenRgn; FrameRgn(windowPeek(theMainWindow)^.strucRGN); FrameRgn(windowPeek(theTitleWindow)^.strucRGN); FrameRgn(windowPeek(theGoAwayWindow)^.strucRGN); FrameRgn(windowPeek(theZoomWindow)^.strucRGN); FrameRgn(windowPeek(theGrowWindow)^.strucRGN); FrameRgn(windowPeek(theVScrollWindow)^.strucRGN); FrameRgn(windowPeek(theHScrollWindow)^.strucRGN); CloseRgn(AllWindowsRgn); moveMent:=DragGrayRgn(AllWindowsRgn,startingPt,theScreen,theScreen,noConstraint,NIL); If Point(moveMent).h=$8000 then dx:=0 else dx:=Point(moveMent).h; If Point(moveMent).v=$8000 then dy:=0 else dy:=Point(moveMent).v; If (dx<>0) OR (dy<>0) then begin with windowPeek(theMainWindow)^.strucRGN^^.RgnBBox do MoveWindow(theMainWindow,left+dx,top+dy,false); with windowPeek(theGoAwayWindow)^.strucRGN^^.RgnBBox do MoveWindow(theGoAwayWindow,left+dx,top+dy,false); with windowPeek(theTitleWindow)^.strucRGN^^.RgnBBox do MoveWindow(theTitleWindow,left+dx,top+dy,false); with windowPeek(theZoomWindow)^.strucRGN^^.RgnBBox do MoveWindow(theZoomWindow,left+dx,top+dy,false); with windowPeek(theVScrollWindow)^.strucRGN^^.RgnBBox do MoveWindow(theVScrollWindow,left+dx,top+dy,false); with windowPeek(theGrowWindow)^.strucRGN^^.RgnBBox do MoveWindow(theGrowWindow,left+dx,top+dy,false); with windowPeek(theHScrollWindow)^.strucRGN^^.RgnBBox do MoveWindow(theHScrollWindow,left+dx,top+dy,false); end; DisposeRgn(AllWindowsRgn); end; {--------------------------------------------------------------} function CurrentWindowHit(theWindow:WindowPtr):Boolean; begin CurrentWindowHit:=((theWindow<>theMainWindow) | (theWindow<>theTitleWindow) | (theWindow<>theGoAwayWindow) | (theWindow<>theZoomWindow) | (theWindow<>theGrowWindow) | (theWindow<>theVScrollWindow) | (theWindow<>theHScrollWindow)); end; {--------------------------------------------------------------} Procedure InitGlob; const UnImplTrapNum = $9F; { * Unimplemented trap * } WaitNextEventTrapWord = $60; var theWorld : SysEnvRec; begin { * Get the world, so to speak * } If SysEnvirons(1,theWorld)<>envNotPresent then WNEExists:=(theWorld.machineType>=0) & (NGetTrapAddress( WaitNextEventTrapWord,ToolTrap)<>NGetTrapAddress(UnImplTrapNum,ToolTrap)) else WNEExists:=false; theScreen:=GetScreenBits; CreateNewWindow; end; {--------------------------------------------------------------} function MyGetNextEvent(evtMask:Integer):Boolean; begin If WNEExists then MyGetNextEvent:=WaitNextEvent(evtMask,theEvent,6,Nil) else begin SystemTask; MyGetNextEvent:=GetNextEvent(evtMask,theEvent); end; end; {--------------------------------------------------------------} procedure _DataInit;EXTERNAL; begin { * Get rid of MPW’s init code * } UnloadSeg(@_DataInit); FlushEvents(EveryEvent,0); InitGraf(@thePort); InitFonts; TEInit; InitWindows; InitDialogs(Nil); SetUpMenus; InitGlob; Repeat InitCursor; If MyGetNextEvent(everyEvent) then with theEvent do case what of mouseDown: case FindWindow(where,tempWindow) of inMenuBar: DoCommand(MenuSelect(where)); InSysWindow: SystemClick(theEvent,tempWindow); inContent: If NOT CurrentWindowHit(tempWindow) then SelectWindow(tempWindow) else if BAnd(modifiers,cmdKey)<>0 then DragWindow(tempWindow,where,GetGrayRGN^^.RGNBBox) else if tempWindow=theTitleWindow then DragMyWindow(where) else if tempWindow=theGrowWindow then begin GrowReturn:=GrowWindow(theMainWindow,where,GetGrayRGN^^.RGNBBox); SizeWindow(theMainWindow,LoWrd(GrowReturn),HiWrd(GrowReturn),true); end else if tempWindow=theGoAwayWindow then begin end else if tempWindow=theZoomWindow then begin end; inDrag: If NOT CurrentWindowHit(tempWindow) then SelectWindow(tempWindow) else If BAnd(modifiers,cmdKey)<>0 then DragWindow(tempWindow,where,GetGrayRGN^^.RGNBBox); end;{case} keyDown,autoKey: begin theChar:=chr(BitAnd(message,255)); If BitAnd(modifiers,CmdKey)<>0 then DoCommand(MenuKey(theChar)) end; updateEvt: DoMyUpdate; end; Until Doneflag; SetCursor(GetCursor(WatchCursor)^^); end. {--------------------------------------------------------------} resource ‘MENU’ (1, preload) { 1, textMenuProc, 0x7FFFFFFD, enabled, apple, { /* array: 2 elements */ /* [1] */ “About projectX ”, noIcon, noKey, noMark, plain, /* [2] */ “-”, noIcon, noKey, noMark, plain } }; resource ‘MENU’ (2, preload) { 2, textMenuProc, 0x7FFFFFFB, enabled, “File”, { /* array: 1 elements */ /* [1] */ “Quit”, noIcon, “Q”, noMark, plain } }; resource ‘MENU’ (3, preload) { 3, textMenuProc, 0x7FFFFFBC, enabled, “Edit”, { /* array: 8 elements */ /* [1] */ “Undo”, noIcon, “Z”, noMark, plain, /* [2] */ “-”, noIcon, noKey, noMark, plain, /* [3] */ “Cut”, noIcon, “X”, noMark, plain, /* [4] */ “Copy”, noIcon, “C”, noMark, plain, /* [5] */ “Paste”, noIcon, “V”, noMark, plain, /* [6] */ “Clear”, noIcon, noKey, noMark, plain, /* [7] */ “-”, noIcon, noKey, noMark, plain, /* [8] */ “Select All”, noIcon, “A”, noMark, plain } }; resource ‘MENU’ (4, preload) { 4, textMenuProc, allEnabled, enabled, “Window”, { /* array: 1 elements */ /* [1] */ “ReAdjust Window”, noIcon, “1”, noMark, plain } }; resource ‘SIZE’ (-1) { dontSaveScreen, acceptSuspendResumeEvents, enableOptionSwitch, cannotBackground, multiFinderAware, backgroundAndForeground, dontGetFrontClicks, ignoreChildDiedEvents, not32BitCompatible, reserved, reserved, reserved, reserved, reserved, reserved, reserved, 307200, 307200 }; resource ‘SIZE’ (0) { dontSaveScreen, acceptSuspendResumeEvents, enableOptionSwitch, cannotBackground, multiFinderAware, backgroundAndForeground, dontGetFrontClicks, ignoreChildDiedEvents, not32BitCompatible, reserved, reserved, reserved, reserved, reserved, reserved, reserved, 307200, 307200 }; resource ‘vers’ (1, purgeable) { 0x1, 0x3, release, 0x0, verUs, “projectX”, “projectX” }; resource ‘vers’ (2, purgeable) { 0x1, 0x3, release, 0x0, verUs, “projectX”, “projectX” }; resource ‘PICT’ (1001) { {0, 0, 14, 14}, VersionOne { { /* array OpCodes: 6 elements */ /* [1] */ shortComment { 130 }, /* [2] */ shortComment { 142 }, /* [3] */ clipRgn { {0, 0, 752, 576}, $”” }, /* [4] */ bitsRect { 2, {0, 0, 14, 16}, {0, 0, 14, 14}, {0, 0, 14, 14}, srcOr, $”00 00 00 00 3F 80 20 80 20 F8 20 88 20 88 20 88" $”3F 88 08 08 08 08 08 08 0F F8 00 00" }, /* [5] */ shortComment { 143 }, /* [6] */ shortComment { 131 } } } }; resource ‘PICT’ (1000) { {0, 0, 17, 29}, VersionOne { { /* array OpCodes: 6 elements */ /* [1] */ shortComment { 130 }, /* [2] */ shortComment { 142 }, /* [3] */ clipRgn { {0, 0, 752, 576}, $”” }, /* [4] */ bitsRect { 4, {0, 0, 17, 32}, {0, 0, 17, 29}, {0, 0, 17, 29}, srcOr, $”00 00 00 00 00 00 00 00 00 00 00 00 FF BF FB F0" $”00 20 88 00 FF A0 8B F0 00 20 88 00 FF A0 8B F0" $”00 20 88 00 FF BF 8B F0 00 20 08 00 FF A0 0B F0" $”00 20 08 00 FF BF FB F0 00 00 00 00 00 00 00 00" $”00 00 00 00" }, /* [5] */ shortComment { 143 }, /* [6] */ shortComment { 131 } } } }; resource ‘PICT’ (1002) { {0, 0, 17, 31}, VersionOne { { /* array OpCodes: 6 elements */ /* [1] */ shortComment { 130 }, /* [2] */ shortComment { 142 }, /* [3] */ clipRgn { {0, 0, 752, 576}, $”” }, /* [4] */ bitsRect { 4, {0, 0, 17, 32}, {0, 0, 17, 31}, {0, 0, 17, 31}, srcOr, $”00 00 00 00 00 00 00 00 00 00 00 00 7E FF EF FE” $”00 80 20 00 7E 80 2F FE 00 80 20 00 7E 80 2F FE” $”00 80 20 00 7E 80 2F FE 00 80 20 00 7E 80 2F FE” $”00 80 20 00 7E FF EF FE 00 00 00 00 00 00 00 00" $”00 00 00 00" }, /* [5] */ shortComment { 143 }, /* [6] */ shortComment { 131 } } } }; resource ‘PICT’ (100) { {0, 4, 52, 209}, VersionOne { { /* array OpCodes: 7 elements */ /* [1] */ shortComment { 130 }, /* [2] */ shortComment { 12345 }, /* [3] */ shortComment { 142 }, /* [4] */ clipRgn { {0, 0, 752, 576}, $”” }, /* [5] */ packBitsRect { 28, {0, 0, 52, 216}, {0, 4, 52, 209}, {0, 4, 52, 209}, srcOr, $”0B ED 00 01 3F C0 FE 00 02 FF 00 00 0B ED 00 07" $”1F E0 00 00 01 FE 00 00 0B ED 00 07 0F F0 00 00" $”03 FC 00 00 0B ED 00 07 07 F0 00 00 03 F8 00 00" $”0B ED 00 07 07 F8 00 00 07 F8 00 00 0B ED 00 07" $”03 FC 00 00 0F F0 00 00 0B ED 00 07 01 FE 00 00" $”1F E0 00 00 0A EC 00 06 FE 00 00 1F C0 00 00 0A” $”EC 00 06 FF 00 00 3F C0 00 00 0A EC 00 06 7F 80" $”00 7F 80 00 00 09 EC 00 03 3F C0 00 FF FE 00 09" $”EC 00 03 1F C0 00 FE FE 00 09 EC 00 03 1F E0 01" $”FE FE 00 09 EC 00 03 0F F0 03 FC FE 00 09 EC 00" $”03 07 F8 07 F8 FE 00 1C 18 0F FF C0 1F FF E0 00" $”1F E0 00 00 70 3F FF F0 00 FF 80 FF FF F8 03 F8" $”07 F0 FE 00 1C 18 0F FF F0 1F FF F8 00 7F F8 00" $”00 70 3F FF F0 03 FF E0 FF FF F8 03 FC 0F F0 FE” $”00 1C 18 0F FF F8 1F FF FC 01 FF FE 00 00 70 3F” $”FF F0 0F FF F0 FF FF F8 01 FE 1F E0 FE 00 1C 18" $”0E 00 7C 1C 00 7C 03 F0 3F 00 00 70 38 00 00 1F” $”80 F8 00 70 00 00 FF 3F C0 FE 00 1C 18 0E 00 1C” $”1C 00 1E 07 C0 0F 80 00 70 38 00 00 3E 00 3C 00" $”70 00 00 7F 3F 80 FE 00 1C 18 0E 00 1E 1C 00 1E” $”07 80 07 80 00 70 38 00 00 3C 00 1C 00 70 00 00" $”7F FF 80 FE 00 1B 17 0E 00 0E 1C 00 0E 0F 00 03" $”C0 00 70 38 00 00 78 00 1E 00 70 00 00 3F FF FD” $”00 1B 17 0E 00 0E 1C 00 0E 0E 00 01 C0 00 70 38" $”00 00 70 00 0E 00 70 00 00 1F FE FD 00 1B 17 0E” $”00 0E 1C 00 0E 0E 00 01 C0 00 70 38 00 00 70 00" $”0E 00 70 00 00 0F FC FD 00 1B 0F 0E 00 1E 1C 00" $”1E 1E 00 01 E0 00 70 38 00 00 F0 FE 00 04 70 00" $”00 07 F8 FD 00 1B 0F 0E 00 1C 1C 00 1C 1C 00 00" $”E0 00 70 38 00 00 E0 FE 00 04 70 00 00 07 F8 FD” $”00 1B 0F 0E 00 7C 1C 00 7C 1C 00 00 E0 00 70 3F” $”FF C0 E0 FE 00 04 70 00 00 0F FC FD 00 1B 0F 0F” $”FF F8 1F FF F8 1C 00 00 E0 00 70 3F FF C0 E0 FE” $”00 04 70 00 00 1F FE FD 00 1B 0F 0F FF F0 1F FF” $”E0 1C 00 00 E0 00 70 3F FF C0 E0 FE 00 04 70 00" $”00 1F FE FD 00 1B 0F 0F FF C0 1F FF F8 1C 00 00" $”E0 00 70 38 00 00 E0 FE 00 04 70 00 00 3F FF FD” $”00 1C 0F 0E 00 00 1C 00 3C 1C 00 00 E0 00 70 38" $”00 00 E0 FE 00 05 70 00 00 7F FF 80 FE 00 1C 0F” $”0E 00 00 1C 00 1C 1E 00 01 E0 00 70 38 00 00 F0" $”FE 00 05 70 00 00 FF 3F C0 FE 00 1C 18 0E 00 00" $”1C 00 1E 0E 00 01 C0 00 70 38 00 00 70 00 0E 00" $”70 00 00 FF 3F C0 FE 00 1C 18 0E 00 00 1C 00 0E” $”0E 00 01 C3 80 70 38 00 00 70 00 0E 00 70 00 01" $”FE 1F E0 FE 00 1C 18 0E 00 00 1C 00 0E 0F 00 03" $”C3 80 70 38 00 00 78 00 1E 00 70 00 03 FC 0F F0" $”FE 00 1C 18 0E 00 00 1C 00 0E 07 80 07 83 80 F0" $”38 00 00 3C 00 1C 00 70 00 07 F8 07 F8 FE 00 1C” $”18 0E 00 00 1C 00 0E 07 C0 0F 83 C0 F0 38 00 00" $”3E 00 7C 00 70 00 07 F8 07 F8 FE 00 1C 18 0E 00" $”00 1C 00 0E 03 F0 3F 01 E1 E0 38 00 00 1F 81 F8" $”00 70 00 0F F0 03 FC FE 00 1C 18 0E 00 00 1C 00" $”0E 01 FF FE 01 FF E0 3F FF F0 0F FF F0 00 70 00" $”1F E0 01 FE FE 00 1C 18 0E 00 00 1C 00 0F 00 7F” $”F8 00 FF C0 3F FF F0 03 FF C0 00 70 00 3F C0 00" $”FF FE 00 1C 18 0E 00 00 1C 00 07 00 1F E0 00 3F” $”00 3F FF F0 00 FF 00 00 70 00 3F C0 00 FF FE 00" $”0A EC 00 06 7F 80 00 7F 80 00 00 0A EC 00 04 FF” $”00 00 3F C0 FF 00 0B ED 00 05 01 FE 00 00 1F E0" $”FF 00 0B ED 00 05 01 FE 00 00 1F E0 FF 00 0B ED” $”00 07 03 FC 00 00 0F F0 00 00 0B ED 00 07 07 F8" $”00 00 07 F8 00 00 0B ED 00 07 0F F0 00 00 03 FC” $”00 00 0B ED 00 07 0F F0 00 00 03 FC 00 00 0B ED” $”00 07 1F E0 00 00 01 FE 00 00 0B ED 00 01 3F C0" $”FE 00 00 FF FF 00 0B ED 00 01 7F 80 FE 00 02 7F” $”80 00" }, /* [6] */ shortComment { 143 }, /* [7] */ shortComment { 131 } } } }; resource ‘DLOG’ (1) { {104, 166, 228, 392}, dBoxProc, visible, noGoAway, 0x0, 1, “” }; resource ‘DITL’ (1) { { /* array DITLarray: 2 elements */ /* [1] */ {6, 9, 58, 214}, Picture { enabled, 100 }, /* [2] */ {63, 26, 116, 217}, StaticText { disabled, “By Rod Magnuson\nFor MacTutor Magazine\nBa” “sed on idea of Scott Boyd” } } };
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine