home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyRestartFinder.p < prev    next >
Encoding:
Text File  |  1997-02-07  |  2.2 KB  |  92 lines  |  [TEXT/CWIE]

  1. unit MyRestartFinder;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Files;
  7.  
  8.     const
  9.         kWaitForFinder = false;
  10.         kDontWaitForFinder = true;
  11.         
  12.     procedure RestartFinder (tofront, dontwait: boolean);
  13.     procedure QuitFinder;
  14.     function GetFinderFS (var fs: FSSpec): boolean;
  15.     procedure StartFinder (fs: FSSpec; tofront, dontwait: boolean);
  16.  
  17. implementation
  18.  
  19.     uses
  20.         AppleEvents, Folders, MyProcesses, MyFDFlags;
  21.  
  22.     const
  23.         finder_creator = 'MACS';
  24.         finder_type = 'FNDR';
  25.         sharing_creator = 'hhgg';
  26.         sharing_type = 'INIT';
  27.  
  28.     procedure QuitFinder;
  29.     begin
  30.         QuitApplication(sharing_creator, sharing_type);
  31.         QuitApplication(finder_creator, finder_type);
  32.     end;
  33.  
  34.     function GetFinderFS (var fs: FSSpec): boolean;
  35.         const
  36.             FinderNameAddr = $2E0;
  37.         var
  38.             psn: ProcessSerialNumber;
  39.             gotit: boolean;
  40.     begin
  41.         gotit := false;
  42.         if FindProcess(finder_creator, finder_type, psn, fs) then begin
  43.             gotit := true;
  44.         end;
  45.         if not gotit & (FindFolder( kOnSystemDisk, kSystemFolderType, false, fs.vRefNum, fs.parID ) = noErr) then begin
  46.             if FSMakeFSSpec( fs.vRefNum, fs.parID, StringPtr(FinderNameAddr)^, fs ) = noErr then begin
  47.                 gotit := true;
  48.             end;
  49.         end;
  50.         if not gotit then begin
  51.             fs.name := '';
  52.         end;
  53.         GetFinderFS := gotit;
  54.     end;
  55.  
  56.     procedure StartFinder (fs: FSSpec; tofront, dontwait: boolean);
  57.         var
  58.             psn, our_psn: ProcessSerialNumber;
  59.             er: EventRecord;
  60.             dummy: boolean;
  61.             same: boolean;
  62.             t: longint;
  63.             junk: OSErr;
  64.     begin
  65.         if GetCurrentProcess(our_psn) = noErr then begin
  66.             if fs.name = '' then begin
  67.                 junk := LaunchApp(finder_creator, finder_type, tofront);
  68.             end else begin
  69.                 junk := LaunchFSSpec(fs, tofront);
  70.             end;
  71.             if not dontwait then begin
  72. { Wait until we're not the FrontProcess, else we may ExitToShell before the Finder }
  73. { has fully restarted - which causes system error 41 if we are the only app running. }
  74.                 t := TickCount + 10 * 60;
  75.                 while (GetFrontProcess(psn) = noErr) & (SameProcess(psn, our_psn, same) = noErr) & same & (TickCount < t) do begin
  76.                     dummy := WaitNextEvent(everyEvent, er, 15, nil);
  77.                 end;
  78.             end;
  79.         end;
  80.     end;
  81.  
  82.     procedure RestartFinder (tofront, dontwait: boolean);
  83.         var
  84.             finder_fs: FSSpec;
  85.     begin
  86.         if GetFinderFS(finder_fs) then begin
  87.             QuitFinder;
  88.             StartFinder(finder_fs, tofront, dontwait);
  89.         end;
  90.     end;
  91.  
  92. end.