113977Sedward #ifndef lint 2*15871Sedward static char *sccsid = "@(#)cmd.c 3.20 84/01/16"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward docmd() 813977Sedward { 913977Sedward register char c; 1013977Sedward register struct ww *w; 1113977Sedward 1214177Sedward if (!terse) 1314407Sedward wwadd(cmdwin, &wwhead); 1414071Sedward if (selwin != 0) 1514764Sedward wwcursor(selwin, 1); 1614893Sedward for (;;) { 17*15871Sedward while ((c = wwgetc()) >= 0) { 1814893Sedward if (!terse) 1914893Sedward (void) wwputs("\r\n", cmdwin); 2014893Sedward switch (c) { 2114893Sedward default: 2214893Sedward if (c == escapec) 2314893Sedward goto foo; 2413977Sedward break; 2514893Sedward case 'h': case 'j': case 'k': case 'l': 2614893Sedward case CTRL(y): 2714893Sedward case CTRL(e): 2814893Sedward case CTRL(u): 2914893Sedward case CTRL(d): 3014893Sedward case CTRL(b): 3114893Sedward case CTRL(f): 3214893Sedward case CTRL(s): 3314893Sedward case CTRL(q): 3414893Sedward case CTRL([): 3514893Sedward foo: 3614893Sedward if (selwin == 0) { 3714893Sedward error("No window."); 3814893Sedward continue; 3914893Sedward } 4013977Sedward } 4114893Sedward switch (c) { 4214893Sedward case '1': case '2': case '3': case '4': case '5': 4314893Sedward case '6': case '7': case '8': case '9': 4414893Sedward if ((w = window[c - '1']) == 0) { 4515620Sedward error("%c: No such window.", c); 4614893Sedward break; 4714893Sedward } 4814184Sedward setselwin(w); 4914893Sedward if (checkproc(selwin) >= 0) 5014893Sedward incmd = 0; 5114893Sedward break; 5214893Sedward case '%': 5314893Sedward if ((w = getwin()) != 0) 5414893Sedward setselwin(w); 5514893Sedward break; 5615620Sedward case CTRL(^): 5715620Sedward if (lastselwin != 0) { 5815620Sedward setselwin(lastselwin); 5915620Sedward if (checkproc(selwin) >= 0) 6015620Sedward incmd = 0; 6115620Sedward } else 6215620Sedward error("No previous window."); 6315620Sedward break; 6414893Sedward case 'c': 6514893Sedward if ((w = getwin()) != 0) 6614893Sedward c_close(w); 6714893Sedward break; 6814893Sedward case 'C': 6914893Sedward c_close((struct ww *)0); 7014893Sedward break; 7114893Sedward case 'w': 7214893Sedward c_window(); 7314893Sedward break; 7414893Sedward case 'm': 7514893Sedward if ((w = getwin()) != 0) 7614893Sedward c_move(w); 7714893Sedward break; 7814998Sedward case 'M': 7914998Sedward if ((w = getwin()) != 0) 8014998Sedward movewin(w, w->ww_altpos.r, 8114998Sedward w->ww_altpos.c); 8214998Sedward break; 8314893Sedward case 'S': 8414893Sedward c_show(); 8514893Sedward break; 8614893Sedward case 'L': 8714893Sedward c_list(); 8814893Sedward break; 8915673Sedward case 'v': 9015673Sedward c_variable(); 9115673Sedward break; 9214893Sedward case ':': 9314893Sedward c_colon(); 9414893Sedward break; 9514893Sedward case 'h': 9614893Sedward (void) wwwrite(selwin, "\b", 1); 9714893Sedward break; 9814893Sedward case 'j': 9914893Sedward (void) wwwrite(selwin, "\n", 1); 10014893Sedward break; 10114893Sedward case 'k': 10214893Sedward (void) wwwrite(selwin, "\033A", 2); 10314893Sedward break; 10414893Sedward case 'l': 10514893Sedward (void) wwwrite(selwin, "\033C", 2); 10614893Sedward break; 10714893Sedward case CTRL(e): 10814893Sedward wwscroll(selwin, 1); 10914893Sedward break; 11014893Sedward case CTRL(y): 11114893Sedward wwscroll(selwin, -1); 11214893Sedward break; 11314893Sedward case CTRL(d): 11414893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11514893Sedward break; 11614893Sedward case CTRL(u): 11714893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 11814893Sedward break; 11914893Sedward case CTRL(f): 12014893Sedward wwscroll(selwin, selwin->ww_w.nr); 12114893Sedward break; 12214893Sedward case CTRL(b): 12314893Sedward wwscroll(selwin, - selwin->ww_w.nr); 12414893Sedward break; 12514893Sedward case CTRL(s): 12614893Sedward (void) write(selwin->ww_pty, 12714893Sedward &wwwintty.ww_tchars.t_stopc, 1); 12814893Sedward break; 12914893Sedward case CTRL(q): 13014893Sedward (void) write(selwin->ww_pty, 13114893Sedward &wwwintty.ww_tchars.t_startc, 1); 13214893Sedward break; 13314893Sedward case CTRL(l): 13414893Sedward wwredraw(); 13514893Sedward break; 13614893Sedward case '?': 13714893Sedward c_help(); 13814893Sedward break; 13914893Sedward case CTRL([): 14014893Sedward if (checkproc(selwin) >= 0) 14114893Sedward incmd = 0; 14214893Sedward break; 14314893Sedward case CTRL(z): 14414893Sedward wwsuspend(); 14514893Sedward break; 14614893Sedward case 'q': 14714893Sedward c_quit(); 14814893Sedward break; 14914893Sedward /* undocumented commands */ 15014893Sedward case 's': 15114893Sedward c_stat(); 15214893Sedward break; 15315363Sedward #ifndef O_4_1A 15414893Sedward case 't': 15514893Sedward c_time(RUSAGE_SELF); 15614893Sedward break; 15714893Sedward case 'T': 15814893Sedward c_time(RUSAGE_CHILDREN); 15914893Sedward break; 16015363Sedward #endif 16114998Sedward /* debugging stuff */ 16214998Sedward case '&': 16314998Sedward if (debug) { 16414998Sedward c_debug(); 16514998Sedward break; 16614998Sedward } 16714893Sedward default: 16814893Sedward if (c == escapec) { 16914893Sedward if (checkproc(selwin) >= 0) { 17014893Sedward (void) write(selwin->ww_pty, 17114893Sedward &escapec, 1); 17214893Sedward incmd = 0; 17314893Sedward } 17414893Sedward } else { 17514893Sedward if (!terse) 17614893Sedward wwbell(); 17714893Sedward error("Type ? for help."); 17814893Sedward } 17914177Sedward } 18014893Sedward } 18114893Sedward if (!incmd || quit) 18213977Sedward break; 18314893Sedward if (terse) 18414893Sedward wwsetcursor(0, 0); 18514893Sedward else { 18614893Sedward (void) wwputs("Command: ", cmdwin); 18714893Sedward wwcurtowin(cmdwin); 18813977Sedward } 189*15871Sedward while (wwpeekc() < 0) 190*15871Sedward wwiomux(); 19113977Sedward } 19214407Sedward if (!quit) { 19314407Sedward if (!terse) { 19414407Sedward wwdelete(cmdwin); 19514407Sedward reframe(); 19614407Sedward } 19714893Sedward wwcursor(selwin, 0); 19814407Sedward } 19913977Sedward } 20013977Sedward 20113977Sedward struct ww * 20213977Sedward getwin() 20313977Sedward { 20413977Sedward register int c; 20514184Sedward struct ww *w = 0; 20613977Sedward 20714189Sedward if (!terse) 20814407Sedward (void) wwputs("Which window? ", cmdwin); 20914987Sedward wwcurtowin(cmdwin); 210*15871Sedward while ((c = wwgetc()) < 0) 211*15871Sedward wwiomux(); 21214407Sedward if (debug && c == 'c') 21314407Sedward w = cmdwin; 21414407Sedward else if (debug && c == 'f') 21514407Sedward w = framewin; 21614795Sedward else if (debug && c == 'b') 21714795Sedward w = boxwin; 21814407Sedward else if (c >= '1' && c < NWINDOW + '1') 21914407Sedward w = window[c - '1']; 22014407Sedward if (w == 0) 22114407Sedward wwbell(); 22214189Sedward if (!terse) 22314407Sedward (void) wwputs("\r\n", cmdwin); 22413977Sedward return w; 22513977Sedward } 22613977Sedward 22714893Sedward checkproc(w) 22814893Sedward struct ww *w; 22914893Sedward { 23014893Sedward if (w->ww_state != WWS_HASPROC) { 23114893Sedward error("No process in window."); 23214893Sedward return -1; 23314893Sedward } 23414893Sedward return 0; 23514893Sedward } 23614893Sedward 23713977Sedward setselwin(w) 23814847Sedward struct ww *w; 23914847Sedward { 24015703Sedward if (selwin == w) 24115703Sedward return; 24215620Sedward lastselwin = selwin; 24315658Sedward front(selwin = w, 1); 24414847Sedward } 24514847Sedward 24614896Sedward /* 24714998Sedward * wwvisible() doesn't work for tinted windows. 24814896Sedward * But anything to make it faster. 24914896Sedward */ 25015658Sedward front(w, doreframe) 25113977Sedward register struct ww *w; 25213977Sedward { 25315586Sedward if (!wwvisible(w) && w->ww_back != framewin) { 25415586Sedward wwdelete(w); 25515586Sedward wwadd(w, framewin); 25614847Sedward reframe(); 25715658Sedward } else if (doreframe) 25815658Sedward reframe(); 25913977Sedward } 26013977Sedward 26114847Sedward reframe() 26214847Sedward { 26314847Sedward register struct ww *w; 26414847Sedward 26514847Sedward wwunframe(framewin); 26614847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 26714847Sedward if (w->ww_hasframe) { 26814847Sedward wwframe(w, framewin); 26914847Sedward labelwin(w); 27014847Sedward } 27114847Sedward } 27214847Sedward 27314184Sedward labelwin(w) 27413977Sedward register struct ww *w; 27513977Sedward { 27614407Sedward int mode = w == selwin ? WWM_REV : 0; 27713977Sedward 27814407Sedward if (w->ww_id >= 0) { 27914407Sedward char buf[2]; 28014407Sedward 28114407Sedward buf[0] = w->ww_id + '1'; 28214407Sedward buf[1] = 0; 28314854Sedward wwlabel(w, framewin, 1, buf, mode); 28414407Sedward } 28514407Sedward if (w->ww_label) { 28614407Sedward int col; 28714407Sedward 28814407Sedward if (w->ww_center) { 28914407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 29014407Sedward col = MAX(3, col); 29114407Sedward } else 29214407Sedward col = 3; 29314854Sedward wwlabel(w, framewin, col, w->ww_label, mode); 29414407Sedward } 29513977Sedward } 296