113977Sedward #ifndef lint 2*16280Sedward static char *sccsid = "@(#)cmd.c 3.23 84/04/05"; 313977Sedward #endif 413977Sedward 513977Sedward #include "defs.h" 613977Sedward 713977Sedward docmd() 813977Sedward { 913977Sedward register char c; 1013977Sedward register struct ww *w; 11*16280Sedward 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) 47*16280Sedward 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) 57*16280Sedward 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 'C': 6614893Sedward c_close((struct ww *)0); 6714893Sedward break; 6814893Sedward case 'w': 6914893Sedward c_window(); 7014893Sedward break; 7114893Sedward case 'm': 7214893Sedward if ((w = getwin()) != 0) 7314893Sedward c_move(w); 7414893Sedward break; 7514998Sedward case 'M': 7614998Sedward if ((w = getwin()) != 0) 7714998Sedward movewin(w, w->ww_altpos.r, 7814998Sedward w->ww_altpos.c); 7914998Sedward break; 8014893Sedward case 'S': 8114893Sedward c_show(); 8214893Sedward break; 8314893Sedward case 'L': 8414893Sedward c_list(); 8514893Sedward break; 8615673Sedward case 'v': 8715673Sedward c_variable(); 8815673Sedward break; 8914893Sedward case ':': 9014893Sedward c_colon(); 9114893Sedward break; 9214893Sedward case 'h': 9314893Sedward (void) wwwrite(selwin, "\b", 1); 9414893Sedward break; 9514893Sedward case 'j': 9614893Sedward (void) wwwrite(selwin, "\n", 1); 9714893Sedward break; 9814893Sedward case 'k': 9914893Sedward (void) wwwrite(selwin, "\033A", 2); 10014893Sedward break; 10114893Sedward case 'l': 10214893Sedward (void) wwwrite(selwin, "\033C", 2); 10314893Sedward break; 10414893Sedward case CTRL(e): 10514893Sedward wwscroll(selwin, 1); 10614893Sedward break; 10714893Sedward case CTRL(y): 10814893Sedward wwscroll(selwin, -1); 10914893Sedward break; 11014893Sedward case CTRL(d): 11114893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11214893Sedward break; 11314893Sedward case CTRL(u): 11414893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 11514893Sedward break; 11614893Sedward case CTRL(f): 11714893Sedward wwscroll(selwin, selwin->ww_w.nr); 11814893Sedward break; 11914893Sedward case CTRL(b): 12014893Sedward wwscroll(selwin, - selwin->ww_w.nr); 12114893Sedward break; 12214893Sedward case CTRL(s): 12314893Sedward (void) write(selwin->ww_pty, 12414893Sedward &wwwintty.ww_tchars.t_stopc, 1); 12514893Sedward break; 12614893Sedward case CTRL(q): 12714893Sedward (void) write(selwin->ww_pty, 12814893Sedward &wwwintty.ww_tchars.t_startc, 1); 12914893Sedward break; 13014893Sedward case CTRL(l): 13114893Sedward wwredraw(); 13214893Sedward break; 13314893Sedward case '?': 13414893Sedward c_help(); 13514893Sedward break; 13614893Sedward case CTRL([): 13714893Sedward if (checkproc(selwin) >= 0) 138*16280Sedward out = 1; 13914893Sedward break; 14014893Sedward case CTRL(z): 14114893Sedward wwsuspend(); 14214893Sedward break; 14314893Sedward case 'q': 14414893Sedward c_quit(); 14514893Sedward break; 14614893Sedward /* undocumented commands */ 14714893Sedward case 's': 14814893Sedward c_stat(); 14914893Sedward break; 15015363Sedward #ifndef O_4_1A 15114893Sedward case 't': 15214893Sedward c_time(RUSAGE_SELF); 15314893Sedward break; 15414893Sedward case 'T': 15514893Sedward c_time(RUSAGE_CHILDREN); 15614893Sedward break; 15715363Sedward #endif 15814998Sedward /* debugging stuff */ 15914998Sedward case '&': 16014998Sedward if (debug) { 16114998Sedward c_debug(); 16214998Sedward break; 16314998Sedward } 16414893Sedward default: 16514893Sedward if (c == escapec) { 16614893Sedward if (checkproc(selwin) >= 0) { 16714893Sedward (void) write(selwin->ww_pty, 16814893Sedward &escapec, 1); 169*16280Sedward out = 1; 17014893Sedward } 17114893Sedward } else { 17214893Sedward if (!terse) 17316113Sedward wwputc(CTRL(g), cmdwin); 17414893Sedward error("Type ? for help."); 17514893Sedward } 17614177Sedward } 17714893Sedward } 178*16280Sedward if (out || quit) 17913977Sedward break; 18014893Sedward if (terse) 18114893Sedward wwsetcursor(0, 0); 18214893Sedward else { 18316113Sedward wwputs("Command: ", cmdwin); 18414893Sedward wwcurtowin(cmdwin); 18513977Sedward } 18615871Sedward while (wwpeekc() < 0) 18715871Sedward wwiomux(); 18813977Sedward } 189*16280Sedward if (!quit) 190*16280Sedward setcmd(0); 19113977Sedward } 19213977Sedward 19313977Sedward struct ww * 19413977Sedward getwin() 19513977Sedward { 19613977Sedward register int c; 19714184Sedward struct ww *w = 0; 19813977Sedward 19914189Sedward if (!terse) 20016113Sedward wwputs("Which window? ", cmdwin); 20114987Sedward wwcurtowin(cmdwin); 20215871Sedward while ((c = wwgetc()) < 0) 20315871Sedward wwiomux(); 20414407Sedward if (debug && c == 'c') 20514407Sedward w = cmdwin; 20614407Sedward else if (debug && c == 'f') 20714407Sedward w = framewin; 20814795Sedward else if (debug && c == 'b') 20914795Sedward w = boxwin; 21014407Sedward else if (c >= '1' && c < NWINDOW + '1') 21114407Sedward w = window[c - '1']; 21214407Sedward if (w == 0) 21316113Sedward wwputc(CTRL(g), cmdwin); 21414189Sedward if (!terse) 21516113Sedward wwputs("\r\n", cmdwin); 21613977Sedward return w; 21713977Sedward } 21813977Sedward 21914893Sedward checkproc(w) 22014893Sedward struct ww *w; 22114893Sedward { 22214893Sedward if (w->ww_state != WWS_HASPROC) { 22314893Sedward error("No process in window."); 22414893Sedward return -1; 22514893Sedward } 22614893Sedward return 0; 22714893Sedward } 228*16280Sedward 229*16280Sedward setcmd(new) 230*16280Sedward char new; 231*16280Sedward { 232*16280Sedward if (new && !incmd) { 233*16280Sedward if (!terse) 234*16280Sedward wwadd(cmdwin, &wwhead); 235*16280Sedward if (selwin != 0) 236*16280Sedward wwcursor(selwin, 1); 237*16280Sedward wwcurwin = 0; 238*16280Sedward } else if (!new && incmd) { 239*16280Sedward if (!terse) { 240*16280Sedward wwdelete(cmdwin); 241*16280Sedward reframe(); 242*16280Sedward } 243*16280Sedward if (selwin != 0) 244*16280Sedward wwcursor(selwin, 0); 245*16280Sedward wwcurwin = selwin; 246*16280Sedward } 247*16280Sedward incmd = new; 248*16280Sedward } 249*16280Sedward 250*16280Sedward setterse(new) 251*16280Sedward char new; 252*16280Sedward { 253*16280Sedward if (incmd) 254*16280Sedward if (new && !terse) { 255*16280Sedward wwdelete(cmdwin); 256*16280Sedward reframe(); 257*16280Sedward } else if (!new && terse) 258*16280Sedward wwadd(cmdwin, &wwhead); 259*16280Sedward terse = new; 260*16280Sedward } 261*16280Sedward 262*16280Sedward /* 263*16280Sedward * Set the current window. 264*16280Sedward */ 265*16280Sedward setselwin(w) 266*16280Sedward struct ww *w; 267*16280Sedward { 268*16280Sedward if (selwin == w) 269*16280Sedward return; 270*16280Sedward lastselwin = selwin; 271*16280Sedward front(selwin = w, 1); 272*16280Sedward } 273