113977Sedward #ifndef lint 2*16309Sedward static char *sccsid = "@(#)cmd.c 3.27 84/04/08"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 6*16309Sedward #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) 1716113Sedward wwputs("\r\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': 24*16309Sedward case ctrl(y): 25*16309Sedward case ctrl(e): 26*16309Sedward case ctrl(u): 27*16309Sedward case ctrl(d): 28*16309Sedward case ctrl(b): 29*16309Sedward case ctrl(f): 30*16309Sedward case ctrl(s): 31*16309Sedward case ctrl(q): 32*16309Sedward 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; 54*16309Sedward 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) 7514998Sedward movewin(w, w->ww_altpos.r, 7614998Sedward w->ww_altpos.c); 7714998Sedward break; 7814893Sedward case ':': 7914893Sedward c_colon(); 8014893Sedward break; 8114893Sedward case 'h': 8214893Sedward (void) wwwrite(selwin, "\b", 1); 8314893Sedward break; 8414893Sedward case 'j': 8514893Sedward (void) wwwrite(selwin, "\n", 1); 8614893Sedward break; 8714893Sedward case 'k': 8814893Sedward (void) wwwrite(selwin, "\033A", 2); 8914893Sedward break; 9014893Sedward case 'l': 9114893Sedward (void) wwwrite(selwin, "\033C", 2); 9214893Sedward break; 93*16309Sedward case ctrl(e): 9414893Sedward wwscroll(selwin, 1); 9514893Sedward break; 96*16309Sedward case ctrl(y): 9714893Sedward wwscroll(selwin, -1); 9814893Sedward break; 99*16309Sedward case ctrl(d): 10014893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 10114893Sedward break; 102*16309Sedward case ctrl(u): 10314893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 10414893Sedward break; 105*16309Sedward case ctrl(f): 10614893Sedward wwscroll(selwin, selwin->ww_w.nr); 10714893Sedward break; 108*16309Sedward case ctrl(b): 10914893Sedward wwscroll(selwin, - selwin->ww_w.nr); 11014893Sedward break; 111*16309Sedward case ctrl(s): 11214893Sedward (void) write(selwin->ww_pty, 11314893Sedward &wwwintty.ww_tchars.t_stopc, 1); 11414893Sedward break; 115*16309Sedward case ctrl(q): 11614893Sedward (void) write(selwin->ww_pty, 11714893Sedward &wwwintty.ww_tchars.t_startc, 1); 11814893Sedward break; 119*16309Sedward case ctrl(l): 12014893Sedward wwredraw(); 12114893Sedward break; 12214893Sedward case '?': 12314893Sedward c_help(); 12414893Sedward break; 125*16309Sedward case ctrl([): 12614893Sedward if (checkproc(selwin) >= 0) 12716280Sedward out = 1; 12814893Sedward break; 129*16309Sedward case ctrl(z): 13014893Sedward wwsuspend(); 13114893Sedward break; 13214893Sedward case 'q': 13314893Sedward c_quit(); 13414893Sedward break; 13514998Sedward /* debugging stuff */ 13614998Sedward case '&': 13714998Sedward if (debug) { 13814998Sedward c_debug(); 13914998Sedward break; 14014998Sedward } 14114893Sedward default: 14214893Sedward if (c == escapec) { 14314893Sedward if (checkproc(selwin) >= 0) { 14414893Sedward (void) write(selwin->ww_pty, 14514893Sedward &escapec, 1); 14616280Sedward out = 1; 14714893Sedward } 14814893Sedward } else { 14914893Sedward if (!terse) 150*16309Sedward wwputc(ctrl(g), cmdwin); 15114893Sedward error("Type ? for help."); 15214893Sedward } 15314177Sedward } 15414893Sedward } 15516280Sedward if (out || quit) 15613977Sedward break; 15714893Sedward if (terse) 15814893Sedward wwsetcursor(0, 0); 15914893Sedward else { 16016113Sedward wwputs("Command: ", cmdwin); 16114893Sedward wwcurtowin(cmdwin); 16213977Sedward } 16315871Sedward while (wwpeekc() < 0) 16415871Sedward wwiomux(); 16513977Sedward } 16616280Sedward if (!quit) 16716280Sedward setcmd(0); 16813977Sedward } 16913977Sedward 17013977Sedward struct ww * 17113977Sedward getwin() 17213977Sedward { 17313977Sedward register int c; 17414184Sedward struct ww *w = 0; 17513977Sedward 17614189Sedward if (!terse) 17716113Sedward wwputs("Which window? ", cmdwin); 17814987Sedward wwcurtowin(cmdwin); 17915871Sedward while ((c = wwgetc()) < 0) 18015871Sedward wwiomux(); 18114407Sedward if (debug && c == 'c') 18214407Sedward w = cmdwin; 18314407Sedward else if (debug && c == 'f') 18414407Sedward w = framewin; 18514795Sedward else if (debug && c == 'b') 18614795Sedward w = boxwin; 18714407Sedward else if (c >= '1' && c < NWINDOW + '1') 18814407Sedward w = window[c - '1']; 18914407Sedward if (w == 0) 190*16309Sedward wwputc(ctrl(g), cmdwin); 19114189Sedward if (!terse) 19216113Sedward wwputs("\r\n", cmdwin); 19313977Sedward return w; 19413977Sedward } 19513977Sedward 19614893Sedward checkproc(w) 19714893Sedward struct ww *w; 19814893Sedward { 19914893Sedward if (w->ww_state != WWS_HASPROC) { 20014893Sedward error("No process in window."); 20114893Sedward return -1; 20214893Sedward } 20314893Sedward return 0; 20414893Sedward } 20516280Sedward 20616280Sedward setcmd(new) 20716280Sedward char new; 20816280Sedward { 20916280Sedward if (new && !incmd) { 21016280Sedward if (!terse) 21116280Sedward wwadd(cmdwin, &wwhead); 21216280Sedward if (selwin != 0) 21316280Sedward wwcursor(selwin, 1); 21416280Sedward wwcurwin = 0; 21516280Sedward } else if (!new && incmd) { 21616280Sedward if (!terse) { 21716280Sedward wwdelete(cmdwin); 21816280Sedward reframe(); 21916280Sedward } 22016280Sedward if (selwin != 0) 22116280Sedward wwcursor(selwin, 0); 22216280Sedward wwcurwin = selwin; 22316280Sedward } 22416280Sedward incmd = new; 22516280Sedward } 22616280Sedward 22716280Sedward setterse(new) 22816280Sedward char new; 22916280Sedward { 23016280Sedward if (incmd) 23116280Sedward if (new && !terse) { 23216280Sedward wwdelete(cmdwin); 23316280Sedward reframe(); 23416280Sedward } else if (!new && terse) 23516280Sedward wwadd(cmdwin, &wwhead); 23616280Sedward terse = new; 23716280Sedward } 23816280Sedward 23916280Sedward /* 24016280Sedward * Set the current window. 24116280Sedward */ 24216280Sedward setselwin(w) 24316280Sedward struct ww *w; 24416280Sedward { 24516280Sedward if (selwin == w) 24616280Sedward return; 24716304Sedward if (selwin != 0) 24816304Sedward lastselwin = selwin; 24916304Sedward if ((selwin = w) != 0) 25016304Sedward front(selwin, 1); 25116280Sedward } 252