]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/window
merge
[plan9front.git] / rc / bin / window
1 #!/bin/rc
2 # window [many options] cmd [arg...] - create new window and run cmd in it
3 rfork e
4
5 cmd=()
6 spec=()
7 wdir=()
8 wpid=()
9 mflag=()
10 xflag=()
11 argv0=$0
12
13 if(~ $1 *[0-9][' ,'][0-9]*){
14         # old syntax: '100 100 200 200' or '100,100,200,200'
15         spec=(-r `{echo $1 | sed 's/,/ /g'})
16         shift
17         mflag=1
18 }
19 if not {
20         while(~ $1 -* && ~ $#xflag 0)
21                 switch($1){
22                 case -hide -scroll -noscroll
23                         spec=($spec $1)
24                         shift
25                 case -dx -dy -minx -miny -maxx -maxy
26                         spec=($spec $1 $2)
27                         shift 2
28                 case -r
29                         spec=($spec $1 $2 $3 $4 $5)
30                         shift 5
31                 case -cd
32                         wdir=$2
33                         shift 2
34                 case -pid
35                         wpid=$2
36                         shift 2
37                 case -m
38                         mflag=1
39                         shift
40                 case -x
41                         xflag=1
42                         shift
43                 case *
44                         echo usage: $argv0 '[ -m ] [ -r minx miny maxx maxy ]' \
45                         '[ -dx n ] [ -dy n ] [ -minx n ] [ -miny n ] [ -maxx n ] [ -maxy n ]' \
46                         '[ -cd dir ] [ -hide ] [ -scroll ] [ -noscroll ] [ cmd arg ... ]' >[1=2]
47                         exit usage
48                 }
49 }
50
51 if(~ $#* 0) cmd=rc
52 if not cmd=$*
53
54 if(~ $#xflag 1){
55         echo -n `{basename $cmd(1)} >/dev/label >[2]/dev/null
56         rm -f /env/^(cmd spec wdir wpid mflag xflag argv0)
57         exec $cmd
58         exit exec
59 }
60
61 if(~ $#mflag 1) {
62         if(~ $wsys ''){
63                 echo $argv0: '$wsys' not defined >[1=2]
64                 exit bad
65         }
66
67         {
68                 rfork n
69
70                 if(~ $wsys /srv/*){
71                         if(~ $#wpid 0)
72                                 wpid=`{cat /dev/ppid}
73                         spec=($spec -pid $wpid)
74                 }
75                 if(~ $#wdir 0){
76                         wdir=`{pwd}
77                 }
78                 if not {
79                         builtin cd $wdir
80                 }
81                 spec=($spec -cd $wdir)
82
83                 {unmount /mnt/acme /dev; unmount $wsys /dev} >[2]/dev/null
84                 if(mount $wsys /mnt/wsys 'new '$"spec){
85                         bind -b /mnt/wsys /dev
86                         exec $argv0 -x $cmd </dev/cons >/dev/cons >[2]/dev/cons
87                 }
88         }&
89 }
90 if not {
91         if(~ $wctl ''){
92                 if(test -f /dev/wctl) wctl=/dev/wctl
93                 if not if(test -f /mnt/term/dev/wctl) wctl=/mnt/term/dev/wctl
94                 if not if(test -r /mnt/term/env/wctl) wctl=/mnt/term^`{cat /mnt/term/env/wctl}
95                 if not {
96                         echo $argv0: '$wctl' not defined >[1=2]
97                         exit bad
98                 }
99         }
100
101         if(! ~ $#wdir 0)
102                 spec=($spec -cd $wdir)
103         echo new $spec $argv0 -x $cmd >>$wctl
104 }