]> git.lizzy.rs Git - plan9front.git/blobdiff - rc/bin/window
nusbrc: delect lenovo camera
[plan9front.git] / rc / bin / window
index e6dce9262e387fe6e187bbe63203c1201caa1b43..06022a127dba05ac5af6545af8d749236cb2aa92 100755 (executable)
 #!/bin/rc
 # window [many options] cmd [arg...] - create new window and run cmd in it
 rfork e
-fn checkwsys{
-       if(~ $wsys ''){
-               echo  'window: $wsys not defined'
-               exit bad
-       }
-}
 
-# original version used mount to do the work
-fn oldway{
-       switch($#*){
-       case 0 1
-               echo usage: window '''minx miny maxx maxy''' cmd args ...
-               exit usage
-       }
-       
-       checkwsys
-       
-       dir = /mnt/wsys
-       srv = $wsys
-       
-       rfork ne
-       {
-               if(x=`{cat /dev/ppid}; mount $srv $dir N`{{echo $x $1 }| sed 's/^ //g;s/ +/,/g'}){
+cmd=()
+spec=()
+wdir=()
+wpid=()
+mflag=()
+xflag=()
+argv0=$0
+
+if(~ $1 *[0-9][' ,'][0-9]*){
+       # old syntax: '100 100 200 200' or '100,100,200,200'
+       spec=(-r `{echo $1 | sed 's/,/ /g'})
+       shift
+       mflag=1
+}
+if not {
+       while(~ $1 -* && ~ $#xflag 0)
+               switch($1){
+               case -hide -scroll -noscroll
+                       spec=($spec $1)
+                       shift
+               case -dx -dy -minx -miny -maxx -maxy
+                       spec=($spec $1 $2)
+                       shift 2
+               case -r
+                       spec=($spec $1 $2 $3 $4 $5)
+                       shift 5
+               case -cd
+                       wdir=$2
+                       shift 2
+               case -pid
+                       wpid=$2
+                       shift 2
+               case -m
+                       mflag=1
+                       shift
+               case -x
+                       xflag=1
                        shift
-                       bind -b $dir /dev
-                       echo -n `{basename $1} > /dev/label >[2] /dev/null
-                       exec $* < /dev/cons > /dev/cons >[2] /dev/cons
+               case *
+                       echo usage: $argv0 '[ -m ] [ -r minx miny maxx maxy ]' \
+                       '[ -dx n ] [ -dy n ] [ -minx n ] [ -miny n ] [ -maxx n ] [ -maxy n ]' \
+                       '[ -cd dir ] [ -hide ] [ -scroll ] [ -noscroll ] [ cmd arg ... ]' >[1=2]
+                       exit usage
                }
-       }&
 }
 
-# if argument is of form '100 100 200 200' or '100,100,200,200' use old way
-if(~ $1 *[0-9][' ,'][0-9]*){
-       oldway $*
-       exit
+if(~ $#* 0) cmd=rc
+if not cmd=$*
+
+if(~ $#xflag 1){
+       echo -n `{basename $cmd(1)} >/dev/label >[2]/dev/null
+       rm -f /env/^(cmd spec wdir wpid mflag xflag argv0)
+       exec $cmd
+       exit exec
 }
 
-# geometry parameters are:
-#      -r 0 0 100 100
-#      -dx n
-#      -dy n
-#      -minx n
-#      -miny n
-#      -maxx n
-#      -maxy n
-# where n can be a number, to set the value, or +number or -number to change it
+if(~ $#mflag 1) {
+       if(~ $wsys ''){
+               echo $argv0: '$wsys' not defined >[1=2]
+               exit bad
+       }
 
-# find wctl file
-fn getwctl{
-       if(~ $wctl ''){
-               if(test -f /dev/wctl) echo /dev/wctl
-               if not if(test -f /mnt/term/dev/wctl) echo /mnt/term/dev/wctl
-               if not if(~ $service cpu) echo /mnt/term/srv/riowctl.*.*
+       {
+               rfork n
+
+               if(~ $wsys /srv/*){
+                       if(~ $#wpid 0)
+                               wpid=`{cat /dev/ppid}
+                       spec=($spec -pid $wpid)
+               }
+               if(~ $#wdir 0){
+                       wdir=`{pwd}
+               }
                if not {
-                       echo window: '$wctl' not defined >[1=2]
-                       exit usage
+                       builtin cd $wdir
                }
-       }
-       if not echo $wctl
-}
+               spec=($spec -cd $wdir)
 
-# use mount to make local window
-if(~ $1 -m){
-       shift
-
-       checkwsys
-       
-       dir = /mnt/wsys
-       srv = $wsys
-       rfork ne
-       {
-               unmount /mnt/acme /dev >[2]/dev/null
-               if(mount $srv $dir 'new -pid '^`{cat /dev/ppid}^' '$"*){
-                       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 = rc
-                       if not cmd = $*
-                       echo -n `{basename $cmd(1)} > /dev/label >[2] /dev/null
-                       exec $cmd < /dev/cons > /dev/cons >[2] /dev/cons
+               {unmount /mnt/acme /dev; unmount $wsys /dev} >[2]/dev/null
+               if(mount $wsys /mnt/wsys 'new '$"spec){
+                       bind -b /mnt/wsys /dev
+                       exec $argv0 -x $cmd </dev/cons >/dev/cons >[2]/dev/cons
                }
        }&
+       exit ''
 }
+if not {
+       if(~ $wctl ''){
+               if(test -f /dev/wctl) wctl=/dev/wctl
+               if not if(test -f /mnt/term/dev/wctl) wctl=/mnt/term/dev/wctl
+               if not if(test -r /mnt/term/env/wctl) wctl=/mnt/term^`{cat /mnt/term/env/wctl}
+               if not {
+                       echo $argv0: '$wctl' not defined >[1=2]
+                       exit bad
+               }
+       }
 
-if not echo new -cd `{pwd} $* >> `{getwctl}
+       if(! ~ $#wdir 0)
+               spec=($spec -cd $wdir)
+       echo new $spec $argv0 -x $cmd >>$wctl
+}