113977Sedward #ifndef lint 2*14795Sedward static char *sccsid = "@(#)cmd.c 3.5 83/08/22"; 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) 1714764Sedward 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; 7214184Sedward case ':': 7314407Sedward c_colon(); 7414184Sedward break; 7514071Sedward case 'h': 7614407Sedward (void) wwwrite(selwin, "\b", 1); 7714071Sedward break; 7814071Sedward case 'j': 7914407Sedward (void) wwwrite(selwin, "\n", 1); 8014071Sedward break; 8114071Sedward case 'k': 8214407Sedward (void) wwwrite(selwin, "\033A", 2); 8314071Sedward break; 8414071Sedward case 'l': 8514407Sedward (void) wwwrite(selwin, "\033C", 2); 8614071Sedward break; 8714711Sedward case CTRL(e): 8814711Sedward wwscroll(selwin, 1); 8914711Sedward break; 9014711Sedward case CTRL(y): 9114711Sedward wwscroll(selwin, -1); 9214711Sedward break; 9314071Sedward case CTRL(d): 9414711Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 9514071Sedward break; 9614071Sedward case CTRL(u): 9714711Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 9814071Sedward break; 9914071Sedward case CTRL(f): 10014711Sedward wwscroll(selwin, selwin->ww_w.nr); 10114071Sedward break; 10214071Sedward case CTRL(b): 10314711Sedward wwscroll(selwin, - selwin->ww_w.nr); 10414071Sedward break; 10514694Sedward case CTRL(s): 10614694Sedward (void) write(selwin->ww_pty, 10714694Sedward &wwwintty.ww_tchars.t_stopc, 1); 10814694Sedward break; 10914694Sedward case CTRL(q): 11014694Sedward (void) write(selwin->ww_pty, 11114694Sedward &wwwintty.ww_tchars.t_startc, 1); 11214694Sedward break; 11313977Sedward case CTRL(l): 11414407Sedward wwredraw(); 11513977Sedward break; 11613977Sedward case '?': 11714407Sedward c_help(); 11813977Sedward break; 11913977Sedward case CTRL([): 12013977Sedward goto out; 12113977Sedward case CTRL(z): 12213977Sedward wwsuspend(); 12313977Sedward break; 12414189Sedward case 'q': 12514407Sedward c_quit(); 12614025Sedward if (quit) 12714025Sedward goto out; 12814025Sedward break; 129*14795Sedward /* undocumented commands */ 130*14795Sedward case 's': 131*14795Sedward c_stat(); 13214189Sedward break; 133*14795Sedward case 't': 134*14795Sedward c_time(RUSAGE_SELF); 135*14795Sedward break; 136*14795Sedward case 'T': 137*14795Sedward c_time(RUSAGE_CHILDREN); 138*14795Sedward break; 139*14795Sedward /* debugging commands */ 140*14795Sedward case 'M': 141*14795Sedward if (!debug) 142*14795Sedward goto badcmd; 143*14795Sedward wwdumpsmap(); 144*14795Sedward break; 145*14795Sedward case 'V': 146*14795Sedward if (!debug) 147*14795Sedward goto badcmd; 148*14795Sedward if ((w = getwin()) != 0) 149*14795Sedward wwdumpnvis(w); 150*14795Sedward break; 151*14795Sedward case 'D': 152*14795Sedward if (!debug) 153*14795Sedward goto badcmd; 154*14795Sedward if ((w = getwin()) != 0) 155*14795Sedward wwdumpcov(w); 156*14795Sedward break; 157*14795Sedward case 'W': 158*14795Sedward if (!debug) 159*14795Sedward goto badcmd; 160*14795Sedward if ((w = getwin()) != 0) 161*14795Sedward wwdumpwin(w); 162*14795Sedward break; 16313977Sedward default: 164*14795Sedward badcmd: 16514177Sedward if (c == escapec) { 16614407Sedward (void) write(selwin->ww_pty, &escapec, 1); 16714177Sedward goto out; 16814177Sedward } 16914189Sedward if (!terse) 17014407Sedward wwbell(); 17114407Sedward error("Type ? for help."); 17213977Sedward break; 17313977Sedward } 17413977Sedward } 17514189Sedward if (terse) 17614189Sedward wwsetcursor(0, 0); 17714189Sedward else { 17814189Sedward if (!terse) 17914407Sedward (void) wwputs("Command: ", cmdwin); 18014407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 18114189Sedward } 18213994Sedward while (bpeekc() < 0) 18313977Sedward bread(); 18413977Sedward goto top; 18513977Sedward out: 18614407Sedward if (!quit) { 18714407Sedward curwin = selwin; 18814407Sedward if (!terse) { 18914407Sedward wwdelete(cmdwin); 19014407Sedward reframe(); 19114407Sedward } 19214407Sedward } 19314071Sedward if (selwin != 0) 19414764Sedward wwcursor(selwin, 0); 19513977Sedward } 19613977Sedward 19713977Sedward struct ww * 19813977Sedward getwin() 19913977Sedward { 20013977Sedward register int c; 20114184Sedward struct ww *w = 0; 20213977Sedward 20314189Sedward if (!terse) 20414407Sedward (void) wwputs("Which window? ", cmdwin); 20514407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 20613994Sedward while ((c = bgetc()) < 0) 20713977Sedward bread(); 20814407Sedward if (debug && c == 'c') 20914407Sedward w = cmdwin; 21014407Sedward else if (debug && c == 'f') 21114407Sedward w = framewin; 212*14795Sedward else if (debug && c == 'b') 213*14795Sedward w = boxwin; 21414407Sedward else if (c >= '1' && c < NWINDOW + '1') 21514407Sedward w = window[c - '1']; 21614407Sedward if (w == 0) 21714407Sedward wwbell(); 21814189Sedward if (!terse) 21914407Sedward (void) wwputs("\r\n", cmdwin); 22013977Sedward return w; 22113977Sedward } 22213977Sedward 22313977Sedward setselwin(w) 22413977Sedward register struct ww *w; 22513977Sedward { 22614407Sedward register struct ww *oldselwin = selwin; 22714184Sedward 22814184Sedward if (w == oldselwin) 22914184Sedward return; 23014071Sedward if (selwin = w) { 23114407Sedward wwdelete(w); 23214407Sedward /* 23314407Sedward * Stick it in front of the old selected window, 23414407Sedward * or behind everbody else. 23514407Sedward */ 23614407Sedward wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); 23713977Sedward } 23814407Sedward reframe(); 23913977Sedward } 24013977Sedward 24114184Sedward labelwin(w) 24213977Sedward register struct ww *w; 24313977Sedward { 24414407Sedward int mode = w == selwin ? WWM_REV : 0; 24513977Sedward 24614407Sedward if (w->ww_id >= 0) { 24714407Sedward char buf[2]; 24814407Sedward 24914407Sedward buf[0] = w->ww_id + '1'; 25014407Sedward buf[1] = 0; 25114407Sedward (void) wwlabel(w, framewin, 1, buf, mode); 25214407Sedward } 25314407Sedward if (w->ww_label) { 25414407Sedward int col; 25514407Sedward 25614407Sedward if (w->ww_center) { 25714407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 25814407Sedward col = MAX(3, col); 25914407Sedward } else 26014407Sedward col = 3; 26114407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 26214407Sedward } 26313977Sedward } 264