113977Sedward #ifndef lint 2*16304Sedward static char *sccsid = "@(#)cmd.c 3.26 84/04/07"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward docmd() 813977Sedward { 913977Sedward register char c; 1013977Sedward register struct ww *w; 1116280Sedward char out = 0; 1213977Sedward 1314893Sedward for (;;) { 1415871Sedward while ((c = wwgetc()) >= 0) { 1514893Sedward if (!terse) 1616113Sedward wwputs("\r\n", cmdwin); 1714893Sedward switch (c) { 1814893Sedward default: 1914893Sedward if (c == escapec) 2014893Sedward goto foo; 2113977Sedward break; 2214893Sedward case 'h': case 'j': case 'k': case 'l': 2314893Sedward case CTRL(y): 2414893Sedward case CTRL(e): 2514893Sedward case CTRL(u): 2614893Sedward case CTRL(d): 2714893Sedward case CTRL(b): 2814893Sedward case CTRL(f): 2914893Sedward case CTRL(s): 3014893Sedward case CTRL(q): 3114893Sedward case CTRL([): 3214893Sedward foo: 3314893Sedward if (selwin == 0) { 3414893Sedward error("No window."); 3514893Sedward continue; 3614893Sedward } 3713977Sedward } 3814893Sedward switch (c) { 3914893Sedward case '1': case '2': case '3': case '4': case '5': 4014893Sedward case '6': case '7': case '8': case '9': 4114893Sedward if ((w = window[c - '1']) == 0) { 4215620Sedward error("%c: No such window.", c); 4314893Sedward break; 4414893Sedward } 4514184Sedward setselwin(w); 4614893Sedward if (checkproc(selwin) >= 0) 4716280Sedward out = 1; 4814893Sedward break; 4914893Sedward case '%': 5014893Sedward if ((w = getwin()) != 0) 5114893Sedward setselwin(w); 5214893Sedward break; 5315620Sedward case CTRL(^): 5415620Sedward if (lastselwin != 0) { 5515620Sedward setselwin(lastselwin); 5615620Sedward if (checkproc(selwin) >= 0) 5716280Sedward out = 1; 5815620Sedward } else 5915620Sedward error("No previous window."); 6015620Sedward break; 6114893Sedward case 'c': 6214893Sedward if ((w = getwin()) != 0) 6314893Sedward c_close(w); 6414893Sedward break; 6514893Sedward case 'w': 6614893Sedward c_window(); 6714893Sedward break; 6814893Sedward case 'm': 6914893Sedward if ((w = getwin()) != 0) 7014893Sedward c_move(w); 7114893Sedward break; 7214998Sedward case 'M': 7314998Sedward if ((w = getwin()) != 0) 7414998Sedward movewin(w, w->ww_altpos.r, 7514998Sedward w->ww_altpos.c); 7614998Sedward break; 7714893Sedward case ':': 7814893Sedward c_colon(); 7914893Sedward break; 8014893Sedward case 'h': 8114893Sedward (void) wwwrite(selwin, "\b", 1); 8214893Sedward break; 8314893Sedward case 'j': 8414893Sedward (void) wwwrite(selwin, "\n", 1); 8514893Sedward break; 8614893Sedward case 'k': 8714893Sedward (void) wwwrite(selwin, "\033A", 2); 8814893Sedward break; 8914893Sedward case 'l': 9014893Sedward (void) wwwrite(selwin, "\033C", 2); 9114893Sedward break; 9214893Sedward case CTRL(e): 9314893Sedward wwscroll(selwin, 1); 9414893Sedward break; 9514893Sedward case CTRL(y): 9614893Sedward wwscroll(selwin, -1); 9714893Sedward break; 9814893Sedward case CTRL(d): 9914893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 10014893Sedward break; 10114893Sedward case CTRL(u): 10214893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 10314893Sedward break; 10414893Sedward case CTRL(f): 10514893Sedward wwscroll(selwin, selwin->ww_w.nr); 10614893Sedward break; 10714893Sedward case CTRL(b): 10814893Sedward wwscroll(selwin, - selwin->ww_w.nr); 10914893Sedward break; 11014893Sedward case CTRL(s): 11114893Sedward (void) write(selwin->ww_pty, 11214893Sedward &wwwintty.ww_tchars.t_stopc, 1); 11314893Sedward break; 11414893Sedward case CTRL(q): 11514893Sedward (void) write(selwin->ww_pty, 11614893Sedward &wwwintty.ww_tchars.t_startc, 1); 11714893Sedward break; 11814893Sedward case CTRL(l): 11914893Sedward wwredraw(); 12014893Sedward break; 12114893Sedward case '?': 12214893Sedward c_help(); 12314893Sedward break; 12414893Sedward case CTRL([): 12514893Sedward if (checkproc(selwin) >= 0) 12616280Sedward out = 1; 12714893Sedward break; 12814893Sedward case CTRL(z): 12914893Sedward wwsuspend(); 13014893Sedward break; 13114893Sedward case 'q': 13214893Sedward c_quit(); 13314893Sedward break; 13414998Sedward /* debugging stuff */ 13514998Sedward case '&': 13614998Sedward if (debug) { 13714998Sedward c_debug(); 13814998Sedward break; 13914998Sedward } 14014893Sedward default: 14114893Sedward if (c == escapec) { 14214893Sedward if (checkproc(selwin) >= 0) { 14314893Sedward (void) write(selwin->ww_pty, 14414893Sedward &escapec, 1); 14516280Sedward out = 1; 14614893Sedward } 14714893Sedward } else { 14814893Sedward if (!terse) 14916113Sedward wwputc(CTRL(g), cmdwin); 15014893Sedward error("Type ? for help."); 15114893Sedward } 15214177Sedward } 15314893Sedward } 15416280Sedward if (out || quit) 15513977Sedward break; 15614893Sedward if (terse) 15714893Sedward wwsetcursor(0, 0); 15814893Sedward else { 15916113Sedward wwputs("Command: ", cmdwin); 16014893Sedward wwcurtowin(cmdwin); 16113977Sedward } 16215871Sedward while (wwpeekc() < 0) 16315871Sedward wwiomux(); 16413977Sedward } 16516280Sedward if (!quit) 16616280Sedward setcmd(0); 16713977Sedward } 16813977Sedward 16913977Sedward struct ww * 17013977Sedward getwin() 17113977Sedward { 17213977Sedward register int c; 17314184Sedward struct ww *w = 0; 17413977Sedward 17514189Sedward if (!terse) 17616113Sedward wwputs("Which window? ", cmdwin); 17714987Sedward wwcurtowin(cmdwin); 17815871Sedward while ((c = wwgetc()) < 0) 17915871Sedward wwiomux(); 18014407Sedward if (debug && c == 'c') 18114407Sedward w = cmdwin; 18214407Sedward else if (debug && c == 'f') 18314407Sedward w = framewin; 18414795Sedward else if (debug && c == 'b') 18514795Sedward w = boxwin; 18614407Sedward else if (c >= '1' && c < NWINDOW + '1') 18714407Sedward w = window[c - '1']; 18814407Sedward if (w == 0) 18916113Sedward wwputc(CTRL(g), cmdwin); 19014189Sedward if (!terse) 19116113Sedward wwputs("\r\n", cmdwin); 19213977Sedward return w; 19313977Sedward } 19413977Sedward 19514893Sedward checkproc(w) 19614893Sedward struct ww *w; 19714893Sedward { 19814893Sedward if (w->ww_state != WWS_HASPROC) { 19914893Sedward error("No process in window."); 20014893Sedward return -1; 20114893Sedward } 20214893Sedward return 0; 20314893Sedward } 20416280Sedward 20516280Sedward setcmd(new) 20616280Sedward char new; 20716280Sedward { 20816280Sedward if (new && !incmd) { 20916280Sedward if (!terse) 21016280Sedward wwadd(cmdwin, &wwhead); 21116280Sedward if (selwin != 0) 21216280Sedward wwcursor(selwin, 1); 21316280Sedward wwcurwin = 0; 21416280Sedward } else if (!new && incmd) { 21516280Sedward if (!terse) { 21616280Sedward wwdelete(cmdwin); 21716280Sedward reframe(); 21816280Sedward } 21916280Sedward if (selwin != 0) 22016280Sedward wwcursor(selwin, 0); 22116280Sedward wwcurwin = selwin; 22216280Sedward } 22316280Sedward incmd = new; 22416280Sedward } 22516280Sedward 22616280Sedward setterse(new) 22716280Sedward char new; 22816280Sedward { 22916280Sedward if (incmd) 23016280Sedward if (new && !terse) { 23116280Sedward wwdelete(cmdwin); 23216280Sedward reframe(); 23316280Sedward } else if (!new && terse) 23416280Sedward wwadd(cmdwin, &wwhead); 23516280Sedward terse = new; 23616280Sedward } 23716280Sedward 23816280Sedward /* 23916280Sedward * Set the current window. 24016280Sedward */ 24116280Sedward setselwin(w) 24216280Sedward struct ww *w; 24316280Sedward { 24416280Sedward if (selwin == w) 24516280Sedward return; 246*16304Sedward if (selwin != 0) 247*16304Sedward lastselwin = selwin; 248*16304Sedward if ((selwin = w) != 0) 249*16304Sedward front(selwin, 1); 25016280Sedward } 251