#!/bin/rc fn usage { echo 'usage: wctl=`{wctl [-c cmd] wsys}'} # Window creation fn newwindow { srv = $wsys rfork ne { unmount /mnt/acme /dev >[2]/dev/null pid=`{cat /dev/ppid} if(mount -n $srv $dir 'new -pid '^$pid^' '$"*){ bind -b $dir /dev # toss geometry parameters to find command while(~ $1 -*) switch($1){ case -dx -dy -minx -miny -maxx -maxy shift 2 case -r shift 5 case -scroll shift case -noscroll shift case -hide shift } if(! ~ $#* 0) cmd = $* echo -n `{basename $cmd(1)} > /dev/label >[2] /dev/null exec $cmd < /dev/cons > /dev/cons >[2] /dev/cons } }&} fn new { if(~ $1 -cd) { d=`{echo $2 | sed 's/-cd//'} cd $d shift 2 } newwindow $* &} fn wctl { while (a=`{read}) if (~ $a(1) new) $a} # Window deletion fn killproc { rc -c ' echo kill > /proc/'$1'/note sleep 0.2 echo kill > /proc/'$1'/ctl ' >[2] /dev/null &} fn killer { # mounts the root and blocks # reading from the kill file mount -n $wsys $dir / || exit cat $dir/kill | while (p=`{read}){ killproc $p } killproc $1} # Serve at /srv/$1.pid fn serve { srvname=$1 shift # the fd 3 is used to get the pid # of the process run by srv srvpid=`{ srv -eq ' echo $pid >[1=3] {'^$"*^'} >[2] /dev/null ' $srvname.$pid >[3=1] | read } mv /srv/$srvname.^($pid $srvpid) && echo /srv/$srvname.$srvpid} # Main cmd=(rio -i window)if(~ $1 -c){ if(~ $2 '') usage && exit cmd=`{echo $2} shift 2}if(! ~ $1 ''){ wsys=$1 shift}if(! ~ $#* 0) usage && exitif(~ $wsys ''){ echo 'wctl: $wsys not defined' exit} serve wctl.$user ' dir = /mnt/wsys killer $pid & wctl'
#!/bin/rc
fn usage {
echo 'usage: wctl=`{wctl [-c cmd] wsys}'
}
# Window creation
fn newwindow {
srv = $wsys
rfork ne
{
unmount /mnt/acme /dev >[2]/dev/null
pid=`{cat /dev/ppid}
if(mount -n $srv $dir 'new -pid '^$pid^' '$"*){
bind -b $dir /dev
# toss geometry parameters to find command
while(~ $1 -*)
switch($1){
case -dx -dy -minx -miny -maxx -maxy
shift 2
case -r
shift 5
case -scroll
shift
case -noscroll
shift
case -hide
shift
}
if(! ~ $#* 0)
cmd = $*
echo -n `{basename $cmd(1)} > /dev/label >[2] /dev/null
exec $cmd < /dev/cons > /dev/cons >[2] /dev/cons
}
}&
}
fn new {
if(~ $1 -cd) {
d=`{echo $2 | sed 's/-cd//'}
cd $d
shift 2
}
newwindow $* &
}
fn wctl {
while (a=`{read})
if (~ $a(1) new)
$a
}
# Window deletion
fn killproc {
rc -c '
echo kill > /proc/'$1'/note
sleep 0.2
echo kill > /proc/'$1'/ctl
' >[2] /dev/null &
}
fn killer {
# mounts the root and blocks
# reading from the kill file
mount -n $wsys $dir / || exit
cat $dir/kill | while (p=`{read}){
killproc $p
}
killproc $1
}
# Serve at /srv/$1.pid
fn serve {
srvname=$1
shift
# the fd 3 is used to get the pid
# of the process run by srv
srvpid=`{
srv -eq '
echo $pid >[1=3]
{'^$"*^'} >[2] /dev/null
' $srvname.$pid >[3=1] |
read
}
mv /srv/$srvname.^($pid $srvpid) &&
echo /srv/$srvname.$srvpid
}
# Main
cmd=(rio -i window)
if(~ $1 -c){
if(~ $2 '')
usage && exit
cmd=`{echo $2}
shift 2
}
if(! ~ $1 ''){
wsys=$1
shift
}
if(! ~ $#* 0)
usage && exit
if(~ $wsys ''){
echo 'wctl: $wsys not defined'
exit
}
serve wctl.$user '
dir = /mnt/wsys
killer $pid &
wctl
'