function __construct()
 {
     require_once "knj/class_knj_eventmanager.php";
     $this->em = new EventManager();
     $this->em->addEvent(array("mouseclick", "north", "east", "south", "west", "northeast", "northwest", "southeast", "southwest"));
     $this->proc = fopen("/dev/input/mice", "r") or die;
     Gtk::io_add_watch($this->proc, GObject::IO_IN, array($this, "on_mouseevent_do"));
 }
 public function run()
 {
     $this->pipes = NULL;
     $cmd = $this->command . " " . join(" ", $this->options);
     $this->proc_id = proc_open($cmd, $this->descriptor_spec, $this->pipes);
     # could set non blocking IO here
     # stream_set_blocking($this->pipes[1], false);  # stdout
     # stream_set_blocking($this->pipes[2], false);  # stderr
     if ($this->proc_id !== FALSE) {
         $ids[] = Gtk::io_add_watch($this->pipes[1], Gobject::IO_HUP, array($this, 'io_hup'));
         $ids[] = Gtk::io_add_watch($this->pipes[1], Gobject::IO_IN, array($this, 'stdout'));
         $ids[] = Gtk::io_add_watch($this->pipes[1], Gobject::IO_ERR, array($this, 'stderr'));
     } else {
         throw new Exception("PipeIO::run() : proc_open error");
     }
 }