113977Sedward #ifndef lint 2*14177Sedward static char *sccsid = "@(#)cmd.c 1.6 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: 15*14177Sedward if (!terse) 16*14177Sedward 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) { 22*14177Sedward default: 23*14177Sedward if (c == escapec) 24*14177Sedward goto foo; 25*14177Sedward 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([): 34*14177Sedward 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 '%': 5013977Sedward if ((w = getwin()) == 0) 5113977Sedward break; 5213977Sedward setselwin(w); 5313977Sedward break; 5413977Sedward case 'c': 5514071Sedward doclose(CLOSE_ONE, getwin()); 5614071Sedward break; 5713977Sedward case 'C': 5814071Sedward doclose(CLOSE_DEAD, (struct ww *)0); 5914071Sedward break; 6013977Sedward case 'Z': 6114071Sedward doclose(CLOSE_ALL, (struct ww *)0); 6213977Sedward break; 6313977Sedward case 'w': 6413977Sedward dowindow(); 6513977Sedward break; 6613994Sedward case 'Q': 6713994Sedward doquery(); 6813994Sedward break; 69*14177Sedward case 'e': 70*14177Sedward doescape(); 71*14177Sedward break; 7213977Sedward case 'r': 7313977Sedward selwin->ww_refresh = 0; 7413977Sedward break; 7513977Sedward case 'R': 7613977Sedward selwin->ww_refresh = 1; 7713977Sedward break; 7814080Sedward case 's': 7914080Sedward dostat(); 8014080Sedward break; 8113977Sedward case 't': 8213977Sedward dotime(RUSAGE_SELF); 8313977Sedward break; 8413977Sedward case 'T': 8513977Sedward dotime(RUSAGE_CHILDREN); 8613977Sedward break; 8714071Sedward case 'h': 8814071Sedward Wcurleft(selwin->ww_win, 1); 8914071Sedward break; 9014071Sedward case 'j': 9114071Sedward Wcurdown(selwin->ww_win, 1); 9214071Sedward break; 9314071Sedward case 'k': 9414071Sedward Wcurup(selwin->ww_win, 1); 9514071Sedward break; 9614071Sedward case 'l': 9714071Sedward Wcurright(selwin->ww_win, 1); 9814071Sedward break; 9914071Sedward case CTRL(d): 10014071Sedward doscroll(1); 10114071Sedward break; 10214071Sedward case CTRL(u): 10314071Sedward doscroll(-1); 10414071Sedward break; 10514071Sedward case CTRL(f): 10614071Sedward doscroll(2); 10714071Sedward break; 10814071Sedward case CTRL(b): 10914071Sedward doscroll(-2); 11014071Sedward break; 11113977Sedward case CTRL(l): 11213977Sedward ScreenGarbaged = 1; 11313977Sedward break; 11413977Sedward case '?': 11513977Sedward dohelp(); 11613977Sedward break; 11713977Sedward case CTRL([): 11813977Sedward goto out; 11913977Sedward case CTRL(z): 12013977Sedward wwsuspend(); 12113977Sedward break; 12213977Sedward case '.': 12314025Sedward doquit(); 12414025Sedward if (quit) 12514025Sedward goto out; 12614025Sedward break; 12713977Sedward default: 128*14177Sedward if (c == escapec) { 129*14177Sedward write(selwin->ww_pty, &escapec, 1); 130*14177Sedward goto out; 131*14177Sedward } 13213977Sedward Ding(); 13314025Sedward wwprintf(cmdwin, "Type ? for help. "); 13413977Sedward break; 13513977Sedward } 13613977Sedward } 13713977Sedward wwputs("Command: ", cmdwin); 13813977Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 13913994Sedward while (bpeekc() < 0) 14013977Sedward bread(); 14113977Sedward goto top; 14213977Sedward out: 14313977Sedward if (!quit) 14414025Sedward wwsetcurwin(selwin); 14514071Sedward if (selwin != 0) 14614071Sedward Woncursor(selwin->ww_win, 0); 147*14177Sedward if (!terse) 148*14177Sedward Whide(cmdwin->ww_win); 14913977Sedward } 15013977Sedward 15113977Sedward struct ww * 15213977Sedward getwin() 15313977Sedward { 15413977Sedward register int c; 15513977Sedward struct ww *w; 15613977Sedward 15713994Sedward while ((c = bgetc()) < 0) 15813977Sedward bread(); 15913977Sedward if (c < '1' || c > '9') { 16013977Sedward Ding(); 16113977Sedward return 0; 16213977Sedward } 16313977Sedward if ((w = wwfind(c - '0')) == 0) 16413977Sedward Ding(); 16513977Sedward return w; 16613977Sedward } 16713977Sedward 16813977Sedward setselwin(w) 16913977Sedward register struct ww *w; 17013977Sedward { 17114071Sedward if (selwin) { 17213977Sedward labelwin(selwin, 0); 17314071Sedward Woncursor(selwin->ww_win, 0); 17414071Sedward } 17514071Sedward if (selwin = w) { 17613977Sedward labelwin(w, WINVERSE); 17713977Sedward /* bring it to the top just below cmdwin */ 17814025Sedward wwsetcurwin(w); 17914025Sedward wwsetcurwin(cmdwin); 18014071Sedward Woncursor(w->ww_win, 1); 18113977Sedward } 18213977Sedward } 18313977Sedward 18413977Sedward labelwin(w, mode) 18513977Sedward register struct ww *w; 18613977Sedward { 18713977Sedward char buf[2]; 18813977Sedward 18913977Sedward buf[0] = w->ww_ident + '0'; 19013977Sedward buf[1] = 0; 191*14177Sedward wwlabel(w, 1, buf, mode); 192*14177Sedward /* 193*14177Sedward if (w->ww_label) 194*14177Sedward wwlabel(w, 3, w->ww_label, mode); 195*14177Sedward */ 19613977Sedward } 197