113977Sedward #ifndef lint 2*15363Sedward static char *sccsid = "@(#)cmd.c 3.14 83/11/02"; 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 (;;) { 1714893Sedward while ((c = bgetc()) >= 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) { 4514893Sedward wwbell(); 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; 5614893Sedward case 'c': 5714893Sedward if ((w = getwin()) != 0) 5814893Sedward c_close(w); 5914893Sedward break; 6014893Sedward case 'C': 6114893Sedward c_close((struct ww *)0); 6214893Sedward break; 6314893Sedward case 'w': 6414893Sedward c_window(); 6514893Sedward break; 6614893Sedward case 'm': 6714893Sedward if ((w = getwin()) != 0) 6814893Sedward c_move(w); 6914893Sedward break; 7014998Sedward case 'M': 7114998Sedward if ((w = getwin()) != 0) 7214998Sedward movewin(w, w->ww_altpos.r, 7314998Sedward w->ww_altpos.c); 7414998Sedward break; 7514893Sedward case 'S': 7614893Sedward c_show(); 7714893Sedward break; 7814893Sedward case 'L': 7914893Sedward c_list(); 8014893Sedward break; 8114893Sedward case ':': 8214893Sedward c_colon(); 8314893Sedward break; 8414893Sedward case 'h': 8514893Sedward (void) wwwrite(selwin, "\b", 1); 8614893Sedward break; 8714893Sedward case 'j': 8814893Sedward (void) wwwrite(selwin, "\n", 1); 8914893Sedward break; 9014893Sedward case 'k': 9114893Sedward (void) wwwrite(selwin, "\033A", 2); 9214893Sedward break; 9314893Sedward case 'l': 9414893Sedward (void) wwwrite(selwin, "\033C", 2); 9514893Sedward break; 9614893Sedward case CTRL(e): 9714893Sedward wwscroll(selwin, 1); 9814893Sedward break; 9914893Sedward case CTRL(y): 10014893Sedward wwscroll(selwin, -1); 10114893Sedward break; 10214893Sedward case CTRL(d): 10314893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 10414893Sedward break; 10514893Sedward case CTRL(u): 10614893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 10714893Sedward break; 10814893Sedward case CTRL(f): 10914893Sedward wwscroll(selwin, selwin->ww_w.nr); 11014893Sedward break; 11114893Sedward case CTRL(b): 11214893Sedward wwscroll(selwin, - selwin->ww_w.nr); 11314893Sedward break; 11414893Sedward case CTRL(s): 11514893Sedward (void) write(selwin->ww_pty, 11614893Sedward &wwwintty.ww_tchars.t_stopc, 1); 11714893Sedward break; 11814893Sedward case CTRL(q): 11914893Sedward (void) write(selwin->ww_pty, 12014893Sedward &wwwintty.ww_tchars.t_startc, 1); 12114893Sedward break; 12214893Sedward case CTRL(l): 12314893Sedward wwredraw(); 12414893Sedward break; 12514893Sedward case '?': 12614893Sedward c_help(); 12714893Sedward break; 12814893Sedward case CTRL([): 12914893Sedward if (checkproc(selwin) >= 0) 13014893Sedward incmd = 0; 13114893Sedward break; 13214893Sedward case CTRL(z): 13314893Sedward wwsuspend(); 13414893Sedward break; 13514893Sedward case 'q': 13614893Sedward c_quit(); 13714893Sedward break; 13814893Sedward /* undocumented commands */ 13914893Sedward case 's': 14014893Sedward c_stat(); 14114893Sedward break; 142*15363Sedward #ifndef O_4_1A 14314893Sedward case 't': 14414893Sedward c_time(RUSAGE_SELF); 14514893Sedward break; 14614893Sedward case 'T': 14714893Sedward c_time(RUSAGE_CHILDREN); 14814893Sedward break; 149*15363Sedward #endif 15014998Sedward /* debugging stuff */ 15114998Sedward case '&': 15214998Sedward if (debug) { 15314998Sedward c_debug(); 15414998Sedward break; 15514998Sedward } 15614893Sedward default: 15714893Sedward if (c == escapec) { 15814893Sedward if (checkproc(selwin) >= 0) { 15914893Sedward (void) write(selwin->ww_pty, 16014893Sedward &escapec, 1); 16114893Sedward incmd = 0; 16214893Sedward } 16314893Sedward } else { 16414893Sedward if (!terse) 16514893Sedward wwbell(); 16614893Sedward error("Type ? for help."); 16714893Sedward } 16814177Sedward } 16914893Sedward } 17014893Sedward if (!incmd || quit) 17113977Sedward break; 17214893Sedward if (terse) 17314893Sedward wwsetcursor(0, 0); 17414893Sedward else { 17514893Sedward (void) wwputs("Command: ", cmdwin); 17614893Sedward wwcurtowin(cmdwin); 17713977Sedward } 17814893Sedward while (bpeekc() < 0) 17914893Sedward bread(); 18013977Sedward } 18114407Sedward if (!quit) { 18214407Sedward if (!terse) { 18314407Sedward wwdelete(cmdwin); 18414407Sedward reframe(); 18514407Sedward } 18614893Sedward wwcursor(selwin, 0); 18714407Sedward } 18813977Sedward } 18913977Sedward 19013977Sedward struct ww * 19113977Sedward getwin() 19213977Sedward { 19313977Sedward register int c; 19414184Sedward struct ww *w = 0; 19513977Sedward 19614189Sedward if (!terse) 19714407Sedward (void) wwputs("Which window? ", cmdwin); 19814987Sedward wwcurtowin(cmdwin); 19913994Sedward while ((c = bgetc()) < 0) 20013977Sedward bread(); 20114407Sedward if (debug && c == 'c') 20214407Sedward w = cmdwin; 20314407Sedward else if (debug && c == 'f') 20414407Sedward w = framewin; 20514795Sedward else if (debug && c == 'b') 20614795Sedward w = boxwin; 20714407Sedward else if (c >= '1' && c < NWINDOW + '1') 20814407Sedward w = window[c - '1']; 20914407Sedward if (w == 0) 21014407Sedward wwbell(); 21114189Sedward if (!terse) 21214407Sedward (void) wwputs("\r\n", cmdwin); 21313977Sedward return w; 21413977Sedward } 21513977Sedward 21614893Sedward checkproc(w) 21714893Sedward struct ww *w; 21814893Sedward { 21914893Sedward if (w->ww_state != WWS_HASPROC) { 22014893Sedward error("No process in window."); 22114893Sedward return -1; 22214893Sedward } 22314893Sedward return 0; 22414893Sedward } 22514893Sedward 22613977Sedward setselwin(w) 22714847Sedward struct ww *w; 22814847Sedward { 22914847Sedward if ((selwin = w) != 0) 23014847Sedward front(w); 23114847Sedward } 23214847Sedward 23314896Sedward /* 23414896Sedward * This is all heuristic. 23514998Sedward * wwvisible() doesn't work for tinted windows. 23614998Sedward * and wwmoveup() doesn't work for transparent windows 23714998Sedward * (completely or partially). 23814896Sedward * But anything to make it faster. 23914896Sedward */ 24014847Sedward front(w) 24113977Sedward register struct ww *w; 24213977Sedward { 24314847Sedward char moved = 0; 24414184Sedward 24514896Sedward if (wwvisible(w)) 24614847Sedward moved = 1; 24714896Sedward else 24814896Sedward while (w->ww_back != framewin) { 24914896Sedward wwmoveup(w); 25014896Sedward moved = 1; 25114896Sedward } 25214847Sedward if (moved) 25314847Sedward reframe(); 25413977Sedward } 25513977Sedward 25614847Sedward reframe() 25714847Sedward { 25814847Sedward register struct ww *w; 25914847Sedward 26014847Sedward wwunframe(framewin); 26114847Sedward for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) 26214847Sedward if (w->ww_hasframe) { 26314847Sedward wwframe(w, framewin); 26414847Sedward labelwin(w); 26514847Sedward } 26614847Sedward } 26714847Sedward 26814184Sedward labelwin(w) 26913977Sedward register struct ww *w; 27013977Sedward { 27114407Sedward int mode = w == selwin ? WWM_REV : 0; 27213977Sedward 27314407Sedward if (w->ww_id >= 0) { 27414407Sedward char buf[2]; 27514407Sedward 27614407Sedward buf[0] = w->ww_id + '1'; 27714407Sedward buf[1] = 0; 27814854Sedward wwlabel(w, framewin, 1, buf, mode); 27914407Sedward } 28014407Sedward if (w->ww_label) { 28114407Sedward int col; 28214407Sedward 28314407Sedward if (w->ww_center) { 28414407Sedward col = (w->ww_w.nc - strlen(w->ww_label)) / 2; 28514407Sedward col = MAX(3, col); 28614407Sedward } else 28714407Sedward col = 3; 28814854Sedward wwlabel(w, framewin, col, w->ww_label, mode); 28914407Sedward } 29013977Sedward } 291