Browse Source

+ use "Terminal" under Haiku to launch external programs (patch by
Olivier Coursiere, mantis #17392)

git-svn-id: trunk@16107 -

Jonas Maebe 15 years ago
parent
commit
ea706f6271
1 changed files with 35 additions and 4 deletions
  1. 35 4
      packages/fcl-process/src/unix/process.inc

+ 35 - 4
packages/fcl-process/src/unix/process.inc

@@ -136,6 +136,15 @@ end;
 
 Function MakeCommand(P : TProcess) : PPchar;
 
+{$ifdef darwin}
+Const
+  TerminalApp = 'open';
+{$endif}
+{$ifdef haiku}
+Const
+  TerminalApp = 'Terminal';
+{$endif}
+  
 Var
   Cmd : String;
   S  : TStringList;
@@ -160,8 +169,15 @@ begin
     CommandToList(Cmd,S);
     if poNewConsole in P.Options then
       begin
-      {$ifdef darwin}
-      S.Insert(0,'open');
+      {$ifdef haiku}
+      If (P.ApplicationName<>'') then
+        begin
+        S.Insert(0,P.ApplicationName);
+        S.Insert(0,'--title');
+        end;
+      {$endif}
+      {$if defined(darwin) or defined(haiku)}
+      S.Insert(0,TerminalApp);
       {$else}
       S.Insert(0,'-e');
       If (P.ApplicationName<>'') then
@@ -177,6 +193,7 @@ begin
       S.Insert(0,'xterm');
       {$endif}
       end;
+    {$ifndef haiku}
     if (P.ApplicationName<>'') then
       begin
       S.Add(TitleOption);
@@ -192,6 +209,7 @@ begin
       S.Add(GeometryOption);
       S.Add(g);
       end;
+    {$endif}
     Result:=StringsToPcharList(S);
   Finally
     S.free;
@@ -293,7 +311,16 @@ begin
         end;
 
 {$if (defined(DARWIN) or defined(SUNOS))}
-        Pid:=fpvfork;
+        { can't use vfork in case the child has to be
+          suspended immediately, because with vfork the
+          child borrows the execution thread of the parent
+          unit it either exits or execs -> potential 
+          deadlock depending on how quickly the SIGSTOP
+          signal is delivered }
+        if not(poRunSuspended in Options) then
+          Pid:=fpvfork
+        else
+          Pid:=fpfork;
 {$else}
         Pid:=fpfork;
 {$endif}
@@ -405,7 +432,11 @@ begin
     If Running then
       Result:=fpkill(Handle,SIGKILL)=0;
     end;
-  GetExitStatus;
+  { the fact that the signal has been sent does not
+    mean that the process has already handled the
+    signal -> wait instead of calling getexitstatus }
+  if Result then
+    WaitOnExit;
 end;
 
 Procedure TProcess.SetShowWindow (Value : TShowWindowOptions);