113977Sedward #ifndef lint 2*14184Sedward static char *sccsid = "@(#)cmd.c 1.7 83/07/28"; 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 1413977Sedward top: 1514177Sedward if (!terse) 1614177Sedward Wunhide(cmdwin->ww_win); 1714071Sedward if (selwin != 0) 1814071Sedward Woncursor(selwin->ww_win, 1); 1913977Sedward while ((c = bgetc()) >= 0) { 2013977Sedward wwputs("\r\n", cmdwin); 2113977Sedward switch (c) { 2214177Sedward default: 2314177Sedward if (c == escapec) 2414177Sedward goto foo; 2514177Sedward break; 2613977Sedward case 'r': 2713977Sedward case 'R': 2814071Sedward case 'h': case 'j': case 'k': case 'l': 2914071Sedward case CTRL(u): 3014071Sedward case CTRL(d): 3114071Sedward case CTRL(b): 3214071Sedward case CTRL(f): 3313977Sedward case CTRL([): 3414177Sedward foo: 3513977Sedward if (selwin == 0) { 3613977Sedward wwputs("No window. ", cmdwin); 3713977Sedward continue; 3813977Sedward } 3913977Sedward } 4013977Sedward switch (c) { 4113977Sedward case '1': case '2': case '3': case '4': case '5': 4213977Sedward case '6': case '7': case '8': case '9': 4313977Sedward if ((w = wwfind(c - '0')) == 0) { 4413977Sedward Ding(); 4513977Sedward break; 4613977Sedward } 4713977Sedward setselwin(w); 4813977Sedward goto out; 4913977Sedward case '%': 50*14184Sedward if ((w = getwin()) != 0) 51*14184Sedward setselwin(w); 5213977Sedward break; 5313977Sedward case 'c': 54*14184Sedward if ((w = getwin()) != 0) 55*14184Sedward doclose(w); 5614071Sedward break; 5713977Sedward case 'C': 58*14184Sedward doclose((struct ww *)0); 5914071Sedward break; 6013977Sedward case 'Z': 61*14184Sedward wwputs("Command Z is now C. ", cmdwin); 6213977Sedward break; 6313977Sedward case 'w': 6413977Sedward dowindow(); 6513977Sedward break; 66*14184Sedward case 'S': 67*14184Sedward doshow(); 6813994Sedward break; 6914177Sedward case 'e': 7014177Sedward doescape(); 7114177Sedward break; 72*14184Sedward case 'L': 73*14184Sedward dolabel(); 74*14184Sedward break; 7513977Sedward case 'r': 7613977Sedward selwin->ww_refresh = 0; 7713977Sedward break; 7813977Sedward case 'R': 7913977Sedward selwin->ww_refresh = 1; 8013977Sedward break; 8114080Sedward case 's': 8214080Sedward dostat(); 8314080Sedward break; 8413977Sedward case 't': 8513977Sedward dotime(RUSAGE_SELF); 8613977Sedward break; 8713977Sedward case 'T': 8813977Sedward dotime(RUSAGE_CHILDREN); 8913977Sedward break; 90*14184Sedward case ':': 91*14184Sedward docolon(); 92*14184Sedward break; 9314071Sedward case 'h': 9414071Sedward Wcurleft(selwin->ww_win, 1); 9514071Sedward break; 9614071Sedward case 'j': 9714071Sedward Wcurdown(selwin->ww_win, 1); 9814071Sedward break; 9914071Sedward case 'k': 10014071Sedward Wcurup(selwin->ww_win, 1); 10114071Sedward break; 10214071Sedward case 'l': 10314071Sedward Wcurright(selwin->ww_win, 1); 10414071Sedward break; 10514071Sedward case CTRL(d): 10614071Sedward doscroll(1); 10714071Sedward break; 10814071Sedward case CTRL(u): 10914071Sedward doscroll(-1); 11014071Sedward break; 11114071Sedward case CTRL(f): 11214071Sedward doscroll(2); 11314071Sedward break; 11414071Sedward case CTRL(b): 11514071Sedward doscroll(-2); 11614071Sedward break; 11713977Sedward case CTRL(l): 11813977Sedward ScreenGarbaged = 1; 11913977Sedward break; 12013977Sedward case '?': 12113977Sedward dohelp(); 12213977Sedward break; 12313977Sedward case CTRL([): 12413977Sedward goto out; 12513977Sedward case CTRL(z): 12613977Sedward wwsuspend(); 12713977Sedward break; 12813977Sedward case '.': 12914025Sedward doquit(); 13014025Sedward if (quit) 13114025Sedward goto out; 13214025Sedward break; 13313977Sedward default: 13414177Sedward if (c == escapec) { 13514177Sedward write(selwin->ww_pty, &escapec, 1); 13614177Sedward goto out; 13714177Sedward } 13813977Sedward Ding(); 13914025Sedward wwprintf(cmdwin, "Type ? for help. "); 14013977Sedward break; 14113977Sedward } 14213977Sedward } 14313977Sedward wwputs("Command: ", cmdwin); 14413977Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 14513994Sedward while (bpeekc() < 0) 14613977Sedward bread(); 14713977Sedward goto top; 14813977Sedward out: 14913977Sedward if (!quit) 15014025Sedward wwsetcurwin(selwin); 15114071Sedward if (selwin != 0) 15214071Sedward Woncursor(selwin->ww_win, 0); 15314177Sedward if (!terse) 15414177Sedward Whide(cmdwin->ww_win); 15513977Sedward } 15613977Sedward 15713977Sedward struct ww * 15813977Sedward getwin() 15913977Sedward { 16013977Sedward register int c; 161*14184Sedward struct ww *w = 0; 16213977Sedward 163*14184Sedward wwputs("Which window? ", cmdwin); 164*14184Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 16513994Sedward while ((c = bgetc()) < 0) 16613977Sedward bread(); 167*14184Sedward if (c < '1' || c > '9' || (w = wwfind(c - '0')) == 0) 16813977Sedward Ding(); 169*14184Sedward wwputs("\r\n", cmdwin); 17013977Sedward return w; 17113977Sedward } 17213977Sedward 17313977Sedward setselwin(w) 17413977Sedward register struct ww *w; 17513977Sedward { 176*14184Sedward struct ww *oldselwin = selwin; 177*14184Sedward 178*14184Sedward if (w == oldselwin) 179*14184Sedward return; 18014071Sedward if (selwin = w) { 181*14184Sedward labelwin(w); 18213977Sedward /* bring it to the top just below cmdwin */ 18314025Sedward wwsetcurwin(w); 18414025Sedward wwsetcurwin(cmdwin); 18514071Sedward Woncursor(w->ww_win, 1); 18613977Sedward } 187*14184Sedward if (oldselwin) { 188*14184Sedward labelwin(oldselwin); 189*14184Sedward Woncursor(oldselwin->ww_win, 0); 190*14184Sedward } 19113977Sedward } 19213977Sedward 193*14184Sedward labelwin(w) 19413977Sedward register struct ww *w; 19513977Sedward { 19613977Sedward char buf[2]; 197*14184Sedward int mode = w == selwin ? WINVERSE : 0; 19813977Sedward 19913977Sedward buf[0] = w->ww_ident + '0'; 20013977Sedward buf[1] = 0; 20114177Sedward wwlabel(w, 1, buf, mode); 20214177Sedward if (w->ww_label) 20314177Sedward wwlabel(w, 3, w->ww_label, mode); 20413977Sedward } 205