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