--- rxvt-unicode/src/iom.h 2006/01/09 22:41:41 1.24 +++ rxvt-unicode/src/iom.h 2006/01/19 11:56:00 1.26 @@ -1,6 +1,6 @@ /* iom.h -- generic I/O multiplexer - Copyright (C) 2003, 2004 Marc Lehmann + Copyright (C) 2003-2006 Marc Lehmann This file is part of GVPE. @@ -28,24 +28,13 @@ // edit iom_conf.h as appropriate. #include "iom_conf.h" -#include "callback.h" - -#ifndef IOM_IO -# define IOM_IO 0 -#endif -#ifndef IOM_TIME -# define IOM_TIME 0 -#endif -#ifndef IOM_CHECK -# define IOM_CHECK 0 -#endif -#ifndef IOM_IDLE -# define IOM_IDLE 0 -#endif -#ifndef IOM_SIG -# define IOM_SIG 0 +#if IOM_CHILD +# undef IOM_SIG +# define IOM_SIG 1 #endif +#include "callback.h" + typedef double tstamp; extern tstamp NOW; @@ -68,6 +57,9 @@ #if IOM_SIG struct sig_watcher; #endif +#if IOM_CHILD +struct child_watcher; +#endif template struct io_manager_vec : vector { @@ -115,6 +107,9 @@ #if IOM_SIG static void reg (sig_watcher &w); static void unreg (sig_watcher &w); #endif +#if IOM_CHILD + static void reg (child_watcher &w); static void unreg (child_watcher &w); +#endif static void loop (); }; @@ -141,7 +136,7 @@ template io_watcher (O1 *object, void (O2::*method) (io_watcher &, short)) - : callback2 (object,method) + : callback2 (object, method) { } ~io_watcher () { stop (); } }; @@ -161,7 +156,7 @@ template time_watcher (O1 *object, void (O2::*method) (time_watcher &)) - : callback1 (object,method), at (0) + : callback1 (object, method), at (0) { } ~time_watcher () { stop (); } }; @@ -175,7 +170,7 @@ template check_watcher (O1 *object, void (O2::*method) (check_watcher &)) - : callback1 (object,method) + : callback1 (object, method) { } ~check_watcher () { stop (); } }; @@ -189,7 +184,7 @@ template idle_watcher (O1 *object, void (O2::*method) (idle_watcher &)) - : callback1 (object,method) + : callback1 (object, method) { } ~idle_watcher () { stop (); } }; @@ -204,11 +199,26 @@ template sig_watcher (O1 *object, void (O2::*method) (sig_watcher &)) - : callback1 (object,method), signum (-1) + : callback1 (object, method), signum (0) { } ~sig_watcher () { stop (); } }; #endif +#if IOM_CHILD +struct child_watcher : watcher, callback2 { + int /*pid_t*/ pid; + + void start (int pid) { this->pid = pid; io_manager::reg (*this); } + void stop () { io_manager::unreg (*this); } + + template + child_watcher (O1 *object, void (O2::*method) (child_watcher &, int status)) + : callback2 (object, method), pid (0) + { } + ~child_watcher () { stop (); } +}; +#endif + #endif