xref: /original-bsd/usr.bin/window/cmd5.c (revision c3e32dec)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Edward Wang at The University of California, Berkeley.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #ifndef lint
12 static char sccsid[] = "@(#)cmd5.c	8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14 
15 #include "defs.h"
16 
17 /*
18  * Window movement.
19  */
20 
21 c_move(w)
22 register struct ww *w;
23 {
24 	int col, row;
25 	int mincol, minrow;
26 	int maxcol, maxrow;
27 	int curcol, currow;
28 
29 	if (!terse)
30 		wwputs("New window position: ", cmdwin);
31 	col = w->ww_w.l;
32 	row = w->ww_w.t;
33 	wwadd(boxwin, framewin->ww_back);
34 	for (;;) {
35 		wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
36 		getminmax(row, w->ww_w.nr, 1, wwnrow,
37 			&currow, &minrow, &maxrow);
38 		getminmax(col, w->ww_w.nc, 0, wwncol,
39 			&curcol, &mincol, &maxcol);
40 		wwsetcursor(currow, curcol);
41 		while (wwpeekc() < 0)
42 			wwiomux();
43 		switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
44 		case 3:
45 			wwunbox(boxwin);
46 			wwdelete(boxwin);
47 			return;
48 		case 2:
49 			wwunbox(boxwin);
50 			break;
51 		case 1:
52 			wwunbox(boxwin);
53 		case 0:
54 			continue;
55 		}
56 		break;
57 	}
58 	wwdelete(boxwin);
59 	if (!terse)
60 		wwputc('\n', cmdwin);
61 	wwcurtowin(cmdwin);
62 	movewin(w, row, col);
63 }
64 
65 movewin(w, row, col)
66 register struct ww *w;
67 {
68 	struct ww *back = w->ww_back;
69 
70 	w->ww_alt.t = w->ww_w.t;
71 	w->ww_alt.l = w->ww_w.l;
72 	wwdelete(w);
73 	wwmove(w, row, col);
74 	wwadd(w, back);
75 	reframe();
76 }
77 
78 /*
79  * Weird stufff, don't ask.
80  */
81 getminmax(x, n, a, b, curx, minx, maxx)
82 register x, n, a, b;
83 int *curx, *minx, *maxx;
84 {
85 	if (x < 0)
86 		*curx = x + n - 1;
87 	else
88 		*curx = x;
89 
90 	if (x <= a)
91 		*minx = 1 - n;
92 	else if (x <= b - n)
93 		*minx = a;
94 	else
95 		*minx = b - n;
96 
97 	if (x >= b - n)
98 		*maxx = b - 1;
99 	else if (x >= a)
100 		*maxx = b - n;
101 	else
102 		*maxx = a;
103 }
104