113977Sedward #ifndef lint 2*14407Sedward static char *sccsid = "@(#)cmd.c 2.1.1.1 83/08/09"; 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) 15*14407Sedward wwadd(cmdwin, &wwhead); 16*14407Sedward /* 1714071Sedward if (selwin != 0) 1814071Sedward Woncursor(selwin->ww_win, 1); 19*14407Sedward */ 2014189Sedward top: 2113977Sedward while ((c = bgetc()) >= 0) { 2214189Sedward if (!terse) 23*14407Sedward (void) wwputs("\r\n", cmdwin); 2413977Sedward switch (c) { 2514177Sedward default: 2614177Sedward if (c == escapec) 2714177Sedward goto foo; 2814177Sedward break; 2914071Sedward case 'h': case 'j': case 'k': case 'l': 3014071Sedward case CTRL(u): 3114071Sedward case CTRL(d): 3214071Sedward case CTRL(b): 3314071Sedward case CTRL(f): 3413977Sedward case CTRL([): 3514177Sedward foo: 3613977Sedward if (selwin == 0) { 37*14407Sedward error("No window."); 3813977Sedward continue; 3913977Sedward } 4013977Sedward } 4113977Sedward switch (c) { 4213977Sedward case '1': case '2': case '3': case '4': case '5': 4313977Sedward case '6': case '7': case '8': case '9': 44*14407Sedward if ((w = window[c - '1']) == 0) { 45*14407Sedward wwbell(); 4613977Sedward break; 4713977Sedward } 4813977Sedward setselwin(w); 4913977Sedward goto out; 5013977Sedward case '%': 5114184Sedward if ((w = getwin()) != 0) 5214184Sedward setselwin(w); 5313977Sedward break; 5413977Sedward case 'c': 5514184Sedward if ((w = getwin()) != 0) 56*14407Sedward c_close(w); 5714071Sedward break; 5813977Sedward case 'C': 59*14407Sedward c_close((struct ww *)0); 6014071Sedward break; 6113977Sedward case 'Z': 62*14407Sedward error("Command Z is now C."); 6313977Sedward break; 6413977Sedward case 'w': 65*14407Sedward c_window(); 6613977Sedward break; 6714184Sedward case 'S': 68*14407Sedward c_show(); 6913994Sedward break; 7014189Sedward case 'L': 71*14407Sedward c_list(); 7214189Sedward break; 73*14407Sedward case 's': 74*14407Sedward c_stat(); 7514177Sedward break; 76*14407Sedward case 'M': 77*14407Sedward wwdumpsmap(); 7814184Sedward break; 79*14407Sedward case 'V': 80*14407Sedward if ((w = getwin()) != 0) 81*14407Sedward wwdumpnvis(w); 8213977Sedward break; 83*14407Sedward case 'D': 84*14407Sedward if ((w = getwin()) != 0) 85*14407Sedward wwdumpcov(w); 8613977Sedward break; 87*14407Sedward case 'W': 88*14407Sedward if ((w = getwin()) != 0) 89*14407Sedward wwdumpwin(w); 9014080Sedward break; 9113977Sedward case 't': 92*14407Sedward c_time(RUSAGE_SELF); 9313977Sedward break; 9413977Sedward case 'T': 95*14407Sedward c_time(RUSAGE_CHILDREN); 9613977Sedward break; 9714184Sedward case ':': 98*14407Sedward c_colon(); 9914184Sedward break; 10014071Sedward case 'h': 101*14407Sedward (void) wwwrite(selwin, "\b", 1); 10214071Sedward break; 10314071Sedward case 'j': 104*14407Sedward (void) wwwrite(selwin, "\n", 1); 10514071Sedward break; 10614071Sedward case 'k': 107*14407Sedward (void) wwwrite(selwin, "\033A", 2); 10814071Sedward break; 10914071Sedward case 'l': 110*14407Sedward (void) wwwrite(selwin, "\033C", 2); 11114071Sedward break; 112*14407Sedward /* 11314071Sedward case CTRL(d): 114*14407Sedward c_scroll(1); 11514071Sedward break; 11614071Sedward case CTRL(u): 117*14407Sedward c_scroll(-1); 11814071Sedward break; 11914071Sedward case CTRL(f): 120*14407Sedward c_scroll(2); 12114071Sedward break; 12214071Sedward case CTRL(b): 123*14407Sedward c_scroll(-2); 12414071Sedward break; 125*14407Sedward */ 12613977Sedward case CTRL(l): 127*14407Sedward wwredraw(); 12813977Sedward break; 12913977Sedward case '?': 130*14407Sedward c_help(); 13113977Sedward break; 13213977Sedward case CTRL([): 13313977Sedward goto out; 13413977Sedward case CTRL(z): 13513977Sedward wwsuspend(); 13613977Sedward break; 13714189Sedward case 'q': 138*14407Sedward c_quit(); 13914025Sedward if (quit) 14014025Sedward goto out; 14114025Sedward break; 14214189Sedward case '.': 143*14407Sedward error("Use q to quit."); 14414189Sedward break; 14513977Sedward default: 14614177Sedward if (c == escapec) { 147*14407Sedward (void) write(selwin->ww_pty, &escapec, 1); 14814177Sedward goto out; 14914177Sedward } 15014189Sedward if (!terse) 151*14407Sedward wwbell(); 152*14407Sedward error("Type ? for help."); 15313977Sedward break; 15413977Sedward } 15513977Sedward } 15614189Sedward if (terse) 15714189Sedward wwsetcursor(0, 0); 15814189Sedward else { 15914189Sedward if (!terse) 160*14407Sedward (void) wwputs("Command: ", cmdwin); 161*14407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 16214189Sedward } 16313994Sedward while (bpeekc() < 0) 16413977Sedward bread(); 16513977Sedward goto top; 16613977Sedward out: 167*14407Sedward if (!quit) { 168*14407Sedward curwin = selwin; 169*14407Sedward if (!terse) { 170*14407Sedward wwdelete(cmdwin); 171*14407Sedward reframe(); 172*14407Sedward } 173*14407Sedward } 174*14407Sedward /* 17514071Sedward if (selwin != 0) 17614071Sedward Woncursor(selwin->ww_win, 0); 177*14407Sedward */ 17813977Sedward } 17913977Sedward 18013977Sedward struct ww * 18113977Sedward getwin() 18213977Sedward { 18313977Sedward register int c; 18414184Sedward struct ww *w = 0; 18513977Sedward 18614189Sedward if (!terse) 187*14407Sedward (void) wwputs("Which window? ", cmdwin); 188*14407Sedward wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); 18913994Sedward while ((c = bgetc()) < 0) 19013977Sedward bread(); 191*14407Sedward if (debug && c == 'c') 192*14407Sedward w = cmdwin; 193*14407Sedward else if (debug && c == 'f') 194*14407Sedward w = framewin; 195*14407Sedward else if (c >= '1' && c < NWINDOW + '1') 196*14407Sedward w = window[c - '1']; 197*14407Sedward if (w == 0) 198*14407Sedward wwbell(); 19914189Sedward if (!terse) 200*14407Sedward (void) wwputs("\r\n", cmdwin); 20113977Sedward return w; 20213977Sedward } 20313977Sedward 20413977Sedward setselwin(w) 20513977Sedward register struct ww *w; 20613977Sedward { 207*14407Sedward register struct ww *oldselwin = selwin; 20814184Sedward 20914184Sedward if (w == oldselwin) 21014184Sedward return; 21114071Sedward if (selwin = w) { 212*14407Sedward wwdelete(w); 213*14407Sedward /* 214*14407Sedward * Stick it in front of the old selected window, 215*14407Sedward * or behind everbody else. 216*14407Sedward */ 217*14407Sedward wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); 218*14407Sedward /* 21914071Sedward Woncursor(w->ww_win, 1); 220*14407Sedward */ 22113977Sedward } 222*14407Sedward /* 22314184Sedward if (oldselwin) { 22414184Sedward Woncursor(oldselwin->ww_win, 0); 22514184Sedward } 226*14407Sedward */ 227*14407Sedward reframe(); 22813977Sedward } 22913977Sedward 23014184Sedward labelwin(w) 23113977Sedward register struct ww *w; 23213977Sedward { 233*14407Sedward int mode = w == selwin ? WWM_REV : 0; 23413977Sedward 235*14407Sedward if (w->ww_id >= 0) { 236*14407Sedward char buf[2]; 237*14407Sedward 238*14407Sedward buf[0] = w->ww_id + '1'; 239*14407Sedward buf[1] = 0; 240*14407Sedward (void) wwlabel(w, framewin, 1, buf, mode); 241*14407Sedward } 242*14407Sedward if (w->ww_label) { 243*14407Sedward int col; 244*14407Sedward 245*14407Sedward if (w->ww_center) { 246*14407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 247*14407Sedward col = MAX(3, col); 248*14407Sedward } else 249*14407Sedward col = 3; 250*14407Sedward (void) wwlabel(w, framewin, col, w->ww_label, mode); 251*14407Sedward } 25213977Sedward } 253