Commit | Line | Data |
---|---|---|
60de5df9 | 1 | /* |
e5a7f825 KB |
2 | * Copyright (c) 1983, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
46e9ea25 | 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 |
e5a7f825 | 12 | static char sccsid[] = "@(#)cmd5.c 8.1 (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 |
21 | c_move(w) |
22 | register 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 | ||
65 | movewin(w, row, col) | |
66 | register 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 | */ | |
81 | getminmax(x, n, a, b, curx, minx, maxx) | |
82 | register x, n, a, b; | |
83 | int *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 | } |