118729Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42954Sbostic * This code is derived from software contributed to Berkeley by 6*42954Sbostic * Edward Wang at The University of California, Berkeley. 7*42954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918729Sedward */ 1018729Sedward 1133514Sbostic #ifndef lint 12*42954Sbostic static char sccsid[] = "@(#)cmd.c 3.40 (Berkeley) 06/06/90"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1513977Sedward #include "defs.h" 1616309Sedward #include "char.h" 1713977Sedward 1813977Sedward docmd() 1913977Sedward { 2013977Sedward register char c; 2113977Sedward register struct ww *w; 2216280Sedward char out = 0; 2313977Sedward 2434107Sedward while (!out && !quit) { 2534107Sedward if ((c = wwgetc()) < 0) { 2634107Sedward if (terse) 2734107Sedward wwsetcursor(0, 0); 2834107Sedward else { 2934107Sedward wwputs("Command: ", cmdwin); 3034107Sedward wwcurtowin(cmdwin); 3113977Sedward } 3234107Sedward do 3334107Sedward wwiomux(); 3434107Sedward while ((c = wwgetc()) < 0); 3534107Sedward } 3634107Sedward if (!terse) 3734107Sedward wwputc('\n', cmdwin); 3834107Sedward switch (c) { 3934107Sedward default: 4034107Sedward if (c != escapec) 4114893Sedward break; 4234107Sedward case 'h': case 'j': case 'k': case 'l': 4334107Sedward case ctrl('y'): 4434107Sedward case ctrl('e'): 4534107Sedward case ctrl('u'): 4634107Sedward case ctrl('d'): 4734107Sedward case ctrl('b'): 4834107Sedward case ctrl('f'): 4934107Sedward case ctrl('s'): 5034107Sedward case ctrl('q'): 5134107Sedward case ctrl('['): 5234107Sedward if (selwin == 0) { 5334107Sedward error("No window."); 5434107Sedward continue; 5534107Sedward } 5634107Sedward } 5734107Sedward switch (c) { 5834107Sedward case '1': case '2': case '3': case '4': case '5': 5934107Sedward case '6': case '7': case '8': case '9': 6034107Sedward if ((w = window[c - '1']) == 0) { 6134107Sedward error("%c: No such window.", c); 6214893Sedward break; 6334107Sedward } 6434107Sedward setselwin(w); 6534107Sedward if (checkproc(selwin) >= 0) 6634107Sedward out = 1; 6734107Sedward break; 6834107Sedward case '%': 6934107Sedward if ((w = getwin()) != 0) 7034107Sedward setselwin(w); 7134107Sedward break; 7234107Sedward case ctrl('^'): 7334107Sedward if (lastselwin != 0) { 7434107Sedward setselwin(lastselwin); 7514893Sedward if (checkproc(selwin) >= 0) 7616280Sedward out = 1; 7734107Sedward } else 7834107Sedward error("No previous window."); 7934107Sedward break; 8034107Sedward case 'c': 8134107Sedward if ((w = getwin()) != 0) 8234107Sedward closewin(w); 8334107Sedward break; 8434107Sedward case 'w': 8534107Sedward c_window(); 8634107Sedward break; 8734107Sedward case 'm': 8834107Sedward if ((w = getwin()) != 0) 8934107Sedward c_move(w); 9034107Sedward break; 9134107Sedward case 'M': 9234107Sedward if ((w = getwin()) != 0) 9334107Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 9434107Sedward break; 9534107Sedward case 's': 9634107Sedward if ((w = getwin()) != 0) 9734107Sedward c_size(w); 9834107Sedward break; 9934107Sedward case 'S': 10034107Sedward if ((w = getwin()) != 0) 10134107Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 10234107Sedward break; 10334107Sedward case ':': 10434107Sedward c_colon(); 10534107Sedward break; 10634107Sedward case 'h': 10734107Sedward (void) wwwrite(selwin, "\b", 1); 10834107Sedward break; 10934107Sedward case 'j': 11034107Sedward (void) wwwrite(selwin, "\n", 1); 11134107Sedward break; 11234107Sedward case 'k': 11334107Sedward (void) wwwrite(selwin, "\033A", 2); 11434107Sedward break; 11534107Sedward case 'l': 11634107Sedward (void) wwwrite(selwin, "\033C", 2); 11734107Sedward break; 11834107Sedward case ctrl('e'): 11934107Sedward wwscroll(selwin, 1); 12034107Sedward break; 12134107Sedward case ctrl('y'): 12234107Sedward wwscroll(selwin, -1); 12334107Sedward break; 12434107Sedward case ctrl('d'): 12534107Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 12634107Sedward break; 12734107Sedward case ctrl('u'): 12834107Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 12934107Sedward break; 13034107Sedward case ctrl('f'): 13134107Sedward wwscroll(selwin, selwin->ww_w.nr); 13234107Sedward break; 13334107Sedward case ctrl('b'): 13434107Sedward wwscroll(selwin, - selwin->ww_w.nr); 13534107Sedward break; 13634107Sedward case ctrl('s'): 13734107Sedward stopwin(selwin); 13834107Sedward break; 13934107Sedward case ctrl('q'): 14034107Sedward startwin(selwin); 14134107Sedward break; 14234107Sedward case ctrl('l'): 14334107Sedward wwredraw(); 14434107Sedward break; 14534107Sedward case '?': 14634107Sedward c_help(); 14734107Sedward break; 14834107Sedward case ctrl('['): 14934107Sedward if (checkproc(selwin) >= 0) 15034107Sedward out = 1; 15134107Sedward break; 15234107Sedward case ctrl('z'): 15334107Sedward wwsuspend(); 15434107Sedward break; 15534107Sedward case 'q': 15634107Sedward c_quit(); 15734107Sedward break; 15834107Sedward /* debugging stuff */ 15934107Sedward case '&': 16034107Sedward if (debug) { 16134107Sedward c_debug(); 16214893Sedward break; 16334107Sedward } 16434107Sedward default: 16534107Sedward if (c == escapec) { 16634107Sedward if (checkproc(selwin) >= 0) { 16734107Sedward (void) write(selwin->ww_pty, 16834107Sedward &escapec, 1); 16934107Sedward out = 1; 17014998Sedward } 17134107Sedward } else { 17234107Sedward if (!terse) 17334107Sedward wwbell(); 17434107Sedward error("Type ? for help."); 17514177Sedward } 17614893Sedward } 17713977Sedward } 17816280Sedward if (!quit) 17916280Sedward setcmd(0); 18013977Sedward } 18113977Sedward 18213977Sedward struct ww * 18313977Sedward getwin() 18413977Sedward { 18513977Sedward register int c; 18614184Sedward struct ww *w = 0; 18713977Sedward 18814189Sedward if (!terse) 18916113Sedward wwputs("Which window? ", cmdwin); 19014987Sedward wwcurtowin(cmdwin); 19115871Sedward while ((c = wwgetc()) < 0) 19215871Sedward wwiomux(); 19314407Sedward if (debug && c == 'c') 19414407Sedward w = cmdwin; 19514407Sedward else if (debug && c == 'f') 19614407Sedward w = framewin; 19714795Sedward else if (debug && c == 'b') 19814795Sedward w = boxwin; 19914407Sedward else if (c >= '1' && c < NWINDOW + '1') 20014407Sedward w = window[c - '1']; 20131140Sedward else if (c == '+') 20231140Sedward w = selwin; 20331140Sedward else if (c == '-') 20431140Sedward w = lastselwin; 20514407Sedward if (w == 0) 20616313Sedward wwbell(); 20714189Sedward if (!terse) 20816312Sedward wwputc('\n', cmdwin); 20913977Sedward return w; 21013977Sedward } 21113977Sedward 21214893Sedward checkproc(w) 21314893Sedward struct ww *w; 21414893Sedward { 21514893Sedward if (w->ww_state != WWS_HASPROC) { 21614893Sedward error("No process in window."); 21714893Sedward return -1; 21814893Sedward } 21914893Sedward return 0; 22014893Sedward } 22116280Sedward 22216280Sedward setcmd(new) 22316280Sedward char new; 22416280Sedward { 22516280Sedward if (new && !incmd) { 22616280Sedward if (!terse) 22716280Sedward wwadd(cmdwin, &wwhead); 22816280Sedward if (selwin != 0) 22916280Sedward wwcursor(selwin, 1); 23016280Sedward wwcurwin = 0; 23116280Sedward } else if (!new && incmd) { 23216280Sedward if (!terse) { 23316280Sedward wwdelete(cmdwin); 23416280Sedward reframe(); 23516280Sedward } 23616280Sedward if (selwin != 0) 23716280Sedward wwcursor(selwin, 0); 23816280Sedward wwcurwin = selwin; 23916280Sedward } 24016280Sedward incmd = new; 24116280Sedward } 24216280Sedward 24316280Sedward setterse(new) 24416280Sedward char new; 24516280Sedward { 24616280Sedward if (incmd) 24716280Sedward if (new && !terse) { 24816280Sedward wwdelete(cmdwin); 24916280Sedward reframe(); 25016280Sedward } else if (!new && terse) 25116280Sedward wwadd(cmdwin, &wwhead); 25216280Sedward terse = new; 25316280Sedward } 25416280Sedward 25516280Sedward /* 25616280Sedward * Set the current window. 25716280Sedward */ 25816280Sedward setselwin(w) 25916280Sedward struct ww *w; 26016280Sedward { 26116280Sedward if (selwin == w) 26216280Sedward return; 26316304Sedward if (selwin != 0) 26416304Sedward lastselwin = selwin; 26516304Sedward if ((selwin = w) != 0) 26616304Sedward front(selwin, 1); 26716280Sedward } 268