113977Sedward #ifndef lint 2*14893Sedward static char *sccsid = "@(#)cmd.c 3.10 83/09/01"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward docmd() 813977Sedward { 913977Sedward register char c; 1013977Sedward register struct ww *w; 1113977Sedward 1214177Sedward if (!terse) 1314407Sedward wwadd(cmdwin, &wwhead); 1414071Sedward if (selwin != 0) 1514764Sedward wwcursor(selwin, 1); 16*14893Sedward for (;;) { 17*14893Sedward while ((c = bgetc()) >= 0) { 18*14893Sedward if (!terse) 19*14893Sedward (void) wwputs("\r\n", cmdwin); 20*14893Sedward switch (c) { 21*14893Sedward default: 22*14893Sedward if (c == escapec) 23*14893Sedward goto foo; 2413977Sedward break; 25*14893Sedward case 'h': case 'j': case 'k': case 'l': 26*14893Sedward case CTRL(y): 27*14893Sedward case CTRL(e): 28*14893Sedward case CTRL(u): 29*14893Sedward case CTRL(d): 30*14893Sedward case CTRL(b): 31*14893Sedward case CTRL(f): 32*14893Sedward case CTRL(s): 33*14893Sedward case CTRL(q): 34*14893Sedward case CTRL([): 35*14893Sedward foo: 36*14893Sedward if (selwin == 0) { 37*14893Sedward error("No window."); 38*14893Sedward continue; 39*14893Sedward } 4013977Sedward } 41*14893Sedward switch (c) { 42*14893Sedward case '1': case '2': case '3': case '4': case '5': 43*14893Sedward case '6': case '7': case '8': case '9': 44*14893Sedward if ((w = window[c - '1']) == 0) { 45*14893Sedward wwbell(); 46*14893Sedward break; 47*14893Sedward } 4814184Sedward setselwin(w); 49*14893Sedward if (checkproc(selwin) >= 0) 50*14893Sedward incmd = 0; 51*14893Sedward break; 52*14893Sedward case '%': 53*14893Sedward if ((w = getwin()) != 0) 54*14893Sedward setselwin(w); 55*14893Sedward break; 56*14893Sedward case 'c': 57*14893Sedward if ((w = getwin()) != 0) 58*14893Sedward c_close(w); 59*14893Sedward break; 60*14893Sedward case 'C': 61*14893Sedward c_close((struct ww *)0); 62*14893Sedward break; 63*14893Sedward case 'w': 64*14893Sedward c_window(); 65*14893Sedward break; 66*14893Sedward case 'm': 67*14893Sedward if ((w = getwin()) != 0) 68*14893Sedward c_move(w); 69*14893Sedward break; 70*14893Sedward case 'S': 71*14893Sedward c_show(); 72*14893Sedward break; 73*14893Sedward case 'L': 74*14893Sedward c_list(); 75*14893Sedward break; 76*14893Sedward case ':': 77*14893Sedward c_colon(); 78*14893Sedward break; 79*14893Sedward case 'h': 80*14893Sedward (void) wwwrite(selwin, "\b", 1); 81*14893Sedward break; 82*14893Sedward case 'j': 83*14893Sedward (void) wwwrite(selwin, "\n", 1); 84*14893Sedward break; 85*14893Sedward case 'k': 86*14893Sedward (void) wwwrite(selwin, "\033A", 2); 87*14893Sedward break; 88*14893Sedward case 'l': 89*14893Sedward (void) wwwrite(selwin, "\033C", 2); 90*14893Sedward break; 91*14893Sedward case CTRL(e): 92*14893Sedward wwscroll(selwin, 1); 93*14893Sedward break; 94*14893Sedward case CTRL(y): 95*14893Sedward wwscroll(selwin, -1); 96*14893Sedward break; 97*14893Sedward case CTRL(d): 98*14893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 99*14893Sedward break; 100*14893Sedward case CTRL(u): 101*14893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 102*14893Sedward break; 103*14893Sedward case CTRL(f): 104*14893Sedward wwscroll(selwin, selwin->ww_w.nr); 105*14893Sedward break; 106*14893Sedward case CTRL(b): 107*14893Sedward wwscroll(selwin, - selwin->ww_w.nr); 108*14893Sedward break; 109*14893Sedward case CTRL(s): 110*14893Sedward (void) write(selwin->ww_pty, 111*14893Sedward &wwwintty.ww_tchars.t_stopc, 1); 112*14893Sedward break; 113*14893Sedward case CTRL(q): 114*14893Sedward (void) write(selwin->ww_pty, 115*14893Sedward &wwwintty.ww_tchars.t_startc, 1); 116*14893Sedward break; 117*14893Sedward case CTRL(l): 118*14893Sedward wwredraw(); 119*14893Sedward break; 120*14893Sedward case '?': 121*14893Sedward c_help(); 122*14893Sedward break; 123*14893Sedward case CTRL([): 124*14893Sedward if (checkproc(selwin) >= 0) 125*14893Sedward incmd = 0; 126*14893Sedward break; 127*14893Sedward case CTRL(z): 128*14893Sedward wwsuspend(); 129*14893Sedward break; 130*14893Sedward case 'q': 131*14893Sedward c_quit(); 132*14893Sedward break; 133*14893Sedward /* undocumented commands */ 134*14893Sedward case 's': 135*14893Sedward c_stat(); 136*14893Sedward break; 137*14893Sedward case 't': 138*14893Sedward c_time(RUSAGE_SELF); 139*14893Sedward break; 140*14893Sedward case 'T': 141*14893Sedward c_time(RUSAGE_CHILDREN); 142*14893Sedward break; 143*14893Sedward /* debugging commands */ 144*14893Sedward case 'M': 145*14893Sedward if (!debug) 146*14893Sedward goto badcmd; 147*14893Sedward wwdumpsmap(); 148*14893Sedward break; 149*14893Sedward case 'V': 150*14893Sedward if (!debug) 151*14893Sedward goto badcmd; 152*14893Sedward if ((w = getwin()) != 0) 153*14893Sedward wwdumpnvis(w); 154*14893Sedward break; 155*14893Sedward case 'D': 156*14893Sedward if (!debug) 157*14893Sedward goto badcmd; 158*14893Sedward if ((w = getwin()) != 0) 159*14893Sedward wwdumpcov(w); 160*14893Sedward break; 161*14893Sedward case 'W': 162*14893Sedward if (!debug) 163*14893Sedward goto badcmd; 164*14893Sedward if ((w = getwin()) != 0) 165*14893Sedward wwdumpwin(w); 166*14893Sedward break; 167*14893Sedward default: 168*14893Sedward badcmd: 169*14893Sedward if (c == escapec) { 170*14893Sedward if (checkproc(selwin) >= 0) { 171*14893Sedward (void) write(selwin->ww_pty, 172*14893Sedward &escapec, 1); 173*14893Sedward incmd = 0; 174*14893Sedward } 175*14893Sedward } else { 176*14893Sedward if (!terse) 177*14893Sedward wwbell(); 178*14893Sedward error("Type ? for help."); 179*14893Sedward } 18014177Sedward } 181*14893Sedward } 182*14893Sedward if (!incmd || quit) 18313977Sedward break; 184*14893Sedward if (terse) 185*14893Sedward wwsetcursor(0, 0); 186*14893Sedward else { 187*14893Sedward (void) wwputs("Command: ", cmdwin); 188*14893Sedward wwcurtowin(cmdwin); 18913977Sedward } 190*14893Sedward while (bpeekc() < 0) 191*14893Sedward bread(); 19213977Sedward } 19314407Sedward if (!quit) { 19414407Sedward if (!terse) { 19514407Sedward wwdelete(cmdwin); 19614407Sedward reframe(); 19714407Sedward } 198*14893Sedward wwcursor(selwin, 0); 19914407Sedward } 20013977Sedward } 20113977Sedward 20213977Sedward struct ww * 20313977Sedward getwin() 20413977Sedward { 20513977Sedward register int c; 20614184Sedward struct ww *w = 0; 20713977Sedward 20814189Sedward if (!terse) 20914407Sedward (void) wwputs("Which window? ", cmdwin); 21014407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 21113994Sedward while ((c = bgetc()) < 0) 21213977Sedward bread(); 21314407Sedward if (debug && c == 'c') 21414407Sedward w = cmdwin; 21514407Sedward else if (debug && c == 'f') 21614407Sedward w = framewin; 21714795Sedward else if (debug && c == 'b') 21814795Sedward w = boxwin; 21914407Sedward else if (c >= '1' && c < NWINDOW + '1') 22014407Sedward w = window[c - '1']; 22114407Sedward if (w == 0) 22214407Sedward wwbell(); 22314189Sedward if (!terse) 22414407Sedward (void) wwputs("\r\n", cmdwin); 22513977Sedward return w; 22613977Sedward } 22713977Sedward 228*14893Sedward checkproc(w) 229*14893Sedward struct ww *w; 230*14893Sedward { 231*14893Sedward if (w->ww_state != WWS_HASPROC) { 232*14893Sedward error("No process in window."); 233*14893Sedward return -1; 234*14893Sedward } 235*14893Sedward return 0; 236*14893Sedward } 237*14893Sedward 23813977Sedward setselwin(w) 23914847Sedward struct ww *w; 24014847Sedward { 24114847Sedward if ((selwin = w) != 0) 24214847Sedward front(w); 24314847Sedward } 24414847Sedward 24514847Sedward front(w) 24613977Sedward register struct ww *w; 24713977Sedward { 24814847Sedward char moved = 0; 24914184Sedward 25014847Sedward while (w->ww_back != framewin) { 25114847Sedward wwmoveup(w); 25214847Sedward moved = 1; 25313977Sedward } 25414847Sedward if (moved) 25514847Sedward reframe(); 25613977Sedward } 25713977Sedward 25814847Sedward reframe() 25914847Sedward { 26014847Sedward register struct ww *w; 26114847Sedward 26214847Sedward wwunframe(framewin); 26314847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 26414847Sedward if (w->ww_hasframe) { 26514847Sedward wwframe(w, framewin); 26614847Sedward labelwin(w); 26714847Sedward } 26814847Sedward } 26914847Sedward 27014184Sedward labelwin(w) 27113977Sedward register struct ww *w; 27213977Sedward { 27314407Sedward int mode = w == selwin ? WWM_REV : 0; 27413977Sedward 27514407Sedward if (w->ww_id >= 0) { 27614407Sedward char buf[2]; 27714407Sedward 27814407Sedward buf[0] = w->ww_id + '1'; 27914407Sedward buf[1] = 0; 28014854Sedward wwlabel(w, framewin, 1, buf, mode); 28114407Sedward } 28214407Sedward if (w->ww_label) { 28314407Sedward int col; 28414407Sedward 28514407Sedward if (w->ww_center) { 28614407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 28714407Sedward col = MAX(3, col); 28814407Sedward } else 28914407Sedward col = 3; 29014854Sedward wwlabel(w, framewin, col, w->ww_label, mode); 29114407Sedward } 29213977Sedward } 293