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