113977Sedward #ifndef lint 2*14987Sedward static char *sccsid = "@(#)cmd.c 3.12 83/09/15"; 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); 1614893Sedward for (;;) { 1714893Sedward while ((c = bgetc()) >= 0) { 1814893Sedward if (!terse) 1914893Sedward (void) wwputs("\r\n", cmdwin); 2014893Sedward switch (c) { 2114893Sedward default: 2214893Sedward if (c == escapec) 2314893Sedward goto foo; 2413977Sedward break; 2514893Sedward case 'h': case 'j': case 'k': case 'l': 2614893Sedward case CTRL(y): 2714893Sedward case CTRL(e): 2814893Sedward case CTRL(u): 2914893Sedward case CTRL(d): 3014893Sedward case CTRL(b): 3114893Sedward case CTRL(f): 3214893Sedward case CTRL(s): 3314893Sedward case CTRL(q): 3414893Sedward case CTRL([): 3514893Sedward foo: 3614893Sedward if (selwin == 0) { 3714893Sedward error("No window."); 3814893Sedward continue; 3914893Sedward } 4013977Sedward } 4114893Sedward switch (c) { 4214893Sedward case '1': case '2': case '3': case '4': case '5': 4314893Sedward case '6': case '7': case '8': case '9': 4414893Sedward if ((w = window[c - '1']) == 0) { 4514893Sedward wwbell(); 4614893Sedward break; 4714893Sedward } 4814184Sedward setselwin(w); 4914893Sedward if (checkproc(selwin) >= 0) 5014893Sedward incmd = 0; 5114893Sedward break; 5214893Sedward case '%': 5314893Sedward if ((w = getwin()) != 0) 5414893Sedward setselwin(w); 5514893Sedward break; 5614893Sedward case 'c': 5714893Sedward if ((w = getwin()) != 0) 5814893Sedward c_close(w); 5914893Sedward break; 6014893Sedward case 'C': 6114893Sedward c_close((struct ww *)0); 6214893Sedward break; 6314893Sedward case 'w': 6414893Sedward c_window(); 6514893Sedward break; 6614893Sedward case 'm': 6714893Sedward if ((w = getwin()) != 0) 6814893Sedward c_move(w); 6914893Sedward break; 7014893Sedward case 'S': 7114893Sedward c_show(); 7214893Sedward break; 7314893Sedward case 'L': 7414893Sedward c_list(); 7514893Sedward break; 7614893Sedward case ':': 7714893Sedward c_colon(); 7814893Sedward break; 7914893Sedward case 'h': 8014893Sedward (void) wwwrite(selwin, "\b", 1); 8114893Sedward break; 8214893Sedward case 'j': 8314893Sedward (void) wwwrite(selwin, "\n", 1); 8414893Sedward break; 8514893Sedward case 'k': 8614893Sedward (void) wwwrite(selwin, "\033A", 2); 8714893Sedward break; 8814893Sedward case 'l': 8914893Sedward (void) wwwrite(selwin, "\033C", 2); 9014893Sedward break; 9114893Sedward case CTRL(e): 9214893Sedward wwscroll(selwin, 1); 9314893Sedward break; 9414893Sedward case CTRL(y): 9514893Sedward wwscroll(selwin, -1); 9614893Sedward break; 9714893Sedward case CTRL(d): 9814893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 9914893Sedward break; 10014893Sedward case CTRL(u): 10114893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 10214893Sedward break; 10314893Sedward case CTRL(f): 10414893Sedward wwscroll(selwin, selwin->ww_w.nr); 10514893Sedward break; 10614893Sedward case CTRL(b): 10714893Sedward wwscroll(selwin, - selwin->ww_w.nr); 10814893Sedward break; 10914893Sedward case CTRL(s): 11014893Sedward (void) write(selwin->ww_pty, 11114893Sedward &wwwintty.ww_tchars.t_stopc, 1); 11214893Sedward break; 11314893Sedward case CTRL(q): 11414893Sedward (void) write(selwin->ww_pty, 11514893Sedward &wwwintty.ww_tchars.t_startc, 1); 11614893Sedward break; 11714893Sedward case CTRL(l): 11814893Sedward wwredraw(); 11914893Sedward break; 12014893Sedward case '?': 12114893Sedward c_help(); 12214893Sedward break; 12314893Sedward case CTRL([): 12414893Sedward if (checkproc(selwin) >= 0) 12514893Sedward incmd = 0; 12614893Sedward break; 12714893Sedward case CTRL(z): 12814893Sedward wwsuspend(); 12914893Sedward break; 13014893Sedward case 'q': 13114893Sedward c_quit(); 13214893Sedward break; 13314893Sedward /* undocumented commands */ 13414893Sedward case 's': 13514893Sedward c_stat(); 13614893Sedward break; 13714893Sedward case 't': 13814893Sedward c_time(RUSAGE_SELF); 13914893Sedward break; 14014893Sedward case 'T': 14114893Sedward c_time(RUSAGE_CHILDREN); 14214893Sedward break; 14314893Sedward /* debugging commands */ 14414893Sedward case 'M': 14514893Sedward if (!debug) 14614893Sedward goto badcmd; 14714893Sedward wwdumpsmap(); 14814893Sedward break; 14914893Sedward case 'V': 15014893Sedward if (!debug) 15114893Sedward goto badcmd; 15214893Sedward if ((w = getwin()) != 0) 15314893Sedward wwdumpnvis(w); 15414893Sedward break; 15514893Sedward case 'D': 15614893Sedward if (!debug) 15714893Sedward goto badcmd; 15814893Sedward if ((w = getwin()) != 0) 15914893Sedward wwdumpcov(w); 16014893Sedward break; 16114893Sedward case 'W': 16214893Sedward if (!debug) 16314893Sedward goto badcmd; 16414893Sedward if ((w = getwin()) != 0) 16514893Sedward wwdumpwin(w); 16614893Sedward break; 16714893Sedward default: 16814893Sedward badcmd: 16914893Sedward if (c == escapec) { 17014893Sedward if (checkproc(selwin) >= 0) { 17114893Sedward (void) write(selwin->ww_pty, 17214893Sedward &escapec, 1); 17314893Sedward incmd = 0; 17414893Sedward } 17514893Sedward } else { 17614893Sedward if (!terse) 17714893Sedward wwbell(); 17814893Sedward error("Type ? for help."); 17914893Sedward } 18014177Sedward } 18114893Sedward } 18214893Sedward if (!incmd || quit) 18313977Sedward break; 18414893Sedward if (terse) 18514893Sedward wwsetcursor(0, 0); 18614893Sedward else { 18714893Sedward (void) wwputs("Command: ", cmdwin); 18814893Sedward wwcurtowin(cmdwin); 18913977Sedward } 19014893Sedward while (bpeekc() < 0) 19114893Sedward bread(); 19213977Sedward } 19314407Sedward if (!quit) { 19414407Sedward if (!terse) { 19514407Sedward wwdelete(cmdwin); 19614407Sedward reframe(); 19714407Sedward } 19814893Sedward wwcursor(selwin, 0); 19914407Sedward } 20013977Sedward } 20113977Sedward 20213977Sedward struct ww * 20313977Sedward getwin() 20413977Sedward { 20513977Sedward register int c; 20614184Sedward struct ww *w = 0; 20713977Sedward 20814189Sedward if (!terse) 20914407Sedward (void) wwputs("Which window? ", cmdwin); 210*14987Sedward wwcurtowin(cmdwin); 21113994Sedward while ((c = bgetc()) < 0) 21213977Sedward bread(); 21314407Sedward if (debug && c == 'c') 21414407Sedward w = cmdwin; 21514407Sedward else if (debug && c == 'f') 21614407Sedward w = framewin; 21714795Sedward else if (debug && c == 'b') 21814795Sedward w = boxwin; 21914407Sedward else if (c >= '1' && c < NWINDOW + '1') 22014407Sedward w = window[c - '1']; 22114407Sedward if (w == 0) 22214407Sedward wwbell(); 22314189Sedward if (!terse) 22414407Sedward (void) wwputs("\r\n", cmdwin); 22513977Sedward return w; 22613977Sedward } 22713977Sedward 22814893Sedward checkproc(w) 22914893Sedward struct ww *w; 23014893Sedward { 23114893Sedward if (w->ww_state != WWS_HASPROC) { 23214893Sedward error("No process in window."); 23314893Sedward return -1; 23414893Sedward } 23514893Sedward return 0; 23614893Sedward } 23714893Sedward 23813977Sedward setselwin(w) 23914847Sedward struct ww *w; 24014847Sedward { 24114847Sedward if ((selwin = w) != 0) 24214847Sedward front(w); 24314847Sedward } 24414847Sedward 24514896Sedward /* 24614896Sedward * This is all heuristic. 24714896Sedward * wwvisible() doesn't work for partially tinted windows. 24814896Sedward * and wwmoveup() doesn't work for transparent (completely or in part) windows. 24914896Sedward * But anything to make it faster. 25014896Sedward */ 25114847Sedward front(w) 25213977Sedward register struct ww *w; 25313977Sedward { 25414847Sedward char moved = 0; 25514184Sedward 25614896Sedward if (wwvisible(w)) 25714847Sedward moved = 1; 25814896Sedward else 25914896Sedward while (w->ww_back != framewin) { 26014896Sedward wwmoveup(w); 26114896Sedward moved = 1; 26214896Sedward } 26314847Sedward if (moved) 26414847Sedward reframe(); 26513977Sedward } 26613977Sedward 26714847Sedward reframe() 26814847Sedward { 26914847Sedward register struct ww *w; 27014847Sedward 27114847Sedward wwunframe(framewin); 27214847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 27314847Sedward if (w->ww_hasframe) { 27414847Sedward wwframe(w, framewin); 27514847Sedward labelwin(w); 27614847Sedward } 27714847Sedward } 27814847Sedward 27914184Sedward labelwin(w) 28013977Sedward register struct ww *w; 28113977Sedward { 28214407Sedward int mode = w == selwin ? WWM_REV : 0; 28313977Sedward 28414407Sedward if (w->ww_id >= 0) { 28514407Sedward char buf[2]; 28614407Sedward 28714407Sedward buf[0] = w->ww_id + '1'; 28814407Sedward buf[1] = 0; 28914854Sedward wwlabel(w, framewin, 1, buf, mode); 29014407Sedward } 29114407Sedward if (w->ww_label) { 29214407Sedward int col; 29314407Sedward 29414407Sedward if (w->ww_center) { 29514407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 29614407Sedward col = MAX(3, col); 29714407Sedward } else 29814407Sedward col = 3; 29914854Sedward wwlabel(w, framewin, col, w->ww_label, mode); 30014407Sedward } 30113977Sedward } 302