113977Sedward #ifndef lint 2*14854Sedward static char *sccsid = "@(#)cmd.c 3.8 83/08/26"; 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); 1614189Sedward top: 1713977Sedward while ((c = bgetc()) >= 0) { 1814189Sedward if (!terse) 1914407Sedward (void) wwputs("\r\n", cmdwin); 2013977Sedward switch (c) { 2114177Sedward default: 2214177Sedward if (c == escapec) 2314177Sedward goto foo; 2414177Sedward break; 2514071Sedward case 'h': case 'j': case 'k': case 'l': 2614711Sedward case CTRL(y): 2714711Sedward case CTRL(e): 2814071Sedward case CTRL(u): 2914071Sedward case CTRL(d): 3014071Sedward case CTRL(b): 3114071Sedward case CTRL(f): 3214694Sedward case CTRL(s): 3314694Sedward case CTRL(q): 3413977Sedward case CTRL([): 3514177Sedward foo: 3613977Sedward if (selwin == 0) { 3714407Sedward error("No window."); 3813977Sedward continue; 3913977Sedward } 4013977Sedward } 4113977Sedward switch (c) { 4213977Sedward case '1': case '2': case '3': case '4': case '5': 4313977Sedward case '6': case '7': case '8': case '9': 4414407Sedward if ((w = window[c - '1']) == 0) { 4514407Sedward wwbell(); 4613977Sedward break; 4713977Sedward } 4813977Sedward setselwin(w); 4913977Sedward goto out; 5013977Sedward case '%': 5114184Sedward if ((w = getwin()) != 0) 5214184Sedward setselwin(w); 5313977Sedward break; 5413977Sedward case 'c': 5514184Sedward if ((w = getwin()) != 0) 5614407Sedward c_close(w); 5714071Sedward break; 5813977Sedward case 'C': 5914407Sedward c_close((struct ww *)0); 6014071Sedward break; 6113977Sedward case 'w': 6214407Sedward c_window(); 6313977Sedward break; 6414184Sedward case 'S': 6514407Sedward c_show(); 6613994Sedward break; 6714189Sedward case 'L': 6814407Sedward c_list(); 6914189Sedward break; 7014184Sedward case ':': 7114407Sedward c_colon(); 7214184Sedward break; 7314071Sedward case 'h': 7414407Sedward (void) wwwrite(selwin, "\b", 1); 7514071Sedward break; 7614071Sedward case 'j': 7714407Sedward (void) wwwrite(selwin, "\n", 1); 7814071Sedward break; 7914071Sedward case 'k': 8014407Sedward (void) wwwrite(selwin, "\033A", 2); 8114071Sedward break; 8214071Sedward case 'l': 8314407Sedward (void) wwwrite(selwin, "\033C", 2); 8414071Sedward break; 8514711Sedward case CTRL(e): 8614711Sedward wwscroll(selwin, 1); 8714711Sedward break; 8814711Sedward case CTRL(y): 8914711Sedward wwscroll(selwin, -1); 9014711Sedward break; 9114071Sedward case CTRL(d): 9214711Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 9314071Sedward break; 9414071Sedward case CTRL(u): 9514711Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 9614071Sedward break; 9714071Sedward case CTRL(f): 9814711Sedward wwscroll(selwin, selwin->ww_w.nr); 9914071Sedward break; 10014071Sedward case CTRL(b): 10114711Sedward wwscroll(selwin, - selwin->ww_w.nr); 10214071Sedward break; 10314694Sedward case CTRL(s): 10414694Sedward (void) write(selwin->ww_pty, 10514694Sedward &wwwintty.ww_tchars.t_stopc, 1); 10614694Sedward break; 10714694Sedward case CTRL(q): 10814694Sedward (void) write(selwin->ww_pty, 10914694Sedward &wwwintty.ww_tchars.t_startc, 1); 11014694Sedward break; 11113977Sedward case CTRL(l): 11214407Sedward wwredraw(); 11313977Sedward break; 11413977Sedward case '?': 11514407Sedward c_help(); 11613977Sedward break; 11713977Sedward case CTRL([): 11813977Sedward goto out; 11913977Sedward case CTRL(z): 12013977Sedward wwsuspend(); 12113977Sedward break; 12214189Sedward case 'q': 12314407Sedward c_quit(); 12414025Sedward if (quit) 12514025Sedward goto out; 12614025Sedward break; 12714795Sedward /* undocumented commands */ 12814795Sedward case 's': 12914795Sedward c_stat(); 13014189Sedward break; 13114795Sedward case 't': 13214795Sedward c_time(RUSAGE_SELF); 13314795Sedward break; 13414795Sedward case 'T': 13514795Sedward c_time(RUSAGE_CHILDREN); 13614795Sedward break; 13714795Sedward /* debugging commands */ 13814795Sedward case 'M': 13914795Sedward if (!debug) 14014795Sedward goto badcmd; 14114795Sedward wwdumpsmap(); 14214795Sedward break; 14314795Sedward case 'V': 14414795Sedward if (!debug) 14514795Sedward goto badcmd; 14614795Sedward if ((w = getwin()) != 0) 14714795Sedward wwdumpnvis(w); 14814795Sedward break; 14914795Sedward case 'D': 15014795Sedward if (!debug) 15114795Sedward goto badcmd; 15214795Sedward if ((w = getwin()) != 0) 15314795Sedward wwdumpcov(w); 15414795Sedward break; 15514795Sedward case 'W': 15614795Sedward if (!debug) 15714795Sedward goto badcmd; 15814795Sedward if ((w = getwin()) != 0) 15914795Sedward wwdumpwin(w); 16014795Sedward break; 16113977Sedward default: 16214795Sedward badcmd: 16314177Sedward if (c == escapec) { 16414407Sedward (void) write(selwin->ww_pty, &escapec, 1); 16514177Sedward goto out; 16614177Sedward } 16714189Sedward if (!terse) 16814407Sedward wwbell(); 16914407Sedward error("Type ? for help."); 17013977Sedward break; 17113977Sedward } 17213977Sedward } 17314189Sedward if (terse) 17414189Sedward wwsetcursor(0, 0); 17514189Sedward else { 17614189Sedward if (!terse) 17714407Sedward (void) wwputs("Command: ", cmdwin); 17814407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 17914189Sedward } 18013994Sedward while (bpeekc() < 0) 18113977Sedward bread(); 18213977Sedward goto top; 18313977Sedward out: 18414407Sedward if (!quit) { 18514407Sedward curwin = selwin; 18614407Sedward if (!terse) { 18714407Sedward wwdelete(cmdwin); 18814407Sedward reframe(); 18914407Sedward } 19014407Sedward } 19114071Sedward if (selwin != 0) 19214764Sedward wwcursor(selwin, 0); 19313977Sedward } 19413977Sedward 19513977Sedward struct ww * 19613977Sedward getwin() 19713977Sedward { 19813977Sedward register int c; 19914184Sedward struct ww *w = 0; 20013977Sedward 20114189Sedward if (!terse) 20214407Sedward (void) wwputs("Which window? ", cmdwin); 20314407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 20413994Sedward while ((c = bgetc()) < 0) 20513977Sedward bread(); 20614407Sedward if (debug && c == 'c') 20714407Sedward w = cmdwin; 20814407Sedward else if (debug && c == 'f') 20914407Sedward w = framewin; 21014795Sedward else if (debug && c == 'b') 21114795Sedward w = boxwin; 21214407Sedward else if (c >= '1' && c < NWINDOW + '1') 21314407Sedward w = window[c - '1']; 21414407Sedward if (w == 0) 21514407Sedward wwbell(); 21614189Sedward if (!terse) 21714407Sedward (void) wwputs("\r\n", cmdwin); 21813977Sedward return w; 21913977Sedward } 22013977Sedward 22113977Sedward setselwin(w) 22214847Sedward struct ww *w; 22314847Sedward { 22414847Sedward if ((selwin = w) != 0) 22514847Sedward front(w); 22614847Sedward } 22714847Sedward 22814847Sedward front(w) 22913977Sedward register struct ww *w; 23013977Sedward { 23114847Sedward char moved = 0; 23214184Sedward 23314847Sedward while (w->ww_back != framewin) { 23414847Sedward wwmoveup(w); 23514847Sedward moved = 1; 23613977Sedward } 23714847Sedward if (moved) 23814847Sedward reframe(); 23913977Sedward } 24013977Sedward 24114847Sedward reframe() 24214847Sedward { 24314847Sedward register struct ww *w; 24414847Sedward 24514847Sedward wwunframe(framewin); 24614847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 24714847Sedward if (w->ww_hasframe) { 24814847Sedward wwframe(w, framewin); 24914847Sedward labelwin(w); 25014847Sedward } 25114847Sedward } 25214847Sedward 25314184Sedward labelwin(w) 25413977Sedward register struct ww *w; 25513977Sedward { 25614407Sedward int mode = w == selwin ? WWM_REV : 0; 25713977Sedward 25814407Sedward if (w->ww_id >= 0) { 25914407Sedward char buf[2]; 26014407Sedward 26114407Sedward buf[0] = w->ww_id + '1'; 26214407Sedward buf[1] = 0; 263*14854Sedward wwlabel(w, framewin, 1, buf, mode); 26414407Sedward } 26514407Sedward if (w->ww_label) { 26614407Sedward int col; 26714407Sedward 26814407Sedward if (w->ww_center) { 26914407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 27014407Sedward col = MAX(3, col); 27114407Sedward } else 27214407Sedward col = 3; 273*14854Sedward wwlabel(w, framewin, col, w->ww_label, mode); 27414407Sedward } 27513977Sedward } 276