TweetFollow Us on Twitter

Configure Window
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”
 }
 }
};

 
AAPL
$103.30
Apple Inc.
+0.80
MSFT
$45.09
Microsoft Corpora
-0.34
GOOG
$577.33
Google Inc.
+5.73

MacTech Search:
Community Search:

Software Updates via MacUpdate

TextSoap 7.4.0 - Flexible text editing u...
TextSoap is for people who work with text. TextSoap effortlessly cleans up text from endlessly different formats. Wash away unwanted characters, spaces, tabs. Fix paragraphs with hard returns at the... Read more
NetShade 6.0.2 - Browse privately using...
NetShade is an Internet security tool that conceals your IP address on the web. NetShade routes your Web connection through either a public anonymous proxy server, or one of NetShade's own dedicated... Read more
Mac DVDRipper Pro 5.0 - Copy, backup, an...
Mac DVDRipper Pro is the DVD backup solution that lets you protect your DVDs from scratches, save your batteries by reading your movies from your hard disk, manage your collection with just a few... Read more
pwSafe 3.1 - Secure password management...
pwSafe provides simple and secure password management across devices and computers. pwSafe uses iCloud to keep your password databases backed-up and synced between Macs and iOS devices. It is... Read more
StatsBar 1.8 - Monitor system processes...
StatsBar gives you a comprehensive and detailed analysis of the following areas of your Mac: CPU usage Memory usage Disk usage Network and bandwidth usage Battery power and health (MacBooks only)... Read more
Path Finder 6.5.5 - Powerful, award-winn...
Path Finder is a file browser that combines the familiar Finder interface with the powerful utilities and innovative features. Just a small selection of the Path Finder 6 feature set: Dual pane... Read more
QuarkXPress 10.2.1 - Desktop publishing...
With QuarkXPress, you can communicate in all the ways you need to -- and always look professional -- in print and digital media, all in a single tool. Features include: Easy to Use -- QuarkXPress is... Read more
Skype 6.19.0.450 - Voice-over-internet p...
Skype allows you to talk to friends, family and co-workers across the Internet without the inconvenience of long distance telephone charges. Using peer-to-peer data transmission technology, Skype... Read more
VueScan 9.4.41 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Cloud 3.0.0 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more

Latest Forum Discussions

See All

Modern Combat 5 Gets a Major Multiplayer...
Modern Combat 5 Gets a Major Multiplayer Update Posted by Jessica Fisher on September 2nd, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Alien Creeps TD Review
Alien Creeps TD Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: EXPENSIVE DEFENSESUniversal App - Designed for iPhone and iPad Alien Creeps TD would be a fun if unremarkable Tower Defense game, but its heavy focus on... | Read more »
The Journey Down: Chapter Two Review
The Journey Down: Chapter Two Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: DARK YET ENTICINGUniversal App - Designed for iPhone and iPad It’s a little dark, in every sense of the word, but The Journey Down:... | Read more »
Function Space, a Social Network App for...
Function Space, a Social Network App for Science, Launches on iOS Posted by Ellis Spice on September 2nd, 2014 [ permalink ] | Read more »
Stupidfast – How Taylor Martinez Switche...
How do you make an Endless Running game more than just another Endless Running game? By adding real life prizes to it, of course! That’s the thinking behind StupidFast: a game designed for football enthusiasts, and the brainchild of former college... | Read more »
Little Raiders: Robin’s Revenge Review
Little Raiders: Robin’s Revenge Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: CASUAL RAIDINGUniversal App - Designed for iPhone and iPad Combining simple combat with village building is a potent combination for... | Read more »
Treasure Tombs: Ra Deal Coming from Bulk...
Treasure Tombs: Ra Deal Coming from Bulkypix and Dark Tonic This Fall Posted by Jessica Fisher on September 2nd, 2014 [ permalink ] Dark Tonic and | Read more »
Pirate Bash Review
Pirate Bash Review By Nadia Oxford on September 2nd, 2014 Our Rating: :: BAD PIRATES, GOOD TIMESUniversal App - Designed for iPhone and iPad Pirate Bash’s turn-based battles add an intriguing twist to a typical physics game.   | Read more »
Tiny Tower Vegas Review
Tiny Tower Vegas Review By Jennifer Allen on September 2nd, 2014 Our Rating: :: STEADY DEVELOPMENTUniversal App - Designed for iPhone and iPad Build a huge tower again but Vegas-style in Tiny Tower Vegas.   | Read more »
The Manhattan Project Review
The Manhattan Project Review By Andrew Fisher on September 2nd, 2014 Our Rating: :: ROCKET SCIENCEUniversal App - Designed for iPhone and iPad The Manhattan Project offers a great Euro-style gameplay experience, but it is totally... | Read more »

Price Scanner via MacPrices.net

Apple refurbished iPads available for up to $...
Apple is offering Certified Refurbished iPad Airs for up to $140 off MSRP. Apple’s one-year warranty is included with each model, and shipping is free. Stock tends to come and go with some of these... Read more
Are We Now In The Post-Post-PC Era?
A longtime and thoroughgoing laptop aficionado, I was more than a little dismayed by Steve Jobs’s declaration back in 2010 when he sprang the iPad on an unsuspecting world. that we’d entered a “post-... Read more
PC Outlook Improves, But 2014 Shipments Still...
According to the International Data Corporation (IDC) Worldwide Quarterly PC Tracker, worldwide PC shipments are expected to fall by -3.7 percent in 2014. To hat’s actually an improvement from the... Read more
IDC Lowers Tablet Sales Projections for 2014...
Following a second consecutive quarter of softer than expected demand, International Data Corporation (IDC) has lowered its worldwide tablet plus 2-in-1 forecast for 2014 to 233.1 million units. The... Read more
Apple now offering refurbished 21-inch 1.4GHz...
The Apple Store is now offering Apple Certified Refurbished 21″ 1.4GHz iMacs for $929 including free shipping plus Apple’s standard one-year warranty. Their price is $170 off the cost of new models,... Read more
Save $50 on the 2.5GHz Mac mini, on sale for...
B&H Photo has the 2.5GHz Mac mini on sale for $549.99 including free shipping. That’s $50 off MSRP, and B&H will also include a free copy of Parallels Desktop software. NY sales tax only. Read more
Save up to $300 on an iMac with Apple refurbi...
The Apple Store has Apple Certified Refurbished iMacs available for up to $300 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. These are the best prices on... Read more
The Rise of Phablets
Carlisle & Gallagher Consulting Group, a businesses and technology consulting firm focused solely on the financial services industry, has released an infographic depicting the convergence of... Read more
Bad Driver Database App Allows Good Drivers t...
Bad Driver Database 1.4 by Facile Group is a new iOS and Android app that lets users instantly input and see how many times a careless, reckless or just plain stupid driver has been added to the... Read more
Eddy – Cloud Music Player for iPhone/iPad Fre...
Ukraine based CapableBits announces the release of Eddy, its tiny, but smart and powerful cloud music player for iPhone and iPad that allows users to stream or download music directly from cloud... Read more

Jobs Board

*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.