implement Meroox; include "sys.m"; sys: Sys; fprint, pctl: import sys; include "styx.m"; styx: Styx; Rmsg, Tmsg: import styx; include "styxservers.m"; styxs: Styxservers; Styxserver, readstr: import styxs; include "error.m"; err: Error; stderr: import err; include "string.m"; include "dat.m"; dat: Dat; mnt, debug: import dat; include "wait.m"; wait: Wait; include "meroox.m"; oxc: chan of string; oxproc() { (pid, wc) := wait->monitor(); pidc := chan of int; spaceid := 0; for(;;){ alt { panel := <- sc => if (debug) fprint(stderr, "start ox for %s\n", panel); args := list of {string spaceid, panel}; spaceid++; spawn runox(args, pidc); oxpid := <- pidc; (pid, nil, sts) := <- oxc => if (debug) fprint(stderr, "o/x pid %d: exited '%s'\n", pid, sts); } } } runox(args: list of string, pidc: chan of int) { pidc <-= pctl(NEWFD|FORKNS|NEWPGRP|FORKENV, list of {0, 1, 2}); cmd := load Command Ox; if (cmd == nil) error(sprint("runox: load ox: %r")); cmd->init(nil, args); } init(d: Dat) { dat = d; sys = d->sys; err = d->err; names = d->names; wait = checkload(Wait Wait->PATH, Wait->PATH); wait->init(); oxc = chan of string; spawn oxproc(); } start(panel: string) { if (oxc == nil) return; rel := names->relative(mnt, panel); els := names->elements(rel); scr := names->rooted(mnt, hd els); oxc <-= scr; }