113977Sedward #ifndef lint 2*14711Sedward static char *sccsid = "@(#)cmd.c 3.3 83/08/18"; 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); 1614407Sedward /* 1714071Sedward if (selwin != 0) 1814071Sedward Woncursor(selwin->ww_win, 1); 1914407Sedward */ 2014189Sedward top: 2113977Sedward while ((c = bgetc()) >= 0) { 2214189Sedward if (!terse) 2314407Sedward (void) wwputs("\r\n", cmdwin); 2413977Sedward switch (c) { 2514177Sedward default: 2614177Sedward if (c == escapec) 2714177Sedward goto foo; 2814177Sedward break; 2914071Sedward case 'h': case 'j': case 'k': case 'l': 30*14711Sedward case CTRL(y): 31*14711Sedward case CTRL(e): 3214071Sedward case CTRL(u): 3314071Sedward case CTRL(d): 3414071Sedward case CTRL(b): 3514071Sedward case CTRL(f): 3614694Sedward case CTRL(s): 3714694Sedward case CTRL(q): 3813977Sedward case CTRL([): 3914177Sedward foo: 4013977Sedward if (selwin == 0) { 4114407Sedward error("No window."); 4213977Sedward continue; 4313977Sedward } 4413977Sedward } 4513977Sedward switch (c) { 4613977Sedward case '1': case '2': case '3': case '4': case '5': 4713977Sedward case '6': case '7': case '8': case '9': 4814407Sedward if ((w = window[c - '1']) == 0) { 4914407Sedward wwbell(); 5013977Sedward break; 5113977Sedward } 5213977Sedward setselwin(w); 5313977Sedward goto out; 5413977Sedward case '%': 5514184Sedward if ((w = getwin()) != 0) 5614184Sedward setselwin(w); 5713977Sedward break; 5813977Sedward case 'c': 5914184Sedward if ((w = getwin()) != 0) 6014407Sedward c_close(w); 6114071Sedward break; 6213977Sedward case 'C': 6314407Sedward c_close((struct ww *)0); 6414071Sedward break; 6513977Sedward case 'w': 6614407Sedward c_window(); 6713977Sedward break; 6814184Sedward case 'S': 6914407Sedward c_show(); 7013994Sedward break; 7114189Sedward case 'L': 7214407Sedward c_list(); 7314189Sedward break; 7414407Sedward case 's': 7514407Sedward c_stat(); 7614177Sedward break; 7714407Sedward case 'M': 7814407Sedward wwdumpsmap(); 7914184Sedward break; 8014407Sedward case 'V': 8114407Sedward if ((w = getwin()) != 0) 8214407Sedward wwdumpnvis(w); 8313977Sedward break; 8414407Sedward case 'D': 8514407Sedward if ((w = getwin()) != 0) 8614407Sedward wwdumpcov(w); 8713977Sedward break; 8814407Sedward case 'W': 8914407Sedward if ((w = getwin()) != 0) 9014407Sedward wwdumpwin(w); 9114080Sedward break; 9213977Sedward case 't': 9314407Sedward c_time(RUSAGE_SELF); 9413977Sedward break; 9513977Sedward case 'T': 9614407Sedward c_time(RUSAGE_CHILDREN); 9713977Sedward break; 9814184Sedward case ':': 9914407Sedward c_colon(); 10014184Sedward break; 10114071Sedward case 'h': 10214407Sedward (void) wwwrite(selwin, "\b", 1); 10314071Sedward break; 10414071Sedward case 'j': 10514407Sedward (void) wwwrite(selwin, "\n", 1); 10614071Sedward break; 10714071Sedward case 'k': 10814407Sedward (void) wwwrite(selwin, "\033A", 2); 10914071Sedward break; 11014071Sedward case 'l': 11114407Sedward (void) wwwrite(selwin, "\033C", 2); 11214071Sedward break; 113*14711Sedward case CTRL(e): 114*14711Sedward wwscroll(selwin, 1); 115*14711Sedward break; 116*14711Sedward case CTRL(y): 117*14711Sedward wwscroll(selwin, -1); 118*14711Sedward break; 11914071Sedward case CTRL(d): 120*14711Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 12114071Sedward break; 12214071Sedward case CTRL(u): 123*14711Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 12414071Sedward break; 12514071Sedward case CTRL(f): 126*14711Sedward wwscroll(selwin, selwin->ww_w.nr); 12714071Sedward break; 12814071Sedward case CTRL(b): 129*14711Sedward wwscroll(selwin, - selwin->ww_w.nr); 13014071Sedward break; 13114694Sedward case CTRL(s): 13214694Sedward (void) write(selwin->ww_pty, 13314694Sedward &wwwintty.ww_tchars.t_stopc, 1); 13414694Sedward break; 13514694Sedward case CTRL(q): 13614694Sedward (void) write(selwin->ww_pty, 13714694Sedward &wwwintty.ww_tchars.t_startc, 1); 13814694Sedward break; 13913977Sedward case CTRL(l): 14014407Sedward wwredraw(); 14113977Sedward break; 14213977Sedward case '?': 14314407Sedward c_help(); 14413977Sedward break; 14513977Sedward case CTRL([): 14613977Sedward goto out; 14713977Sedward case CTRL(z): 14813977Sedward wwsuspend(); 14913977Sedward break; 15014189Sedward case 'q': 15114407Sedward c_quit(); 15214025Sedward if (quit) 15314025Sedward goto out; 15414025Sedward break; 15514189Sedward case '.': 15614407Sedward error("Use q to quit."); 15714189Sedward break; 15813977Sedward default: 15914177Sedward if (c == escapec) { 16014407Sedward (void) write(selwin->ww_pty, &escapec, 1); 16114177Sedward goto out; 16214177Sedward } 16314189Sedward if (!terse) 16414407Sedward wwbell(); 16514407Sedward error("Type ? for help."); 16613977Sedward break; 16713977Sedward } 16813977Sedward } 16914189Sedward if (terse) 17014189Sedward wwsetcursor(0, 0); 17114189Sedward else { 17214189Sedward if (!terse) 17314407Sedward (void) wwputs("Command: ", cmdwin); 17414407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 17514189Sedward } 17613994Sedward while (bpeekc() < 0) 17713977Sedward bread(); 17813977Sedward goto top; 17913977Sedward out: 18014407Sedward if (!quit) { 18114407Sedward curwin = selwin; 18214407Sedward if (!terse) { 18314407Sedward wwdelete(cmdwin); 18414407Sedward reframe(); 18514407Sedward } 18614407Sedward } 18714407Sedward /* 18814071Sedward if (selwin != 0) 18914071Sedward Woncursor(selwin->ww_win, 0); 19014407Sedward */ 19113977Sedward } 19213977Sedward 19313977Sedward struct ww * 19413977Sedward getwin() 19513977Sedward { 19613977Sedward register int c; 19714184Sedward struct ww *w = 0; 19813977Sedward 19914189Sedward if (!terse) 20014407Sedward (void) wwputs("Which window? ", cmdwin); 20114407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 20213994Sedward while ((c = bgetc()) < 0) 20313977Sedward bread(); 20414407Sedward if (debug && c == 'c') 20514407Sedward w = cmdwin; 20614407Sedward else if (debug && c == 'f') 20714407Sedward w = framewin; 20814407Sedward else if (c >= '1' && c < NWINDOW + '1') 20914407Sedward w = window[c - '1']; 21014407Sedward if (w == 0) 21114407Sedward wwbell(); 21214189Sedward if (!terse) 21314407Sedward (void) wwputs("\r\n", cmdwin); 21413977Sedward return w; 21513977Sedward } 21613977Sedward 21713977Sedward setselwin(w) 21813977Sedward register struct ww *w; 21913977Sedward { 22014407Sedward register struct ww *oldselwin = selwin; 22114184Sedward 22214184Sedward if (w == oldselwin) 22314184Sedward return; 22414071Sedward if (selwin = w) { 22514407Sedward wwdelete(w); 22614407Sedward /* 22714407Sedward * Stick it in front of the old selected window, 22814407Sedward * or behind everbody else. 22914407Sedward */ 23014407Sedward wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); 23114407Sedward /* 23214071Sedward Woncursor(w->ww_win, 1); 23314407Sedward */ 23413977Sedward } 23514407Sedward /* 23614184Sedward if (oldselwin) { 23714184Sedward Woncursor(oldselwin->ww_win, 0); 23814184Sedward } 23914407Sedward */ 24014407Sedward reframe(); 24113977Sedward } 24213977Sedward 24314184Sedward labelwin(w) 24413977Sedward register struct ww *w; 24513977Sedward { 24614407Sedward int mode = w == selwin ? WWM_REV : 0; 24713977Sedward 24814407Sedward if (w->ww_id >= 0) { 24914407Sedward char buf[2]; 25014407Sedward 25114407Sedward buf[0] = w->ww_id + '1'; 25214407Sedward buf[1] = 0; 25314407Sedward (void) wwlabel(w, framewin, 1, buf, mode); 25414407Sedward } 25514407Sedward if (w->ww_label) { 25614407Sedward int col; 25714407Sedward 25814407Sedward if (w->ww_center) { 25914407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 26014407Sedward col = MAX(3, col); 26114407Sedward } else 26214407Sedward col = 3; 26314407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 26414407Sedward } 26513977Sedward } 266