113977Sedward #ifndef lint 2*14694Sedward static char *sccsid = "@(#)cmd.c 3.2 83/08/17"; 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': 3014071Sedward case CTRL(u): 3114071Sedward case CTRL(d): 3214071Sedward case CTRL(b): 3314071Sedward case CTRL(f): 34*14694Sedward case CTRL(s): 35*14694Sedward 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; 11114407Sedward /* 11214071Sedward case CTRL(d): 11314407Sedward c_scroll(1); 11414071Sedward break; 11514071Sedward case CTRL(u): 11614407Sedward c_scroll(-1); 11714071Sedward break; 11814071Sedward case CTRL(f): 11914407Sedward c_scroll(2); 12014071Sedward break; 12114071Sedward case CTRL(b): 12214407Sedward c_scroll(-2); 12314071Sedward break; 12414407Sedward */ 125*14694Sedward case CTRL(s): 126*14694Sedward (void) write(selwin->ww_pty, 127*14694Sedward &wwwintty.ww_tchars.t_stopc, 1); 128*14694Sedward break; 129*14694Sedward case CTRL(q): 130*14694Sedward (void) write(selwin->ww_pty, 131*14694Sedward &wwwintty.ww_tchars.t_startc, 1); 132*14694Sedward break; 13313977Sedward case CTRL(l): 13414407Sedward wwredraw(); 13513977Sedward break; 13613977Sedward case '?': 13714407Sedward c_help(); 13813977Sedward break; 13913977Sedward case CTRL([): 14013977Sedward goto out; 14113977Sedward case CTRL(z): 14213977Sedward wwsuspend(); 14313977Sedward break; 14414189Sedward case 'q': 14514407Sedward c_quit(); 14614025Sedward if (quit) 14714025Sedward goto out; 14814025Sedward break; 14914189Sedward case '.': 15014407Sedward error("Use q to quit."); 15114189Sedward break; 15213977Sedward default: 15314177Sedward if (c == escapec) { 15414407Sedward (void) write(selwin->ww_pty, &escapec, 1); 15514177Sedward goto out; 15614177Sedward } 15714189Sedward if (!terse) 15814407Sedward wwbell(); 15914407Sedward error("Type ? for help."); 16013977Sedward break; 16113977Sedward } 16213977Sedward } 16314189Sedward if (terse) 16414189Sedward wwsetcursor(0, 0); 16514189Sedward else { 16614189Sedward if (!terse) 16714407Sedward (void) wwputs("Command: ", cmdwin); 16814407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 16914189Sedward } 17013994Sedward while (bpeekc() < 0) 17113977Sedward bread(); 17213977Sedward goto top; 17313977Sedward out: 17414407Sedward if (!quit) { 17514407Sedward curwin = selwin; 17614407Sedward if (!terse) { 17714407Sedward wwdelete(cmdwin); 17814407Sedward reframe(); 17914407Sedward } 18014407Sedward } 18114407Sedward /* 18214071Sedward if (selwin != 0) 18314071Sedward Woncursor(selwin->ww_win, 0); 18414407Sedward */ 18513977Sedward } 18613977Sedward 18713977Sedward struct ww * 18813977Sedward getwin() 18913977Sedward { 19013977Sedward register int c; 19114184Sedward struct ww *w = 0; 19213977Sedward 19314189Sedward if (!terse) 19414407Sedward (void) wwputs("Which window? ", cmdwin); 19514407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 19613994Sedward while ((c = bgetc()) < 0) 19713977Sedward bread(); 19814407Sedward if (debug && c == 'c') 19914407Sedward w = cmdwin; 20014407Sedward else if (debug && c == 'f') 20114407Sedward w = framewin; 20214407Sedward else if (c >= '1' && c < NWINDOW + '1') 20314407Sedward w = window[c - '1']; 20414407Sedward if (w == 0) 20514407Sedward wwbell(); 20614189Sedward if (!terse) 20714407Sedward (void) wwputs("\r\n", cmdwin); 20813977Sedward return w; 20913977Sedward } 21013977Sedward 21113977Sedward setselwin(w) 21213977Sedward register struct ww *w; 21313977Sedward { 21414407Sedward register struct ww *oldselwin = selwin; 21514184Sedward 21614184Sedward if (w == oldselwin) 21714184Sedward return; 21814071Sedward if (selwin = w) { 21914407Sedward wwdelete(w); 22014407Sedward /* 22114407Sedward * Stick it in front of the old selected window, 22214407Sedward * or behind everbody else. 22314407Sedward */ 22414407Sedward wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); 22514407Sedward /* 22614071Sedward Woncursor(w->ww_win, 1); 22714407Sedward */ 22813977Sedward } 22914407Sedward /* 23014184Sedward if (oldselwin) { 23114184Sedward Woncursor(oldselwin->ww_win, 0); 23214184Sedward } 23314407Sedward */ 23414407Sedward reframe(); 23513977Sedward } 23613977Sedward 23714184Sedward labelwin(w) 23813977Sedward register struct ww *w; 23913977Sedward { 24014407Sedward int mode = w == selwin ? WWM_REV : 0; 24113977Sedward 24214407Sedward if (w->ww_id >= 0) { 24314407Sedward char buf[2]; 24414407Sedward 24514407Sedward buf[0] = w->ww_id + '1'; 24614407Sedward buf[1] = 0; 24714407Sedward (void) wwlabel(w, framewin, 1, buf, mode); 24814407Sedward } 24914407Sedward if (w->ww_label) { 25014407Sedward int col; 25114407Sedward 25214407Sedward if (w->ww_center) { 25314407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 25414407Sedward col = MAX(3, col); 25514407Sedward } else 25614407Sedward col = 3; 25714407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 25814407Sedward } 25913977Sedward } 260