]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/exec.c
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / ioncore / exec.c
index 4147172703bb4318bc4913337485d58309d6a132..65683dc87080bb58aab95629a4e07cf00853f5fe 100644 (file)
@@ -3,10 +3,7 @@
  *
  * Copyright (c) Tuomo Valkonen 1999-2007. 
  *
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
  */
 
 #include <limits.h>
 /*{{{ Exec */
 
 
-void ioncore_setup_environ(int xscr)
+void ioncore_setup_display(int xscr)
 {
     char *tmp, *ptr;
     char *display;
+
+    /* Set up $DISPLAY */
     
     display=XDisplayName(ioncore_g.display);
     
@@ -54,7 +53,7 @@ void ioncore_setup_environ(int xscr)
         snprintf(tmp+strlen(tmp), 11, ".%u", (unsigned)xscr);
     
     putenv(tmp);
-    
+        
     /* No need to free it, we'll execve soon */
     /*free(tmp);*/
 
@@ -62,25 +61,15 @@ void ioncore_setup_environ(int xscr)
 }
 
 
-typedef struct{
-    WRootWin *rw;
-    const char *wd;
-} ExecP;
-
-
-static void setup_exec(void *p_)
+void ioncore_setup_environ(const WExecP *p)
 {
-    ExecP *p=(ExecP*)p_;
+    /* Set up $DISPLAY */
     
-    close(ioncore_g.conn);
+    ioncore_setup_display(p->target!=NULL 
+                          ? region_rootwin_of(p->target)->xscr
+                          : -1);
     
-    ioncore_g.dpy=NULL;
-    
-#ifndef CF_NO_SETPGID
-    setpgid(0, 0);
-#endif
-    
-    ioncore_setup_environ(p->rw==NULL ? -1 : p->rw->xscr);
+    /* Set up working directory */
     
     if(p->wd!=NULL){
         if(chdir(p->wd)!=0)
@@ -89,13 +78,29 @@ static void setup_exec(void *p_)
 }
 
 
+WHook *ioncore_exec_environ_hook=NULL;
+
+
+static void setup_exec(void *execp)
+{
+    hook_call_p(ioncore_exec_environ_hook, execp, NULL);
+    
+#ifndef CF_NO_SETPGID
+    setpgid(0, 0);
+#endif
+    
+    ioncore_g.dpy=NULL;
+}
+
+
 EXTL_EXPORT
-int ioncore_do_exec_rw(WRootWin *rw, const char *cmd, const char *wd,
+int ioncore_do_exec_on(WRegion *reg, const char *cmd, const char *wd,
                        ExtlFn errh)
 {
-    ExecP p;
+    WExecP p;
     
-    p.rw=rw;
+    p.target=reg;
+    p.cmd=cmd;
     p.wd=wd;
     
     return mainloop_popen_bgread(cmd, setup_exec, (void*)&p, 
@@ -113,7 +118,7 @@ EXTL_SAFE
 EXTL_EXPORT
 int ioncore_exec(const char *cmd)
 {
-    return ioncore_do_exec_rw(NULL, cmd, NULL, extl_fn_none());
+    return ioncore_do_exec_on(NULL, cmd, NULL, extl_fn_none());
 }
 
 
@@ -126,10 +131,11 @@ EXTL_SAFE
 EXTL_EXPORT
 int ioncore_popen_bgread(const char *cmd, ExtlFn h, ExtlFn errh)
 {
-    ExecP p;
+    WExecP p;
     
-    p.rw=NULL;
+    p.target=NULL;
     p.wd=NULL;
+    p.cmd=cmd;
     
     return mainloop_popen_bgread(cmd, setup_exec, (void*)&p, h, errh);
 }
@@ -196,7 +202,7 @@ void ioncore_do_restart()
     ioncore_deinit();
     if(other!=NULL){
         if(ioncore_g.display!=NULL)
-            ioncore_setup_environ(-1);
+            ioncore_setup_display(-1);
         mainloop_do_exec(other);
         warn_err_obj(other);
     }