1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)cmd5.c 3.16 (Berkeley) 06/29/88"; 20 #endif /* not lint */ 21 22 #include "defs.h" 23 24 /* 25 * Window movement. 26 */ 27 28 c_move(w) 29 register struct ww *w; 30 { 31 int col, row; 32 int mincol, minrow; 33 int maxcol, maxrow; 34 int curcol, currow; 35 36 if (!terse) 37 wwputs("New window position: ", cmdwin); 38 col = w->ww_w.l; 39 row = w->ww_w.t; 40 wwadd(boxwin, framewin->ww_back); 41 for (;;) { 42 wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2); 43 getminmax(row, w->ww_w.nr, 1, wwnrow, 44 &currow, &minrow, &maxrow); 45 getminmax(col, w->ww_w.nc, 0, wwncol, 46 &curcol, &mincol, &maxcol); 47 wwsetcursor(currow, curcol); 48 while (wwpeekc() < 0) 49 wwiomux(); 50 switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) { 51 case 3: 52 wwunbox(boxwin); 53 wwdelete(boxwin); 54 return; 55 case 2: 56 wwunbox(boxwin); 57 break; 58 case 1: 59 wwunbox(boxwin); 60 case 0: 61 continue; 62 } 63 break; 64 } 65 wwdelete(boxwin); 66 if (!terse) 67 wwputc('\n', cmdwin); 68 wwcurtowin(cmdwin); 69 movewin(w, row, col); 70 } 71 72 movewin(w, row, col) 73 register struct ww *w; 74 { 75 struct ww *back = w->ww_back; 76 77 w->ww_alt.t = w->ww_w.t; 78 w->ww_alt.l = w->ww_w.l; 79 wwdelete(w); 80 wwmove(w, row, col); 81 wwadd(w, back); 82 reframe(); 83 } 84 85 /* 86 * Weird stufff, don't ask. 87 */ 88 getminmax(x, n, a, b, curx, minx, maxx) 89 register x, n, a, b; 90 int *curx, *minx, *maxx; 91 { 92 if (x < 0) 93 *curx = x + n - 1; 94 else 95 *curx = x; 96 97 if (x <= a) 98 *minx = 1 - n; 99 else if (x <= b - n) 100 *minx = a; 101 else 102 *minx = b - n; 103 104 if (x >= b - n) 105 *maxx = b - 1; 106 else if (x >= a) 107 *maxx = b - n; 108 else 109 *maxx = a; 110 } 111