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