113977Sedward #ifndef lint 2*14764Sedward static char *sccsid = "@(#)cmd.c 3.4 83/08/19"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward struct ww *getwin(); 813977Sedward 913977Sedward docmd() 1013977Sedward { 1113977Sedward register char c; 1213977Sedward register struct ww *w; 1313977Sedward 1414177Sedward if (!terse) 1514407Sedward wwadd(cmdwin, &wwhead); 1614071Sedward if (selwin != 0) 17*14764Sedward wwcursor(selwin, 1); 1814189Sedward top: 1913977Sedward while ((c = bgetc()) >= 0) { 2014189Sedward if (!terse) 2114407Sedward (void) wwputs("\r\n", cmdwin); 2213977Sedward switch (c) { 2314177Sedward default: 2414177Sedward if (c == escapec) 2514177Sedward goto foo; 2614177Sedward break; 2714071Sedward case 'h': case 'j': case 'k': case 'l': 2814711Sedward case CTRL(y): 2914711Sedward case CTRL(e): 3014071Sedward case CTRL(u): 3114071Sedward case CTRL(d): 3214071Sedward case CTRL(b): 3314071Sedward case CTRL(f): 3414694Sedward case CTRL(s): 3514694Sedward case CTRL(q): 3613977Sedward case CTRL([): 3714177Sedward foo: 3813977Sedward if (selwin == 0) { 3914407Sedward error("No window."); 4013977Sedward continue; 4113977Sedward } 4213977Sedward } 4313977Sedward switch (c) { 4413977Sedward case '1': case '2': case '3': case '4': case '5': 4513977Sedward case '6': case '7': case '8': case '9': 4614407Sedward if ((w = window[c - '1']) == 0) { 4714407Sedward wwbell(); 4813977Sedward break; 4913977Sedward } 5013977Sedward setselwin(w); 5113977Sedward goto out; 5213977Sedward case '%': 5314184Sedward if ((w = getwin()) != 0) 5414184Sedward setselwin(w); 5513977Sedward break; 5613977Sedward case 'c': 5714184Sedward if ((w = getwin()) != 0) 5814407Sedward c_close(w); 5914071Sedward break; 6013977Sedward case 'C': 6114407Sedward c_close((struct ww *)0); 6214071Sedward break; 6313977Sedward case 'w': 6414407Sedward c_window(); 6513977Sedward break; 6614184Sedward case 'S': 6714407Sedward c_show(); 6813994Sedward break; 6914189Sedward case 'L': 7014407Sedward c_list(); 7114189Sedward break; 7214407Sedward case 's': 7314407Sedward c_stat(); 7414177Sedward break; 7514407Sedward case 'M': 7614407Sedward wwdumpsmap(); 7714184Sedward break; 7814407Sedward case 'V': 7914407Sedward if ((w = getwin()) != 0) 8014407Sedward wwdumpnvis(w); 8113977Sedward break; 8214407Sedward case 'D': 8314407Sedward if ((w = getwin()) != 0) 8414407Sedward wwdumpcov(w); 8513977Sedward break; 8614407Sedward case 'W': 8714407Sedward if ((w = getwin()) != 0) 8814407Sedward wwdumpwin(w); 8914080Sedward break; 9013977Sedward case 't': 9114407Sedward c_time(RUSAGE_SELF); 9213977Sedward break; 9313977Sedward case 'T': 9414407Sedward c_time(RUSAGE_CHILDREN); 9513977Sedward break; 9614184Sedward case ':': 9714407Sedward c_colon(); 9814184Sedward break; 9914071Sedward case 'h': 10014407Sedward (void) wwwrite(selwin, "\b", 1); 10114071Sedward break; 10214071Sedward case 'j': 10314407Sedward (void) wwwrite(selwin, "\n", 1); 10414071Sedward break; 10514071Sedward case 'k': 10614407Sedward (void) wwwrite(selwin, "\033A", 2); 10714071Sedward break; 10814071Sedward case 'l': 10914407Sedward (void) wwwrite(selwin, "\033C", 2); 11014071Sedward break; 11114711Sedward case CTRL(e): 11214711Sedward wwscroll(selwin, 1); 11314711Sedward break; 11414711Sedward case CTRL(y): 11514711Sedward wwscroll(selwin, -1); 11614711Sedward break; 11714071Sedward case CTRL(d): 11814711Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11914071Sedward break; 12014071Sedward case CTRL(u): 12114711Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 12214071Sedward break; 12314071Sedward case CTRL(f): 12414711Sedward wwscroll(selwin, selwin->ww_w.nr); 12514071Sedward break; 12614071Sedward case CTRL(b): 12714711Sedward wwscroll(selwin, - selwin->ww_w.nr); 12814071Sedward break; 12914694Sedward case CTRL(s): 13014694Sedward (void) write(selwin->ww_pty, 13114694Sedward &wwwintty.ww_tchars.t_stopc, 1); 13214694Sedward break; 13314694Sedward case CTRL(q): 13414694Sedward (void) write(selwin->ww_pty, 13514694Sedward &wwwintty.ww_tchars.t_startc, 1); 13614694Sedward break; 13713977Sedward case CTRL(l): 13814407Sedward wwredraw(); 13913977Sedward break; 14013977Sedward case '?': 14114407Sedward c_help(); 14213977Sedward break; 14313977Sedward case CTRL([): 14413977Sedward goto out; 14513977Sedward case CTRL(z): 14613977Sedward wwsuspend(); 14713977Sedward break; 14814189Sedward case 'q': 14914407Sedward c_quit(); 15014025Sedward if (quit) 15114025Sedward goto out; 15214025Sedward break; 15314189Sedward case '.': 15414407Sedward error("Use q to quit."); 15514189Sedward break; 15613977Sedward default: 15714177Sedward if (c == escapec) { 15814407Sedward (void) write(selwin->ww_pty, &escapec, 1); 15914177Sedward goto out; 16014177Sedward } 16114189Sedward if (!terse) 16214407Sedward wwbell(); 16314407Sedward error("Type ? for help."); 16413977Sedward break; 16513977Sedward } 16613977Sedward } 16714189Sedward if (terse) 16814189Sedward wwsetcursor(0, 0); 16914189Sedward else { 17014189Sedward if (!terse) 17114407Sedward (void) wwputs("Command: ", cmdwin); 17214407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 17314189Sedward } 17413994Sedward while (bpeekc() < 0) 17513977Sedward bread(); 17613977Sedward goto top; 17713977Sedward out: 17814407Sedward if (!quit) { 17914407Sedward curwin = selwin; 18014407Sedward if (!terse) { 18114407Sedward wwdelete(cmdwin); 18214407Sedward reframe(); 18314407Sedward } 18414407Sedward } 18514071Sedward if (selwin != 0) 186*14764Sedward wwcursor(selwin, 0); 18713977Sedward } 18813977Sedward 18913977Sedward struct ww * 19013977Sedward getwin() 19113977Sedward { 19213977Sedward register int c; 19314184Sedward struct ww *w = 0; 19413977Sedward 19514189Sedward if (!terse) 19614407Sedward (void) wwputs("Which window? ", cmdwin); 19714407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 19813994Sedward while ((c = bgetc()) < 0) 19913977Sedward bread(); 20014407Sedward if (debug && c == 'c') 20114407Sedward w = cmdwin; 20214407Sedward else if (debug && c == 'f') 20314407Sedward w = framewin; 20414407Sedward else if (c >= '1' && c < NWINDOW + '1') 20514407Sedward w = window[c - '1']; 20614407Sedward if (w == 0) 20714407Sedward wwbell(); 20814189Sedward if (!terse) 20914407Sedward (void) wwputs("\r\n", cmdwin); 21013977Sedward return w; 21113977Sedward } 21213977Sedward 21313977Sedward setselwin(w) 21413977Sedward register struct ww *w; 21513977Sedward { 21614407Sedward register struct ww *oldselwin = selwin; 21714184Sedward 21814184Sedward if (w == oldselwin) 21914184Sedward return; 22014071Sedward if (selwin = w) { 22114407Sedward wwdelete(w); 22214407Sedward /* 22314407Sedward * Stick it in front of the old selected window, 22414407Sedward * or behind everbody else. 22514407Sedward */ 22614407Sedward wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); 22713977Sedward } 22814407Sedward reframe(); 22913977Sedward } 23013977Sedward 23114184Sedward labelwin(w) 23213977Sedward register struct ww *w; 23313977Sedward { 23414407Sedward int mode = w == selwin ? WWM_REV : 0; 23513977Sedward 23614407Sedward if (w->ww_id >= 0) { 23714407Sedward char buf[2]; 23814407Sedward 23914407Sedward buf[0] = w->ww_id + '1'; 24014407Sedward buf[1] = 0; 24114407Sedward (void) wwlabel(w, framewin, 1, buf, mode); 24214407Sedward } 24314407Sedward if (w->ww_label) { 24414407Sedward int col; 24514407Sedward 24614407Sedward if (w->ww_center) { 24714407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 24814407Sedward col = MAX(3, col); 24914407Sedward } else 25014407Sedward col = 3; 25114407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 25214407Sedward } 25313977Sedward } 254