]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_statusbar/main.c
Imported Upstream version 20090110
[ion3.git] / mod_statusbar / main.c
index 9ec4f20c0aac1a91ac5f346a38c8bc5f6a7dbbe5..777e0b31fe37b3802d8ce7c066e96689d89abd19 100644 (file)
@@ -1,35 +1,22 @@
 /*
  * ion/mod_statusbar/main.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * 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 <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <errno.h>
-
 #include <libtu/minmax.h>
 #include <libextl/readconfig.h>
-#include <libmainloop/exec.h>
-#include <libmainloop/select.h>
 #include <ioncore/saveload.h>
 #include <ioncore/bindmaps.h>
 #include <ioncore/global.h>
+#include <ioncore/ioncore.h>
 
 #include "statusbar.h"
 #include "exports.h"
 
 
-#define CF_STATUSD_TIMEOUT_SEC 5
-
-
 /*{{{ Module information */
 
 
@@ -50,160 +37,6 @@ WBindmap *mod_statusbar_statusbar_bindmap=NULL;
 /*}}}*/
 
 
-/*{{{ Statusd launch helper */
-
-
-#define BL 1024
-
-
-static bool process_pipe(int fd, ExtlFn fn, 
-                         bool *doneseen, bool *eagain)
-{
-    char buf[BL];
-    int n;
-    bool fnret;
-    
-    *eagain=FALSE;
-    
-    n=read(fd, buf, BL-1);
-    
-    if(n<0){
-        if(errno==EAGAIN || errno==EINTR){
-            *eagain=(errno==EAGAIN);
-            return TRUE;
-        }
-        warn_err_obj(TR("reading a pipe"));
-        return FALSE;
-    }else if(n>0){
-        buf[n]='\0';
-        *doneseen=FALSE;
-        return extl_call(fn, "s", "b", &buf, doneseen);
-    }
-    
-    return FALSE;
-}
-
-
-#define USEC 1000000
-
-
-static bool wait_statusd_init(int outfd, int errfd, ExtlFn dh, ExtlFn eh)
-{
-    fd_set rfds;
-    struct timeval tv, endtime, now;
-    int nfds=maxof(outfd, errfd);
-    int retval;
-    bool dummy, doneseen, eagain=FALSE;
-    const char *timeout_msg=TR("ion-statusd launch timeout.");
-    
-    if(gettimeofday(&endtime, NULL)!=0){
-        warn_err();
-        return FALSE;
-    }
-    
-    now=endtime;
-    endtime.tv_sec+=CF_STATUSD_TIMEOUT_SEC;
-    
-    while(1){
-        FD_ZERO(&rfds);
-
-        /* Calculate remaining time */
-        if(now.tv_sec>endtime.tv_sec){
-            goto timeout;
-        }else if(now.tv_sec==endtime.tv_sec){
-            if(now.tv_usec>=endtime.tv_usec)
-                goto timeout;
-            tv.tv_sec=0;
-            tv.tv_usec=endtime.tv_usec-now.tv_usec;
-        }else{
-            tv.tv_usec=USEC+endtime.tv_usec-now.tv_usec;
-            tv.tv_sec=-1+endtime.tv_sec-now.tv_sec;
-            /* Kernel lameness tuner: */
-            tv.tv_sec+=tv.tv_usec/USEC;
-            tv.tv_usec%=USEC;
-        }
-        
-        FD_SET(outfd, &rfds);
-        FD_SET(errfd, &rfds);
-    
-        retval=select(nfds+1, &rfds, NULL, NULL, &tv);
-        if(retval>0){
-            if(FD_ISSET(errfd, &rfds)){
-                if(!process_pipe(errfd, eh, &dummy, &eagain))
-                    return FALSE;
-            }
-            if(FD_ISSET(outfd, &rfds)){
-                if(!process_pipe(outfd, dh, &doneseen, &eagain))
-                    return FALSE;
-                if(doneseen){
-                    /* Read rest of errors. */
-                    bool ok;
-                    do{
-                        ok=process_pipe(errfd, eh, &dummy, &eagain);
-                    }while(ok && !eagain);
-                    return TRUE;
-                }
-            }
-        }else if(retval==0){
-            goto timeout;
-        }
-        
-        if(gettimeofday(&now, NULL)!=0){
-            warn_err();
-            return FALSE;
-        }
-    }
-    
-    return TRUE;
-    
-timeout:
-    warn(TR("ion-statusd timed out."));
-    return FALSE;
-}
-
-
-EXTL_EXPORT
-int mod_statusbar__launch_statusd(const char *cmd,
-                                  ExtlFn initdatahandler,
-                                  ExtlFn initerrhandler,
-                                  ExtlFn datahandler,
-                                  ExtlFn errhandler)
-{
-    pid_t pid;
-    int outfd=-1, errfd=-1;
-    
-    if(cmd==NULL)
-        return -1;
-    
-    pid=mainloop_do_spawn(cmd, NULL, NULL,
-                          NULL, &outfd, &errfd);
-    
-    if(pid<0)
-        return -1;
-    
-    if(!wait_statusd_init(outfd, errfd, initdatahandler, initerrhandler))
-        goto err;
-    
-    if(!mainloop_register_input_fd_extlfn(outfd, datahandler))
-        goto err;
-    
-    if(!mainloop_register_input_fd_extlfn(errfd, errhandler))
-        goto err2;
-
-    return pid;
-    
-err2:    
-    mainloop_unregister_input_fd(outfd);
-err:    
-    close(outfd);
-    close(errfd);
-    return -1;
-}
-
-
-/*}}}*/
-
-
 /*{{{ Systray */
 
 
@@ -255,7 +88,7 @@ static bool clientwin_do_manage_hook(WClientWin *cwin, const WManageParams *para
         return FALSE;
 
     return region_manage_clientwin((WRegion*)sb, cwin, param,
-                                   MANAGE_REDIR_PREFER_NO);
+                                   MANAGE_PRIORITY_NONE);
 }