home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 6.3 KB | 265 lines | [TEXT/PJMM] |
- unit MyMainLoop;
- { DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
-
- interface
-
- uses
- Types, OSUtils, Files, AppleTalk, Aliases, PPCToolBox, Processes, EPPC, Notification, AppleEvents, MyUtilities, MyTypes;
-
- type
- HEreply = record
- todo: (T_Other, T_Menu, T_Close, T_Content, T_Key, T_AutoKey, T_Update, T_Dialog,{}
- T_MouseMoved, T_Suspend, T_Resume, T_Activate, T_Deactivate, T_HighLevel, T_Resize);
- themenu: integer;
- theitem: integer;
- HEwp: windowPtr;
- HEer: eventRecord;
- end;
-
- procedure InitMainLoop;
- procedure WaitForEvent (var er: eventRecord; sleep: longInt; rgn: rgnHandle);
- function HandleEvents (er: eventRecord; var reply: HEreply): boolean;
- procedure FinishMainLoop;
-
- implementation
-
- procedure InitMainLoop;
- var
- dummy_er: eventRecord;
- dummy: boolean;
- i: integer;
- begin
- { Give MultiFinder a chance to setup }
- for i := 1 to 5 do
- dummy := EventAvail(everyEvent, dummy_er);
- InitUtilities;
- end;
-
- procedure FinishMainLoop;
- begin
- end;
-
- procedure WaitForEvent (var er: eventRecord; sleep: longInt; rgn: rgnHandle);
- const
- max_sleep = 30;
- var
- b: boolean;
- small_sleep: longInt;
- begin
- repeat
- if max_sleep > sleep then
- small_sleep := sleep
- else
- small_sleep := max_sleep;
- if WaitGetNextEvent(everyEvent, er, small_sleep, nil) then
- leave;
- b := IsDialogEvent(er); { should be false, since GNE is }
- sleep := sleep - small_sleep;
- until sleep <= 0;
- end;
-
- function HandleEvents (er: eventRecord; var reply: HEreply): boolean;
- var
- mResult: longInt;
- tempRect, oldRect: rect;
- myPt: point;
- ch: char;
- oe: OSErr;
- code: integer;
- good: boolean;
- userWindow: boolean;
- begin
- reply.HEer := er;
- good := false;
- with reply do begin
- todo := T_Other;
- if IsDialogEvent(HEer) then
- if DialogSelect(HEer, HEwp, theitem) then begin
- todo := T_Dialog;
- good := true;
- end;
- if HEer.what = MouseDown then
- code := FindWindow(HEer.where, HEwp)
- else
- HEwp := FrontWindow;
- userWindow := false;
- if (HEwp <> nil) then
- userWindow := windowPeek(HEwp)^.windowKind >= userKind;
- case HEer.what of
- MouseDown:
- begin
- if code = inMenuBar then begin
- mResult := MenuSelect(HEer.where);
- if mResult <> 0 then begin
- themenu := HiWord(mResult);
- theitem := LoWord(mResult);
- todo := T_Menu;
- good := true;
- end;
- end;
-
- if code = InDrag then begin
- { tempRect := screenbits.bounds;}
- { SetRect(tempRect, tempRect.Left + 10, tempRect.Top + 25, tempRect.Right - 10, tempRect.Bottom - 10);}
- tempRect := GetGrayRgn^^.rgnBBox;
- DragWindow(HEwp, HEer.where, tempRect);
- end;
-
- if (code = inGrow) and (HEwp <> nil) then begin
- SetPort(HEwp);
- myPt := HEer.where;
- GlobalToLocal(myPt);
- OldRect := HEwp^.portRect;
- with screenbits.bounds do
- SetRect(tempRect, 15, 15, (right - left), (bottom - top) - 20);
- mResult := GrowWindow(HEwp, HEer.where, tempRect);
- SizeWindow(HEwp, LoWord(mResult), HiWord(mResult), TRUE);
- SetPort(HEwp);
- SetRect(tempRect, 0, myPt.v - 15, myPt.h + 15, myPt.v + 15);
- EraseRect(tempRect);
- InvalRect(tempRect);
- SetRect(tempRect, myPt.h - 15, 0, myPt.h + 15, myPt.v + 15);
- EraseRect(tempRect);
- InvalRect(tempRect);
- todo := T_Resize;
- good := true;
- end;
-
- if (code = inZoomIn) or (code = inZoomOut) then begin
- if HEwp <> nil then begin
- SetPort(HEwp);
- myPt := HEer.where;
- GlobalToLocal(myPt);
- OldRect := HEwp^.portRect;
- if TrackBox(HEwp, myPt, code) then begin
- ZoomWindow(HEwp, code, true);
- SetRect(tempRect, 0, 0, 32000, 32000);
- EraseRect(tempRect);
- InvalRect(tempRect);
- todo := T_Resize;
- good := true;
- end;
- end;
- end;
-
- if code = inGoAway then begin
- if HEwp <> FrontWindow then
- SelectWindow(HEwp)
- else if TrackGoAway(HEwp, HEer.where) then begin
- if SimpleClose(HEwp) then begin
- good := true;
- todo := T_Close;
- end;
- end;
- end;
-
- if code = inContent then begin
- if HEwp <> FrontWindow then
- SelectWindow(HEwp)
- else begin
- if userWindow then begin
- good := true;
- todo := T_Content;
- GlobalToLocal(HEer.where);
- end;
- end;
- end;
-
- if (code = inSysWindow) then
- SystemClick(HEer, HEwp);
-
- end;
-
- AutoKey:
- begin
- if not Odd(HEer.modifiers div CmdKey) then begin
- good := true;
- todo := T_AutoKey;
- end;
- end;
-
- KeyDown:
- begin
- with HEer do begin
- ch := chr(BAND(message, CharCodeMask));
- todo := T_Key;
- if Odd(modifiers div CmdKey) then begin
- mResult := MenuKey(ch);
- if mResult <> 0 then begin
- themenu := HiWord(mResult);
- theitem := LoWord(mResult);
- todo := T_Menu;
- end;
- end;
- good := true;
- end;
- end;
-
- UpdateEvt:
- begin
- HEwp := windowPtr(HEer.message);
- good := true;
- todo := T_Update;
- end;
-
- DiskEvt:
- begin
- if (HiWord(HEer.message) <> noErr) then begin
- HEer.where.h := ((screenbits.bounds.Right - screenbits.bounds.Left) div 2) - (304 div 2);
- HEer.where.v := ((screenbits.bounds.Bottom - screenbits.bounds.Top) div 3) - (104 div 2);
- InitCursor;
- oe := DIBadMount(HEer.where, HEer.message);
- end;
- end;
-
- ActivateEvt:
- begin
- HEwp := WindowPtr(HEer.message);
- if odd(HEer.modifiers) then begin
- SelectWindow(HEwp);
- todo := T_Activate;
- end
- else begin
- todo := T_Deactivate;
- end;
- good := true;
- end;
-
- kOSEvent:
- case BAnd(BRotL(HEer.message, 8), $FF) of {high byte of message}
- kMouseMovedMessage:
- begin
- todo := T_MouseMoved;
- good := true;
- end;
- kSuspendResumeMessage:
- begin
- in_foreground := BAnd(HEer.message, kResumeMask) <> 0;
- InitCursor;
- if in_foreground then begin
- todo := T_Resume;
- end
- else
- todo := T_Suspend;
- good := true;
- end;
- otherwise
- ;
- end;
-
- kHighLevelEvent:
- begin
- todo := T_HighLevel;
- good := true;
- if has_AppleEvents then
- oe := AEProcessAppleEvent(HEer);
- end;
-
- otherwise
- end;
-
- HandleEvents := good;
- end;
- end;
-
- end.