118729Sedward /* 2*33514Sbostic * Copyright (c) 1983 Regents of the University of California. 3*33514Sbostic * All rights reserved. 4*33514Sbostic * 5*33514Sbostic * Redistribution and use in source and binary forms are permitted 6*33514Sbostic * provided that this notice is preserved and that due credit is given 7*33514Sbostic * to the University of California at Berkeley. The name of the University 8*33514Sbostic * may not be used to endorse or promote products derived from this 9*33514Sbostic * software without specific prior written permission. This software 10*33514Sbostic * is provided ``as is'' without express or implied warranty. 1118729Sedward */ 1218729Sedward 13*33514Sbostic #ifndef lint 14*33514Sbostic static char sccsid[] = "@(#)cmd.c 3.36 (Berkeley) 02/21/88"; 15*33514Sbostic #endif /* not lint */ 16*33514Sbostic 1713977Sedward #include "defs.h" 1816309Sedward #include "char.h" 1913977Sedward 2013977Sedward docmd() 2113977Sedward { 2213977Sedward register char c; 2313977Sedward register struct ww *w; 2416280Sedward char out = 0; 2513977Sedward 2614893Sedward for (;;) { 2715871Sedward while ((c = wwgetc()) >= 0) { 2814893Sedward if (!terse) 2916312Sedward wwputc('\n', cmdwin); 3014893Sedward switch (c) { 3114893Sedward default: 3231140Sedward if (c != escapec) 3331140Sedward break; 3414893Sedward case 'h': case 'j': case 'k': case 'l': 3533248Sbostic case ctrl('y'): 3633248Sbostic case ctrl('e'): 3733248Sbostic case ctrl('u'): 3833248Sbostic case ctrl('d'): 3933248Sbostic case ctrl('b'): 4033248Sbostic case ctrl('f'): 4133248Sbostic case ctrl('s'): 4233248Sbostic case ctrl('q'): 4333248Sbostic case ctrl('['): 4414893Sedward if (selwin == 0) { 4514893Sedward error("No window."); 4614893Sedward continue; 4714893Sedward } 4813977Sedward } 4914893Sedward switch (c) { 5014893Sedward case '1': case '2': case '3': case '4': case '5': 5114893Sedward case '6': case '7': case '8': case '9': 5214893Sedward if ((w = window[c - '1']) == 0) { 5315620Sedward error("%c: No such window.", c); 5414893Sedward break; 5514893Sedward } 5614184Sedward setselwin(w); 5714893Sedward if (checkproc(selwin) >= 0) 5816280Sedward out = 1; 5914893Sedward break; 6014893Sedward case '%': 6114893Sedward if ((w = getwin()) != 0) 6214893Sedward setselwin(w); 6314893Sedward break; 6433248Sbostic case ctrl('^'): 6515620Sedward if (lastselwin != 0) { 6615620Sedward setselwin(lastselwin); 6715620Sedward if (checkproc(selwin) >= 0) 6816280Sedward out = 1; 6915620Sedward } else 7015620Sedward error("No previous window."); 7115620Sedward break; 7214893Sedward case 'c': 7314893Sedward if ((w = getwin()) != 0) 7431140Sedward closewin(w); 7514893Sedward break; 7614893Sedward case 'w': 7714893Sedward c_window(); 7814893Sedward break; 7914893Sedward case 'm': 8014893Sedward if ((w = getwin()) != 0) 8114893Sedward c_move(w); 8214893Sedward break; 8314998Sedward case 'M': 8414998Sedward if ((w = getwin()) != 0) 8518204Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 8614998Sedward break; 8718204Sedward case 's': 8818204Sedward if ((w = getwin()) != 0) 8918204Sedward c_size(w); 9018204Sedward break; 9118204Sedward case 'S': 9218204Sedward if ((w = getwin()) != 0) 9318204Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 9418204Sedward break; 9514893Sedward case ':': 9614893Sedward c_colon(); 9714893Sedward break; 9814893Sedward case 'h': 9914893Sedward (void) wwwrite(selwin, "\b", 1); 10014893Sedward break; 10114893Sedward case 'j': 10214893Sedward (void) wwwrite(selwin, "\n", 1); 10314893Sedward break; 10414893Sedward case 'k': 10514893Sedward (void) wwwrite(selwin, "\033A", 2); 10614893Sedward break; 10714893Sedward case 'l': 10814893Sedward (void) wwwrite(selwin, "\033C", 2); 10914893Sedward break; 11033248Sbostic case ctrl('e'): 11114893Sedward wwscroll(selwin, 1); 11214893Sedward break; 11333248Sbostic case ctrl('y'): 11414893Sedward wwscroll(selwin, -1); 11514893Sedward break; 11633248Sbostic case ctrl('d'): 11714893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11814893Sedward break; 11933248Sbostic case ctrl('u'): 12014893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 12114893Sedward break; 12233248Sbostic case ctrl('f'): 12314893Sedward wwscroll(selwin, selwin->ww_w.nr); 12414893Sedward break; 12533248Sbostic case ctrl('b'): 12614893Sedward wwscroll(selwin, - selwin->ww_w.nr); 12714893Sedward break; 12833248Sbostic case ctrl('s'): 12918335Sedward stopwin(selwin); 13014893Sedward break; 13133248Sbostic case ctrl('q'): 13218335Sedward startwin(selwin); 13314893Sedward break; 13433248Sbostic case ctrl('l'): 13514893Sedward wwredraw(); 13614893Sedward break; 13714893Sedward case '?': 13814893Sedward c_help(); 13914893Sedward break; 14033248Sbostic case ctrl('['): 14114893Sedward if (checkproc(selwin) >= 0) 14216280Sedward out = 1; 14314893Sedward break; 14433248Sbostic case ctrl('z'): 14514893Sedward wwsuspend(); 14614893Sedward break; 14714893Sedward case 'q': 14814893Sedward c_quit(); 14914893Sedward break; 15014998Sedward /* debugging stuff */ 15114998Sedward case '&': 15214998Sedward if (debug) { 15314998Sedward c_debug(); 15414998Sedward break; 15514998Sedward } 15614893Sedward default: 15714893Sedward if (c == escapec) { 15814893Sedward if (checkproc(selwin) >= 0) { 15914893Sedward (void) write(selwin->ww_pty, 16014893Sedward &escapec, 1); 16116280Sedward out = 1; 16214893Sedward } 16314893Sedward } else { 16414893Sedward if (!terse) 16516313Sedward wwbell(); 16614893Sedward error("Type ? for help."); 16714893Sedward } 16814177Sedward } 16914893Sedward } 17016280Sedward if (out || quit) 17113977Sedward break; 17214893Sedward if (terse) 17314893Sedward wwsetcursor(0, 0); 17414893Sedward else { 17516113Sedward wwputs("Command: ", cmdwin); 17614893Sedward wwcurtowin(cmdwin); 17713977Sedward } 17815871Sedward while (wwpeekc() < 0) 17915871Sedward wwiomux(); 18013977Sedward } 18116280Sedward if (!quit) 18216280Sedward setcmd(0); 18313977Sedward } 18413977Sedward 18513977Sedward struct ww * 18613977Sedward getwin() 18713977Sedward { 18813977Sedward register int c; 18914184Sedward struct ww *w = 0; 19013977Sedward 19114189Sedward if (!terse) 19216113Sedward wwputs("Which window? ", cmdwin); 19314987Sedward wwcurtowin(cmdwin); 19415871Sedward while ((c = wwgetc()) < 0) 19515871Sedward wwiomux(); 19614407Sedward if (debug && c == 'c') 19714407Sedward w = cmdwin; 19814407Sedward else if (debug && c == 'f') 19914407Sedward w = framewin; 20014795Sedward else if (debug && c == 'b') 20114795Sedward w = boxwin; 20214407Sedward else if (c >= '1' && c < NWINDOW + '1') 20314407Sedward w = window[c - '1']; 20431140Sedward else if (c == '+') 20531140Sedward w = selwin; 20631140Sedward else if (c == '-') 20731140Sedward w = lastselwin; 20814407Sedward if (w == 0) 20916313Sedward wwbell(); 21014189Sedward if (!terse) 21116312Sedward wwputc('\n', cmdwin); 21213977Sedward return w; 21313977Sedward } 21413977Sedward 21514893Sedward checkproc(w) 21614893Sedward struct ww *w; 21714893Sedward { 21814893Sedward if (w->ww_state != WWS_HASPROC) { 21914893Sedward error("No process in window."); 22014893Sedward return -1; 22114893Sedward } 22214893Sedward return 0; 22314893Sedward } 22416280Sedward 22516280Sedward setcmd(new) 22616280Sedward char new; 22716280Sedward { 22816280Sedward if (new && !incmd) { 22916280Sedward if (!terse) 23016280Sedward wwadd(cmdwin, &wwhead); 23116280Sedward if (selwin != 0) 23216280Sedward wwcursor(selwin, 1); 23316280Sedward wwcurwin = 0; 23416280Sedward } else if (!new && incmd) { 23516280Sedward if (!terse) { 23616280Sedward wwdelete(cmdwin); 23716280Sedward reframe(); 23816280Sedward } 23916280Sedward if (selwin != 0) 24016280Sedward wwcursor(selwin, 0); 24116280Sedward wwcurwin = selwin; 24216280Sedward } 24316280Sedward incmd = new; 24416280Sedward } 24516280Sedward 24616280Sedward setterse(new) 24716280Sedward char new; 24816280Sedward { 24916280Sedward if (incmd) 25016280Sedward if (new && !terse) { 25116280Sedward wwdelete(cmdwin); 25216280Sedward reframe(); 25316280Sedward } else if (!new && terse) 25416280Sedward wwadd(cmdwin, &wwhead); 25516280Sedward terse = new; 25616280Sedward } 25716280Sedward 25816280Sedward /* 25916280Sedward * Set the current window. 26016280Sedward */ 26116280Sedward setselwin(w) 26216280Sedward struct ww *w; 26316280Sedward { 26416280Sedward if (selwin == w) 26516280Sedward return; 26616304Sedward if (selwin != 0) 26716304Sedward lastselwin = selwin; 26816304Sedward if ((selwin = w) != 0) 26916304Sedward front(selwin, 1); 27016280Sedward } 271