113977Sedward #ifndef lint 2*18335Sedward static char sccsid[] = "@(#)cmd.c 3.32 03/13/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) 7518204Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 7614998Sedward break; 7718204Sedward case 's': 7818204Sedward if ((w = getwin()) != 0) 7918204Sedward c_size(w); 8018204Sedward break; 8118204Sedward case 'S': 8218204Sedward if ((w = getwin()) != 0) 8318204Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 8418204Sedward 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*18335Sedward stopwin(selwin); 12014893Sedward break; 12116309Sedward case ctrl(q): 122*18335Sedward startwin(selwin); 12314893Sedward break; 12416309Sedward case ctrl(l): 12514893Sedward wwredraw(); 12614893Sedward break; 12714893Sedward case '?': 12814893Sedward c_help(); 12914893Sedward break; 13016309Sedward case ctrl([): 13114893Sedward if (checkproc(selwin) >= 0) 13216280Sedward out = 1; 13314893Sedward break; 13416309Sedward case ctrl(z): 13514893Sedward wwsuspend(); 13614893Sedward break; 13714893Sedward case 'q': 13814893Sedward c_quit(); 13914893Sedward break; 14014998Sedward /* debugging stuff */ 14114998Sedward case '&': 14214998Sedward if (debug) { 14314998Sedward c_debug(); 14414998Sedward break; 14514998Sedward } 14614893Sedward default: 14714893Sedward if (c == escapec) { 14814893Sedward if (checkproc(selwin) >= 0) { 14914893Sedward (void) write(selwin->ww_pty, 15014893Sedward &escapec, 1); 15116280Sedward out = 1; 15214893Sedward } 15314893Sedward } else { 15414893Sedward if (!terse) 15516313Sedward wwbell(); 15614893Sedward error("Type ? for help."); 15714893Sedward } 15814177Sedward } 15914893Sedward } 16016280Sedward if (out || quit) 16113977Sedward break; 16214893Sedward if (terse) 16314893Sedward wwsetcursor(0, 0); 16414893Sedward else { 16516113Sedward wwputs("Command: ", cmdwin); 16614893Sedward wwcurtowin(cmdwin); 16713977Sedward } 16815871Sedward while (wwpeekc() < 0) 16915871Sedward wwiomux(); 17013977Sedward } 17116280Sedward if (!quit) 17216280Sedward setcmd(0); 17313977Sedward } 17413977Sedward 17513977Sedward struct ww * 17613977Sedward getwin() 17713977Sedward { 17813977Sedward register int c; 17914184Sedward struct ww *w = 0; 18013977Sedward 18114189Sedward if (!terse) 18216113Sedward wwputs("Which window? ", cmdwin); 18314987Sedward wwcurtowin(cmdwin); 18415871Sedward while ((c = wwgetc()) < 0) 18515871Sedward wwiomux(); 18614407Sedward if (debug && c == 'c') 18714407Sedward w = cmdwin; 18814407Sedward else if (debug && c == 'f') 18914407Sedward w = framewin; 19014795Sedward else if (debug && c == 'b') 19114795Sedward w = boxwin; 19214407Sedward else if (c >= '1' && c < NWINDOW + '1') 19314407Sedward w = window[c - '1']; 19414407Sedward if (w == 0) 19516313Sedward wwbell(); 19614189Sedward if (!terse) 19716312Sedward wwputc('\n', cmdwin); 19813977Sedward return w; 19913977Sedward } 20013977Sedward 20114893Sedward checkproc(w) 20214893Sedward struct ww *w; 20314893Sedward { 20414893Sedward if (w->ww_state != WWS_HASPROC) { 20514893Sedward error("No process in window."); 20614893Sedward return -1; 20714893Sedward } 20814893Sedward return 0; 20914893Sedward } 21016280Sedward 21116280Sedward setcmd(new) 21216280Sedward char new; 21316280Sedward { 21416280Sedward if (new && !incmd) { 21516280Sedward if (!terse) 21616280Sedward wwadd(cmdwin, &wwhead); 21716280Sedward if (selwin != 0) 21816280Sedward wwcursor(selwin, 1); 21916280Sedward wwcurwin = 0; 22016280Sedward } else if (!new && incmd) { 22116280Sedward if (!terse) { 22216280Sedward wwdelete(cmdwin); 22316280Sedward reframe(); 22416280Sedward } 22516280Sedward if (selwin != 0) 22616280Sedward wwcursor(selwin, 0); 22716280Sedward wwcurwin = selwin; 22816280Sedward } 22916280Sedward incmd = new; 23016280Sedward } 23116280Sedward 23216280Sedward setterse(new) 23316280Sedward char new; 23416280Sedward { 23516280Sedward if (incmd) 23616280Sedward if (new && !terse) { 23716280Sedward wwdelete(cmdwin); 23816280Sedward reframe(); 23916280Sedward } else if (!new && terse) 24016280Sedward wwadd(cmdwin, &wwhead); 24116280Sedward terse = new; 24216280Sedward } 24316280Sedward 24416280Sedward /* 24516280Sedward * Set the current window. 24616280Sedward */ 24716280Sedward setselwin(w) 24816280Sedward struct ww *w; 24916280Sedward { 25016280Sedward if (selwin == w) 25116280Sedward return; 25216304Sedward if (selwin != 0) 25316304Sedward lastselwin = selwin; 25416304Sedward if ((selwin = w) != 0) 25516304Sedward front(selwin, 1); 25616280Sedward } 257