113977Sedward #ifndef lint 2*14071Sedward static char *sccsid = "@(#)cmd.c 1.4 83/07/22"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward struct ww *getwin(); 813977Sedward struct ww *openwin(); 913977Sedward char *strtime(); 1013977Sedward 1113977Sedward docmd() 1213977Sedward { 1313977Sedward register char c; 1413977Sedward register struct ww *w; 1513977Sedward char buf; 1613977Sedward 1713977Sedward top: 1813977Sedward Wunhide(cmdwin->ww_win); 19*14071Sedward if (selwin != 0) 20*14071Sedward Woncursor(selwin->ww_win, 1); 2113977Sedward while ((c = bgetc()) >= 0) { 2213977Sedward wwputs("\r\n", cmdwin); 2313977Sedward switch (c) { 2413977Sedward case 'r': 2513977Sedward case 'R': 26*14071Sedward case 'h': case 'j': case 'k': case 'l': 27*14071Sedward case CTRL(u): 28*14071Sedward case CTRL(d): 29*14071Sedward case CTRL(b): 30*14071Sedward case CTRL(f): 3113977Sedward case CTRL([): 3213977Sedward case ESCAPE: 3313977Sedward if (selwin == 0) { 3413977Sedward wwputs("No window. ", cmdwin); 3513977Sedward continue; 3613977Sedward } 3713977Sedward } 3813977Sedward switch (c) { 3913977Sedward case '1': case '2': case '3': case '4': case '5': 4013977Sedward case '6': case '7': case '8': case '9': 4113977Sedward if ((w = wwfind(c - '0')) == 0) { 4213977Sedward Ding(); 4313977Sedward break; 4413977Sedward } 4513977Sedward setselwin(w); 4613977Sedward goto out; 4713977Sedward case '%': 4813977Sedward if ((w = getwin()) == 0) 4913977Sedward break; 5013977Sedward setselwin(w); 5113977Sedward break; 5213977Sedward case 'c': 53*14071Sedward doclose(CLOSE_ONE, getwin()); 54*14071Sedward break; 5513977Sedward case 'C': 56*14071Sedward doclose(CLOSE_DEAD, (struct ww *)0); 57*14071Sedward break; 5813977Sedward case 'Z': 59*14071Sedward doclose(CLOSE_ALL, (struct ww *)0); 6013977Sedward break; 6113977Sedward case 'w': 6213977Sedward dowindow(); 6313977Sedward break; 6413994Sedward case 'Q': 6513994Sedward doquery(); 6613994Sedward break; 6713977Sedward case 'r': 6813977Sedward selwin->ww_refresh = 0; 6913977Sedward break; 7013977Sedward case 'R': 7113977Sedward selwin->ww_refresh = 1; 7213977Sedward break; 7313977Sedward case 't': 7413977Sedward dotime(RUSAGE_SELF); 7513977Sedward break; 7613977Sedward case 'T': 7713977Sedward dotime(RUSAGE_CHILDREN); 7813977Sedward break; 79*14071Sedward case 'h': 80*14071Sedward Wcurleft(selwin->ww_win, 1); 81*14071Sedward break; 82*14071Sedward case 'j': 83*14071Sedward Wcurdown(selwin->ww_win, 1); 84*14071Sedward break; 85*14071Sedward case 'k': 86*14071Sedward Wcurup(selwin->ww_win, 1); 87*14071Sedward break; 88*14071Sedward case 'l': 89*14071Sedward Wcurright(selwin->ww_win, 1); 90*14071Sedward break; 91*14071Sedward case CTRL(d): 92*14071Sedward doscroll(1); 93*14071Sedward break; 94*14071Sedward case CTRL(u): 95*14071Sedward doscroll(-1); 96*14071Sedward break; 97*14071Sedward case CTRL(f): 98*14071Sedward doscroll(2); 99*14071Sedward break; 100*14071Sedward case CTRL(b): 101*14071Sedward doscroll(-2); 102*14071Sedward break; 10313977Sedward case CTRL(l): 10413977Sedward ScreenGarbaged = 1; 10513977Sedward break; 10613977Sedward case '?': 10713977Sedward dohelp(); 10813977Sedward break; 10913977Sedward case ESCAPE: 11013977Sedward buf = ESCAPE; 11113977Sedward write(selwin->ww_pty, &buf, 1); 11213977Sedward case CTRL([): 11313977Sedward goto out; 11413977Sedward case CTRL(z): 11513977Sedward wwsuspend(); 11613977Sedward break; 11713977Sedward case '.': 11814025Sedward doquit(); 11914025Sedward if (quit) 12014025Sedward goto out; 12114025Sedward break; 12213977Sedward default: 12313977Sedward Ding(); 12414025Sedward wwprintf(cmdwin, "Type ? for help. "); 12513977Sedward break; 12613977Sedward } 12713977Sedward } 12813977Sedward wwputs("Command: ", cmdwin); 12913977Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 13013994Sedward while (bpeekc() < 0) 13113977Sedward bread(); 13213977Sedward goto top; 13313977Sedward out: 13413977Sedward if (!quit) 13514025Sedward wwsetcurwin(selwin); 136*14071Sedward if (selwin != 0) 137*14071Sedward Woncursor(selwin->ww_win, 0); 13813977Sedward Whide(cmdwin->ww_win); 13913977Sedward } 14013977Sedward 14113977Sedward struct ww * 14213977Sedward getwin() 14313977Sedward { 14413977Sedward register int c; 14513977Sedward struct ww *w; 14613977Sedward 14713994Sedward while ((c = bgetc()) < 0) 14813977Sedward bread(); 14913977Sedward if (c < '1' || c > '9') { 15013977Sedward Ding(); 15113977Sedward return 0; 15213977Sedward } 15313977Sedward if ((w = wwfind(c - '0')) == 0) 15413977Sedward Ding(); 15513977Sedward return w; 15613977Sedward } 15713977Sedward 15813977Sedward setselwin(w) 15913977Sedward register struct ww *w; 16013977Sedward { 161*14071Sedward if (selwin) { 16213977Sedward labelwin(selwin, 0); 163*14071Sedward Woncursor(selwin->ww_win, 0); 164*14071Sedward } 165*14071Sedward if (selwin = w) { 16613977Sedward labelwin(w, WINVERSE); 16713977Sedward /* bring it to the top just below cmdwin */ 16814025Sedward wwsetcurwin(w); 16914025Sedward wwsetcurwin(cmdwin); 170*14071Sedward Woncursor(w->ww_win, 1); 17113977Sedward } 17213977Sedward } 17313977Sedward 17413977Sedward labelwin(w, mode) 17513977Sedward register struct ww *w; 17613977Sedward { 17713977Sedward char buf[2]; 17813977Sedward 17913977Sedward buf[0] = w->ww_ident + '0'; 18013977Sedward buf[1] = 0; 18113977Sedward wwlabel(w, buf, mode); 18213977Sedward } 183