113977Sedward #ifndef lint 2*14189Sedward static char *sccsid = "@(#)cmd.c 1.8 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 1414177Sedward if (!terse) 1514177Sedward Wunhide(cmdwin->ww_win); 1614071Sedward if (selwin != 0) 1714071Sedward Woncursor(selwin->ww_win, 1); 18*14189Sedward top: 1913977Sedward while ((c = bgetc()) >= 0) { 20*14189Sedward if (!terse) 21*14189Sedward wwputs("\r\n", cmdwin); 2213977Sedward switch (c) { 2314177Sedward default: 2414177Sedward if (c == escapec) 2514177Sedward goto foo; 2614177Sedward break; 2714071Sedward case 'h': case 'j': case 'k': case 'l': 2814071Sedward case CTRL(u): 2914071Sedward case CTRL(d): 3014071Sedward case CTRL(b): 3114071Sedward case CTRL(f): 3213977Sedward case CTRL([): 3314177Sedward foo: 3413977Sedward if (selwin == 0) { 35*14189Sedward if (!terse) 36*14189Sedward 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 '%': 5014184Sedward if ((w = getwin()) != 0) 5114184Sedward setselwin(w); 5213977Sedward break; 5313977Sedward case 'c': 5414184Sedward if ((w = getwin()) != 0) 5514184Sedward doclose(w); 5614071Sedward break; 5713977Sedward case 'C': 5814184Sedward doclose((struct ww *)0); 5914071Sedward break; 6013977Sedward case 'Z': 61*14189Sedward if (terse) 62*14189Sedward Ding(); 63*14189Sedward else 64*14189Sedward wwputs("Command Z is now C. ", cmdwin); 6513977Sedward break; 6613977Sedward case 'w': 6713977Sedward dowindow(); 6813977Sedward break; 6914184Sedward case 'S': 7014184Sedward doshow(); 7113994Sedward break; 72*14189Sedward case 'L': 73*14189Sedward dolist(); 74*14189Sedward break; 75*14189Sedward /* 7614177Sedward case 'e': 7714177Sedward doescape(); 7814177Sedward break; 7914184Sedward case 'L': 8014184Sedward dolabel(); 8114184Sedward break; 8213977Sedward case 'r': 8313977Sedward selwin->ww_refresh = 0; 8413977Sedward break; 8513977Sedward case 'R': 8613977Sedward selwin->ww_refresh = 1; 8713977Sedward break; 88*14189Sedward */ 8914080Sedward case 's': 9014080Sedward dostat(); 9114080Sedward break; 9213977Sedward case 't': 9313977Sedward dotime(RUSAGE_SELF); 9413977Sedward break; 9513977Sedward case 'T': 9613977Sedward dotime(RUSAGE_CHILDREN); 9713977Sedward break; 9814184Sedward case ':': 9914184Sedward docolon(); 10014184Sedward break; 10114071Sedward case 'h': 10214071Sedward Wcurleft(selwin->ww_win, 1); 10314071Sedward break; 10414071Sedward case 'j': 10514071Sedward Wcurdown(selwin->ww_win, 1); 10614071Sedward break; 10714071Sedward case 'k': 10814071Sedward Wcurup(selwin->ww_win, 1); 10914071Sedward break; 11014071Sedward case 'l': 11114071Sedward Wcurright(selwin->ww_win, 1); 11214071Sedward break; 11314071Sedward case CTRL(d): 11414071Sedward doscroll(1); 11514071Sedward break; 11614071Sedward case CTRL(u): 11714071Sedward doscroll(-1); 11814071Sedward break; 11914071Sedward case CTRL(f): 12014071Sedward doscroll(2); 12114071Sedward break; 12214071Sedward case CTRL(b): 12314071Sedward doscroll(-2); 12414071Sedward break; 12513977Sedward case CTRL(l): 12613977Sedward ScreenGarbaged = 1; 12713977Sedward break; 12813977Sedward case '?': 12913977Sedward dohelp(); 13013977Sedward break; 13113977Sedward case CTRL([): 13213977Sedward goto out; 13313977Sedward case CTRL(z): 13413977Sedward wwsuspend(); 13513977Sedward break; 136*14189Sedward case 'q': 13714025Sedward doquit(); 13814025Sedward if (quit) 13914025Sedward goto out; 14014025Sedward break; 141*14189Sedward case '.': 142*14189Sedward if (terse) 143*14189Sedward Ding(); 144*14189Sedward else 145*14189Sedward wwputs("Use q to quit. ", cmdwin); 146*14189Sedward break; 14713977Sedward default: 14814177Sedward if (c == escapec) { 14914177Sedward write(selwin->ww_pty, &escapec, 1); 15014177Sedward goto out; 15114177Sedward } 15213977Sedward Ding(); 153*14189Sedward if (!terse) 154*14189Sedward wwprintf(cmdwin, "Type ? for help. "); 15513977Sedward break; 15613977Sedward } 15713977Sedward } 158*14189Sedward if (terse) 159*14189Sedward wwsetcursor(0, 0); 160*14189Sedward else { 161*14189Sedward if (!terse) 162*14189Sedward wwputs("Command: ", cmdwin); 163*14189Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 164*14189Sedward } 16513994Sedward while (bpeekc() < 0) 16613977Sedward bread(); 16713977Sedward goto top; 16813977Sedward out: 16913977Sedward if (!quit) 17014025Sedward wwsetcurwin(selwin); 17114071Sedward if (selwin != 0) 17214071Sedward Woncursor(selwin->ww_win, 0); 17314177Sedward if (!terse) 17414177Sedward Whide(cmdwin->ww_win); 17513977Sedward } 17613977Sedward 17713977Sedward struct ww * 17813977Sedward getwin() 17913977Sedward { 18013977Sedward register int c; 18114184Sedward struct ww *w = 0; 18213977Sedward 183*14189Sedward if (!terse) 184*14189Sedward wwputs("Which window? ", cmdwin); 18514184Sedward wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); 18613994Sedward while ((c = bgetc()) < 0) 18713977Sedward bread(); 18814184Sedward if (c < '1' || c > '9' || (w = wwfind(c - '0')) == 0) 18913977Sedward Ding(); 190*14189Sedward if (!terse) 191*14189Sedward wwputs("\r\n", cmdwin); 19213977Sedward return w; 19313977Sedward } 19413977Sedward 19513977Sedward setselwin(w) 19613977Sedward register struct ww *w; 19713977Sedward { 19814184Sedward struct ww *oldselwin = selwin; 19914184Sedward 20014184Sedward if (w == oldselwin) 20114184Sedward return; 20214071Sedward if (selwin = w) { 20314184Sedward labelwin(w); 20413977Sedward /* bring it to the top just below cmdwin */ 20514025Sedward wwsetcurwin(w); 20614025Sedward wwsetcurwin(cmdwin); 20714071Sedward Woncursor(w->ww_win, 1); 20813977Sedward } 20914184Sedward if (oldselwin) { 21014184Sedward labelwin(oldselwin); 21114184Sedward Woncursor(oldselwin->ww_win, 0); 21214184Sedward } 21313977Sedward } 21413977Sedward 21514184Sedward labelwin(w) 21613977Sedward register struct ww *w; 21713977Sedward { 21813977Sedward char buf[2]; 21914184Sedward int mode = w == selwin ? WINVERSE : 0; 22013977Sedward 22113977Sedward buf[0] = w->ww_ident + '0'; 22213977Sedward buf[1] = 0; 22314177Sedward wwlabel(w, 1, buf, mode); 22414177Sedward if (w->ww_label) 22514177Sedward wwlabel(w, 3, w->ww_label, mode); 22613977Sedward } 227