113977Sedward #ifndef lint 2*18204Sedward static char sccsid[] = "@(#)cmd.c 3.31 03/01/85"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 616309Sedward #include "char.h" 713977Sedward 813977Sedward docmd() 913977Sedward { 1013977Sedward register char c; 1113977Sedward register struct ww *w; 1216280Sedward char out = 0; 1313977Sedward 1414893Sedward for (;;) { 1515871Sedward while ((c = wwgetc()) >= 0) { 1614893Sedward if (!terse) 1716312Sedward wwputc('\n', cmdwin); 1814893Sedward switch (c) { 1914893Sedward default: 2014893Sedward if (c == escapec) 2114893Sedward goto foo; 2213977Sedward break; 2314893Sedward case 'h': case 'j': case 'k': case 'l': 2416309Sedward case ctrl(y): 2516309Sedward case ctrl(e): 2616309Sedward case ctrl(u): 2716309Sedward case ctrl(d): 2816309Sedward case ctrl(b): 2916309Sedward case ctrl(f): 3016309Sedward case ctrl(s): 3116309Sedward case ctrl(q): 3216309Sedward case ctrl([): 3314893Sedward foo: 3414893Sedward if (selwin == 0) { 3514893Sedward error("No window."); 3614893Sedward continue; 3714893Sedward } 3813977Sedward } 3914893Sedward switch (c) { 4014893Sedward case '1': case '2': case '3': case '4': case '5': 4114893Sedward case '6': case '7': case '8': case '9': 4214893Sedward if ((w = window[c - '1']) == 0) { 4315620Sedward error("%c: No such window.", c); 4414893Sedward break; 4514893Sedward } 4614184Sedward setselwin(w); 4714893Sedward if (checkproc(selwin) >= 0) 4816280Sedward out = 1; 4914893Sedward break; 5014893Sedward case '%': 5114893Sedward if ((w = getwin()) != 0) 5214893Sedward setselwin(w); 5314893Sedward break; 5416309Sedward case ctrl(^): 5515620Sedward if (lastselwin != 0) { 5615620Sedward setselwin(lastselwin); 5715620Sedward if (checkproc(selwin) >= 0) 5816280Sedward out = 1; 5915620Sedward } else 6015620Sedward error("No previous window."); 6115620Sedward break; 6214893Sedward case 'c': 6314893Sedward if ((w = getwin()) != 0) 6414893Sedward c_close(w); 6514893Sedward break; 6614893Sedward case 'w': 6714893Sedward c_window(); 6814893Sedward break; 6914893Sedward case 'm': 7014893Sedward if ((w = getwin()) != 0) 7114893Sedward c_move(w); 7214893Sedward break; 7314998Sedward case 'M': 7414998Sedward if ((w = getwin()) != 0) 75*18204Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 7614998Sedward break; 77*18204Sedward case 's': 78*18204Sedward if ((w = getwin()) != 0) 79*18204Sedward c_size(w); 80*18204Sedward break; 81*18204Sedward case 'S': 82*18204Sedward if ((w = getwin()) != 0) 83*18204Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 84*18204Sedward break; 8514893Sedward case ':': 8614893Sedward c_colon(); 8714893Sedward break; 8814893Sedward case 'h': 8914893Sedward (void) wwwrite(selwin, "\b", 1); 9014893Sedward break; 9114893Sedward case 'j': 9214893Sedward (void) wwwrite(selwin, "\n", 1); 9314893Sedward break; 9414893Sedward case 'k': 9514893Sedward (void) wwwrite(selwin, "\033A", 2); 9614893Sedward break; 9714893Sedward case 'l': 9814893Sedward (void) wwwrite(selwin, "\033C", 2); 9914893Sedward break; 10016309Sedward case ctrl(e): 10114893Sedward wwscroll(selwin, 1); 10214893Sedward break; 10316309Sedward case ctrl(y): 10414893Sedward wwscroll(selwin, -1); 10514893Sedward break; 10616309Sedward case ctrl(d): 10714893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 10814893Sedward break; 10916309Sedward case ctrl(u): 11014893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 11114893Sedward break; 11216309Sedward case ctrl(f): 11314893Sedward wwscroll(selwin, selwin->ww_w.nr); 11414893Sedward break; 11516309Sedward case ctrl(b): 11614893Sedward wwscroll(selwin, - selwin->ww_w.nr); 11714893Sedward break; 11816309Sedward case ctrl(s): 119*18204Sedward if (selwin->ww_pty < 0) 120*18204Sedward break; 121*18204Sedward if (selwin->ww_ispty) { 122*18204Sedward (void) ioctl(selwin->ww_pty, TIOCSTOP, 123*18204Sedward (char *)0); 124*18204Sedward selwin->ww_stopped = 1; 125*18204Sedward } else 126*18204Sedward (void) write(selwin->ww_pty, 127*18204Sedward &wwwintty.ww_tchars.t_stopc, 1); 12814893Sedward break; 12916309Sedward case ctrl(q): 130*18204Sedward if (selwin->ww_pty < 0) 131*18204Sedward break; 132*18204Sedward if (selwin->ww_ispty) { 133*18204Sedward (void) ioctl(selwin->ww_pty, TIOCSTART, 134*18204Sedward (char *)0); 135*18204Sedward selwin->ww_stopped = 0; 136*18204Sedward } else 137*18204Sedward (void) write(selwin->ww_pty, 138*18204Sedward &wwwintty.ww_tchars.t_startc, 139*18204Sedward 1); 14014893Sedward break; 14116309Sedward case ctrl(l): 14214893Sedward wwredraw(); 14314893Sedward break; 14414893Sedward case '?': 14514893Sedward c_help(); 14614893Sedward break; 14716309Sedward case ctrl([): 14814893Sedward if (checkproc(selwin) >= 0) 14916280Sedward out = 1; 15014893Sedward break; 15116309Sedward case ctrl(z): 15214893Sedward wwsuspend(); 15314893Sedward break; 15414893Sedward case 'q': 15514893Sedward c_quit(); 15614893Sedward break; 15714998Sedward /* debugging stuff */ 15814998Sedward case '&': 15914998Sedward if (debug) { 16014998Sedward c_debug(); 16114998Sedward break; 16214998Sedward } 16314893Sedward default: 16414893Sedward if (c == escapec) { 16514893Sedward if (checkproc(selwin) >= 0) { 16614893Sedward (void) write(selwin->ww_pty, 16714893Sedward &escapec, 1); 16816280Sedward out = 1; 16914893Sedward } 17014893Sedward } else { 17114893Sedward if (!terse) 17216313Sedward wwbell(); 17314893Sedward error("Type ? for help."); 17414893Sedward } 17514177Sedward } 17614893Sedward } 17716280Sedward if (out || quit) 17813977Sedward break; 17914893Sedward if (terse) 18014893Sedward wwsetcursor(0, 0); 18114893Sedward else { 18216113Sedward wwputs("Command: ", cmdwin); 18314893Sedward wwcurtowin(cmdwin); 18413977Sedward } 18515871Sedward while (wwpeekc() < 0) 18615871Sedward wwiomux(); 18713977Sedward } 18816280Sedward if (!quit) 18916280Sedward setcmd(0); 19013977Sedward } 19113977Sedward 19213977Sedward struct ww * 19313977Sedward getwin() 19413977Sedward { 19513977Sedward register int c; 19614184Sedward struct ww *w = 0; 19713977Sedward 19814189Sedward if (!terse) 19916113Sedward wwputs("Which window? ", cmdwin); 20014987Sedward wwcurtowin(cmdwin); 20115871Sedward while ((c = wwgetc()) < 0) 20215871Sedward wwiomux(); 20314407Sedward if (debug && c == 'c') 20414407Sedward w = cmdwin; 20514407Sedward else if (debug && c == 'f') 20614407Sedward w = framewin; 20714795Sedward else if (debug && c == 'b') 20814795Sedward w = boxwin; 20914407Sedward else if (c >= '1' && c < NWINDOW + '1') 21014407Sedward w = window[c - '1']; 21114407Sedward if (w == 0) 21216313Sedward wwbell(); 21314189Sedward if (!terse) 21416312Sedward wwputc('\n', cmdwin); 21513977Sedward return w; 21613977Sedward } 21713977Sedward 21814893Sedward checkproc(w) 21914893Sedward struct ww *w; 22014893Sedward { 22114893Sedward if (w->ww_state != WWS_HASPROC) { 22214893Sedward error("No process in window."); 22314893Sedward return -1; 22414893Sedward } 22514893Sedward return 0; 22614893Sedward } 22716280Sedward 22816280Sedward setcmd(new) 22916280Sedward char new; 23016280Sedward { 23116280Sedward if (new && !incmd) { 23216280Sedward if (!terse) 23316280Sedward wwadd(cmdwin, &wwhead); 23416280Sedward if (selwin != 0) 23516280Sedward wwcursor(selwin, 1); 23616280Sedward wwcurwin = 0; 23716280Sedward } else if (!new && incmd) { 23816280Sedward if (!terse) { 23916280Sedward wwdelete(cmdwin); 24016280Sedward reframe(); 24116280Sedward } 24216280Sedward if (selwin != 0) 24316280Sedward wwcursor(selwin, 0); 24416280Sedward wwcurwin = selwin; 24516280Sedward } 24616280Sedward incmd = new; 24716280Sedward } 24816280Sedward 24916280Sedward setterse(new) 25016280Sedward char new; 25116280Sedward { 25216280Sedward if (incmd) 25316280Sedward if (new && !terse) { 25416280Sedward wwdelete(cmdwin); 25516280Sedward reframe(); 25616280Sedward } else if (!new && terse) 25716280Sedward wwadd(cmdwin, &wwhead); 25816280Sedward terse = new; 25916280Sedward } 26016280Sedward 26116280Sedward /* 26216280Sedward * Set the current window. 26316280Sedward */ 26416280Sedward setselwin(w) 26516280Sedward struct ww *w; 26616280Sedward { 26716280Sedward if (selwin == w) 26816280Sedward return; 26916304Sedward if (selwin != 0) 27016304Sedward lastselwin = selwin; 27116304Sedward if ((selwin = w) != 0) 27216304Sedward front(selwin, 1); 27316280Sedward } 274