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
c_move(w)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
movewin(w,row,col)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 */
getminmax(x,n,a,b,curx,minx,maxx)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