home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-02-07 | 2.2 KB | 92 lines | [TEXT/CWIE] |
- unit MyRestartFinder;
-
- interface
-
- uses
- Files;
-
- const
- kWaitForFinder = false;
- kDontWaitForFinder = true;
-
- procedure RestartFinder (tofront, dontwait: boolean);
- procedure QuitFinder;
- function GetFinderFS (var fs: FSSpec): boolean;
- procedure StartFinder (fs: FSSpec; tofront, dontwait: boolean);
-
- implementation
-
- uses
- AppleEvents, Folders, MyProcesses, MyFDFlags;
-
- const
- finder_creator = 'MACS';
- finder_type = 'FNDR';
- sharing_creator = 'hhgg';
- sharing_type = 'INIT';
-
- procedure QuitFinder;
- begin
- QuitApplication(sharing_creator, sharing_type);
- QuitApplication(finder_creator, finder_type);
- end;
-
- function GetFinderFS (var fs: FSSpec): boolean;
- const
- FinderNameAddr = $2E0;
- var
- psn: ProcessSerialNumber;
- gotit: boolean;
- begin
- gotit := false;
- if FindProcess(finder_creator, finder_type, psn, fs) then begin
- gotit := true;
- end;
- if not gotit & (FindFolder( kOnSystemDisk, kSystemFolderType, false, fs.vRefNum, fs.parID ) = noErr) then begin
- if FSMakeFSSpec( fs.vRefNum, fs.parID, StringPtr(FinderNameAddr)^, fs ) = noErr then begin
- gotit := true;
- end;
- end;
- if not gotit then begin
- fs.name := '';
- end;
- GetFinderFS := gotit;
- end;
-
- procedure StartFinder (fs: FSSpec; tofront, dontwait: boolean);
- var
- psn, our_psn: ProcessSerialNumber;
- er: EventRecord;
- dummy: boolean;
- same: boolean;
- t: longint;
- junk: OSErr;
- begin
- if GetCurrentProcess(our_psn) = noErr then begin
- if fs.name = '' then begin
- junk := LaunchApp(finder_creator, finder_type, tofront);
- end else begin
- junk := LaunchFSSpec(fs, tofront);
- end;
- if not dontwait then begin
- { Wait until we're not the FrontProcess, else we may ExitToShell before the Finder }
- { has fully restarted - which causes system error 41 if we are the only app running. }
- t := TickCount + 10 * 60;
- while (GetFrontProcess(psn) = noErr) & (SameProcess(psn, our_psn, same) = noErr) & same & (TickCount < t) do begin
- dummy := WaitNextEvent(everyEvent, er, 15, nil);
- end;
- end;
- end;
- end;
-
- procedure RestartFinder (tofront, dontwait: boolean);
- var
- finder_fs: FSSpec;
- begin
- if GetFinderFS(finder_fs) then begin
- QuitFinder;
- StartFinder(finder_fs, tofront, dontwait);
- end;
- end;
-
- end.