113977Sedward #ifndef lint 2*14847Sedward static char *sccsid = "@(#)cmd.c 3.7 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) 222*14847Sedward struct ww *w; 223*14847Sedward { 224*14847Sedward if ((selwin = w) != 0) 225*14847Sedward front(w); 226*14847Sedward } 227*14847Sedward 228*14847Sedward front(w) 22913977Sedward register struct ww *w; 23013977Sedward { 231*14847Sedward char moved = 0; 23214184Sedward 233*14847Sedward while (w->ww_back != framewin) { 234*14847Sedward wwmoveup(w); 235*14847Sedward moved = 1; 23613977Sedward } 237*14847Sedward if (moved) 238*14847Sedward reframe(); 23913977Sedward } 24013977Sedward 241*14847Sedward reframe() 242*14847Sedward { 243*14847Sedward register struct ww *w; 244*14847Sedward 245*14847Sedward wwunframe(framewin); 246*14847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 247*14847Sedward if (w->ww_hasframe) { 248*14847Sedward wwframe(w, framewin); 249*14847Sedward labelwin(w); 250*14847Sedward } 251*14847Sedward } 252*14847Sedward 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; 26314407Sedward (void) 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; 27314407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 27414407Sedward } 27513977Sedward } 276