1 #ifndef lint 2 static char *sccsid = "@(#)cmd1.c 3.1 83/08/11"; 3 #endif 4 5 #include "defs.h" 6 7 c_window() 8 { 9 int col, row, xcol, xrow; 10 int id; 11 12 if ((id = findid()) < 0) { 13 error("Too many windows."); 14 return; 15 } 16 if (!terse) 17 (void) wwputs("Upper left corner: ", cmdwin); 18 col = 0; 19 row = 1; 20 for (;;) { 21 wwsetcursor(row, col); 22 while (bpeekc() < 0) 23 bread(); 24 switch (getpos(&row, &col, 1, 0)) { 25 case -1: 26 /* 27 WBoxActive = 0; 28 */ 29 if (!terse) 30 (void) wwputs("\r\nCancelled. ", cmdwin); 31 return; 32 case 1: 33 break; 34 case 0: 35 continue; 36 } 37 break; 38 } 39 if (!terse) 40 (void) wwputs("\r\nLower right corner: ", cmdwin); 41 xcol = col; 42 xrow = row; 43 for (;;) { 44 /* 45 Wbox(col, row, xcol - col + 1, xrow - row + 1); 46 */ 47 wwsetcursor(xrow, xcol); 48 wwflush(); 49 while (bpeekc() < 0) 50 bread(); 51 switch (getpos(&xrow, &xcol, row, col)) { 52 case -1: 53 /* 54 WBoxActive = 0; 55 */ 56 if (!terse) 57 (void) wwputs("\r\nCancelled. ", cmdwin); 58 return; 59 case 1: 60 break; 61 case 0: 62 continue; 63 } 64 break; 65 } 66 /* 67 WBoxActive = 0; 68 */ 69 if (!terse) 70 (void) wwputs("\r\n", cmdwin); 71 wwcurtowin(cmdwin); 72 if (openwin(id, xrow-row+1, xcol-col+1, row, col) == 0) 73 error("Can't open window."); 74 } 75 76 findid() 77 { 78 register i; 79 80 for (i = 0; i < NWINDOW && window[i] != 0; i++) 81 ; 82 return i < NWINDOW ? i : -1; 83 } 84 85 getpos(row, col, minrow, mincol) 86 register int *row, *col, minrow, mincol; 87 { 88 static int scount = 0; 89 int count; 90 char c; 91 92 while ((c = bgetc()) >= 0) { 93 switch (c) { 94 case '0': case '1': case '2': case '3': case '4': 95 case '5': case '6': case '7': case '8': case '9': 96 scount = scount * 10 + c - '0'; 97 continue; 98 } 99 count = scount ? scount : 1; 100 scount = 0; 101 switch (c) { 102 case 'h': 103 if ((*col -= count) < mincol) 104 *col = mincol; 105 break; 106 case 'H': 107 *col = mincol; 108 break; 109 case 'l': 110 if ((*col += count) >= wwncol) 111 *col = wwncol - 1; 112 break; 113 case 'L': 114 *col = wwncol - 1; 115 break; 116 case 'j': 117 if ((*row += count) >= wwnrow) 118 *row = wwnrow - 1; 119 break; 120 case 'J': 121 *row = wwnrow - 1; 122 break; 123 case 'k': 124 if ((*row -= count) < minrow) 125 *row = minrow; 126 break; 127 case 'K': 128 *row = minrow; 129 break; 130 case CTRL([): 131 return -1; 132 case '\r': 133 return 1; 134 default: 135 if (!terse) 136 (void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); 137 wwbell(); 138 } 139 } 140 return 0; 141 } 142 143 struct ww * 144 openwin(id, nrow, ncol, row, col) 145 int id, nrow, ncol, row, col; 146 { 147 register struct ww *w; 148 149 if (row <= 0) 150 return 0; 151 if (id < 0 && (id = findid()) < 0) 152 return 0; 153 if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, 0)) == 0) 154 return 0; 155 w->ww_id = id; 156 window[id] = w; 157 w->ww_hasframe = 1; 158 wwadd(w, (selwin ? selwin : wwhead.ww_back)); 159 setselwin(w); 160 switch (wwfork(w)) { 161 case -1: 162 c_close(w); 163 return 0; 164 case 0: 165 execl(shell, shellname, 0); 166 perror(shell); 167 exit(1); 168 } 169 return w; 170 } 171 172 reframe() 173 { 174 register struct ww *w; 175 176 wwunframe(framewin); 177 for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 178 if (w->ww_hasframe) 179 wwframe(w, framewin); 180 for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 181 if (w->ww_hasframe) 182 labelwin(w); 183 } 184