118729Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 542954Sbostic * This code is derived from software contributed to Berkeley by 642954Sbostic * Edward Wang at The University of California, Berkeley. 742954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918729Sedward */ 1018729Sedward 1133514Sbostic #ifndef lint 12*55911Sedward static char sccsid[] = "@(#)cmd.c 3.41 (Berkeley) 08/16/92"; 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': 43*55911Sedward case 'y': case 'p': 4434107Sedward case ctrl('y'): 4534107Sedward case ctrl('e'): 4634107Sedward case ctrl('u'): 4734107Sedward case ctrl('d'): 4834107Sedward case ctrl('b'): 4934107Sedward case ctrl('f'): 5034107Sedward case ctrl('s'): 5134107Sedward case ctrl('q'): 5234107Sedward case ctrl('['): 5334107Sedward if (selwin == 0) { 5434107Sedward error("No window."); 5534107Sedward continue; 5634107Sedward } 5734107Sedward } 5834107Sedward switch (c) { 5934107Sedward case '1': case '2': case '3': case '4': case '5': 6034107Sedward case '6': case '7': case '8': case '9': 6134107Sedward if ((w = window[c - '1']) == 0) { 6234107Sedward error("%c: No such window.", c); 6314893Sedward break; 6434107Sedward } 6534107Sedward setselwin(w); 6634107Sedward if (checkproc(selwin) >= 0) 6734107Sedward out = 1; 6834107Sedward break; 6934107Sedward case '%': 7034107Sedward if ((w = getwin()) != 0) 7134107Sedward setselwin(w); 7234107Sedward break; 7334107Sedward case ctrl('^'): 7434107Sedward if (lastselwin != 0) { 7534107Sedward setselwin(lastselwin); 7614893Sedward if (checkproc(selwin) >= 0) 7716280Sedward out = 1; 7834107Sedward } else 7934107Sedward error("No previous window."); 8034107Sedward break; 8134107Sedward case 'c': 8234107Sedward if ((w = getwin()) != 0) 8334107Sedward closewin(w); 8434107Sedward break; 8534107Sedward case 'w': 8634107Sedward c_window(); 8734107Sedward break; 8834107Sedward case 'm': 8934107Sedward if ((w = getwin()) != 0) 9034107Sedward c_move(w); 9134107Sedward break; 9234107Sedward case 'M': 9334107Sedward if ((w = getwin()) != 0) 9434107Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 9534107Sedward break; 9634107Sedward case 's': 9734107Sedward if ((w = getwin()) != 0) 9834107Sedward c_size(w); 9934107Sedward break; 10034107Sedward case 'S': 10134107Sedward if ((w = getwin()) != 0) 10234107Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 10334107Sedward break; 104*55911Sedward case 'y': 105*55911Sedward c_yank(); 106*55911Sedward break; 107*55911Sedward case 'p': 108*55911Sedward c_put(); 109*55911Sedward break; 11034107Sedward case ':': 11134107Sedward c_colon(); 11234107Sedward break; 11334107Sedward case 'h': 11434107Sedward (void) wwwrite(selwin, "\b", 1); 11534107Sedward break; 11634107Sedward case 'j': 11734107Sedward (void) wwwrite(selwin, "\n", 1); 11834107Sedward break; 11934107Sedward case 'k': 12034107Sedward (void) wwwrite(selwin, "\033A", 2); 12134107Sedward break; 12234107Sedward case 'l': 12334107Sedward (void) wwwrite(selwin, "\033C", 2); 12434107Sedward break; 12534107Sedward case ctrl('e'): 12634107Sedward wwscroll(selwin, 1); 12734107Sedward break; 12834107Sedward case ctrl('y'): 12934107Sedward wwscroll(selwin, -1); 13034107Sedward break; 13134107Sedward case ctrl('d'): 13234107Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 13334107Sedward break; 13434107Sedward case ctrl('u'): 13534107Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 13634107Sedward break; 13734107Sedward case ctrl('f'): 13834107Sedward wwscroll(selwin, selwin->ww_w.nr); 13934107Sedward break; 14034107Sedward case ctrl('b'): 14134107Sedward wwscroll(selwin, - selwin->ww_w.nr); 14234107Sedward break; 14334107Sedward case ctrl('s'): 14434107Sedward stopwin(selwin); 14534107Sedward break; 14634107Sedward case ctrl('q'): 14734107Sedward startwin(selwin); 14834107Sedward break; 14934107Sedward case ctrl('l'): 15034107Sedward wwredraw(); 15134107Sedward break; 15234107Sedward case '?': 15334107Sedward c_help(); 15434107Sedward break; 15534107Sedward case ctrl('['): 15634107Sedward if (checkproc(selwin) >= 0) 15734107Sedward out = 1; 15834107Sedward break; 15934107Sedward case ctrl('z'): 16034107Sedward wwsuspend(); 16134107Sedward break; 16234107Sedward case 'q': 16334107Sedward c_quit(); 16434107Sedward break; 16534107Sedward /* debugging stuff */ 16634107Sedward case '&': 16734107Sedward if (debug) { 16834107Sedward c_debug(); 16914893Sedward break; 17034107Sedward } 17134107Sedward default: 17234107Sedward if (c == escapec) { 17334107Sedward if (checkproc(selwin) >= 0) { 17434107Sedward (void) write(selwin->ww_pty, 17534107Sedward &escapec, 1); 17634107Sedward out = 1; 17714998Sedward } 17834107Sedward } else { 17934107Sedward if (!terse) 18034107Sedward wwbell(); 18134107Sedward error("Type ? for help."); 18214177Sedward } 18314893Sedward } 18413977Sedward } 18516280Sedward if (!quit) 18616280Sedward setcmd(0); 18713977Sedward } 18813977Sedward 18913977Sedward struct ww * 19013977Sedward getwin() 19113977Sedward { 19213977Sedward register int c; 19314184Sedward struct ww *w = 0; 19413977Sedward 19514189Sedward if (!terse) 19616113Sedward wwputs("Which window? ", cmdwin); 19714987Sedward wwcurtowin(cmdwin); 19815871Sedward while ((c = wwgetc()) < 0) 19915871Sedward wwiomux(); 20014407Sedward if (debug && c == 'c') 20114407Sedward w = cmdwin; 20214407Sedward else if (debug && c == 'f') 20314407Sedward w = framewin; 20414795Sedward else if (debug && c == 'b') 20514795Sedward w = boxwin; 20614407Sedward else if (c >= '1' && c < NWINDOW + '1') 20714407Sedward w = window[c - '1']; 20831140Sedward else if (c == '+') 20931140Sedward w = selwin; 21031140Sedward else if (c == '-') 21131140Sedward w = lastselwin; 21214407Sedward if (w == 0) 21316313Sedward wwbell(); 21414189Sedward if (!terse) 21516312Sedward wwputc('\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 } 22816280Sedward 22916280Sedward setcmd(new) 23016280Sedward char new; 23116280Sedward { 23216280Sedward if (new && !incmd) { 23316280Sedward if (!terse) 23416280Sedward wwadd(cmdwin, &wwhead); 23516280Sedward if (selwin != 0) 23616280Sedward wwcursor(selwin, 1); 23716280Sedward wwcurwin = 0; 23816280Sedward } else if (!new && incmd) { 23916280Sedward if (!terse) { 24016280Sedward wwdelete(cmdwin); 24116280Sedward reframe(); 24216280Sedward } 24316280Sedward if (selwin != 0) 24416280Sedward wwcursor(selwin, 0); 24516280Sedward wwcurwin = selwin; 24616280Sedward } 24716280Sedward incmd = new; 24816280Sedward } 24916280Sedward 25016280Sedward setterse(new) 25116280Sedward char new; 25216280Sedward { 25316280Sedward if (incmd) 25416280Sedward if (new && !terse) { 25516280Sedward wwdelete(cmdwin); 25616280Sedward reframe(); 25716280Sedward } else if (!new && terse) 25816280Sedward wwadd(cmdwin, &wwhead); 25916280Sedward terse = new; 26016280Sedward } 26116280Sedward 26216280Sedward /* 26316280Sedward * Set the current window. 26416280Sedward */ 26516280Sedward setselwin(w) 26616280Sedward struct ww *w; 26716280Sedward { 26816280Sedward if (selwin == w) 26916280Sedward return; 27016304Sedward if (selwin != 0) 27116304Sedward lastselwin = selwin; 27216304Sedward if ((selwin = w) != 0) 27316304Sedward front(selwin, 1); 27416280Sedward } 275