xref: /plan9/rc/bin/window (revision 43aadf5e5598b9159a98f64e309c3ae860328a56)
1#!/bin/rc
2# window [many options] cmd [arg...] - create new window and run cmd in it
3rfork e
4fn checkwsys{
5	if(~ $wsys ''){
6		echo  'window: $wsys not defined'
7		exit bad
8	}
9}
10
11# original version used mount to do the work
12fn oldway{
13	switch($#*){
14	case 0 1
15		echo usage: window '''minx miny maxx maxy''' cmd args ...
16		exit usage
17	}
18
19	checkwsys
20
21	dir = /mnt/wsys
22	srv = $wsys
23
24	rfork ne
25	{
26		if(x=`{cat /dev/ppid}; mount $srv $dir N`{{echo $x $1 }| sed 's/^ //g;s/ +/,/g'}){
27			shift
28			bind -b $dir /dev
29			echo -n `{basename $1} > /dev/label >[2] /dev/null
30			exec $* < /dev/cons > /dev/cons >[2] /dev/cons
31		}
32	}&
33}
34
35# if argument is of form '100 100 200 200' or '100,100,200,200' use old way
36if(~ $1 *[0-9][' ,'][0-9]*){
37	oldway $*
38	exit
39}
40
41# geometry parameters are:
42#	-r 0 0 100 100
43#	-dx n
44#	-dy n
45#	-minx n
46#	-miny n
47#	-maxx n
48#	-maxy n
49# where n can be a number, to set the value, or +number or -number to change it
50
51# find wctl file
52fn getwctl{
53	if(~ $wctl ''){
54		if(test -f /dev/wctl) echo /dev/wctl
55		if not if(test -f /mnt/term/dev/wctl) echo /mnt/term/dev/wctl
56		if not if(~ $service cpu) echo /mnt/term/srv/riowctl.*.*
57		if not {
58			echo window: '$wctl' not defined >[1=2]
59			exit usage
60		}
61	}
62	if not echo $wctl
63}
64
65# use mount to make local window
66if(~ $1 -m){
67	shift
68
69	checkwsys
70
71	dir = /mnt/wsys
72	srv = $wsys
73	rfork ne
74	{
75		unmount /mnt/acme /dev >[2]/dev/null
76		if(mount $srv $dir 'new -pid '^`{cat /dev/ppid}^' '$"*){
77			bind -b $dir /dev
78			# toss geometry parameters to find command
79			while(~ $1 -*)
80				switch($1){
81				case -dx -dy -minx -miny -maxx -maxy
82					shift 2
83				case -r
84					shift 5
85				case -scroll
86					shift
87				case -noscroll
88					shift
89				case -hide
90					shift
91				}
92			if(~ $#* 0) cmd = rc
93			if not cmd = $*
94			echo -n `{basename $cmd(1)} > /dev/label >[2] /dev/null
95			exec $cmd < /dev/cons > /dev/cons >[2] /dev/cons
96		}
97	}&
98}
99
100if not echo new -cd `{pwd} $* >> `{getwctl}
101