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[] = "@(#)cmd1.c 8.1 (Berkeley) 06/06/93"; 13 #endif /* not lint */ 14 15 #include "defs.h" 16 #include "char.h" 17 18 c_window() 19 { 20 int col, row, xcol, xrow; 21 int id; 22 23 if ((id = findid()) < 0) 24 return; 25 if (!terse) 26 wwputs("New window (upper left corner): ", cmdwin); 27 col = 0; 28 row = 1; 29 wwadd(boxwin, framewin->ww_back); 30 for (;;) { 31 wwbox(boxwin, row - 1, col - 1, 3, 3); 32 wwsetcursor(row, col); 33 while (wwpeekc() < 0) 34 wwiomux(); 35 switch (getpos(&row, &col, row > 1, 0, 36 wwnrow - 1, wwncol - 1)) { 37 case 3: 38 wwunbox(boxwin); 39 wwdelete(boxwin); 40 return; 41 case 2: 42 wwunbox(boxwin); 43 break; 44 case 1: 45 wwunbox(boxwin); 46 case 0: 47 continue; 48 } 49 break; 50 } 51 if (!terse) 52 wwputs("\nNew window (lower right corner): ", cmdwin); 53 xcol = col; 54 xrow = row; 55 for (;;) { 56 wwbox(boxwin, row - 1, col - 1, 57 xrow - row + 3, xcol - col + 3); 58 wwsetcursor(xrow, xcol); 59 while (wwpeekc() < 0) 60 wwiomux(); 61 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1)) 62 { 63 case 3: 64 wwunbox(boxwin); 65 wwdelete(boxwin); 66 return; 67 case 2: 68 wwunbox(boxwin); 69 break; 70 case 1: 71 wwunbox(boxwin); 72 case 0: 73 continue; 74 } 75 break; 76 } 77 wwdelete(boxwin); 78 if (!terse) 79 wwputc('\n', cmdwin); 80 wwcurtowin(cmdwin); 81 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline, 82 (char *) 0, 1, 1, default_shellfile, default_shell); 83 } 84 85 getpos(row, col, minrow, mincol, maxrow, maxcol) 86 register int *row, *col; 87 int minrow, mincol; 88 int maxrow, maxcol; 89 { 90 static int scount; 91 int count; 92 char c; 93 int oldrow = *row, oldcol = *col; 94 95 while ((c = wwgetc()) >= 0) { 96 switch (c) { 97 case '0': case '1': case '2': case '3': case '4': 98 case '5': case '6': case '7': case '8': case '9': 99 scount = scount * 10 + c - '0'; 100 continue; 101 } 102 count = scount ? scount : 1; 103 scount = 0; 104 switch (c) { 105 case 'h': 106 if ((*col -= count) < mincol) 107 *col = mincol; 108 break; 109 case 'H': 110 *col = mincol; 111 break; 112 case 'l': 113 if ((*col += count) > maxcol) 114 *col = maxcol; 115 break; 116 case 'L': 117 *col = maxcol; 118 break; 119 case 'j': 120 if ((*row += count) > maxrow) 121 *row = maxrow; 122 break; 123 case 'J': 124 *row = maxrow; 125 break; 126 case 'k': 127 if ((*row -= count) < minrow) 128 *row = minrow; 129 break; 130 case 'K': 131 *row = minrow; 132 break; 133 case ctrl('['): 134 if (!terse) 135 wwputs("\nCancelled. ", cmdwin); 136 return 3; 137 case '\r': 138 return 2; 139 default: 140 if (!terse) 141 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); 142 wwbell(); 143 } 144 } 145 return oldrow != *row || oldcol != *col; 146 } 147