118729Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42835Sbostic * %sccs.include.redist.c% 618729Sedward */ 718729Sedward 833514Sbostic #ifndef lint 9*42835Sbostic static char sccsid[] = "@(#)cmd.c 3.39 (Berkeley) 06/02/90"; 1033514Sbostic #endif /* not lint */ 1133514Sbostic 1213977Sedward #include "defs.h" 1316309Sedward #include "char.h" 1413977Sedward 1513977Sedward docmd() 1613977Sedward { 1713977Sedward register char c; 1813977Sedward register struct ww *w; 1916280Sedward char out = 0; 2013977Sedward 2134107Sedward while (!out && !quit) { 2234107Sedward if ((c = wwgetc()) < 0) { 2334107Sedward if (terse) 2434107Sedward wwsetcursor(0, 0); 2534107Sedward else { 2634107Sedward wwputs("Command: ", cmdwin); 2734107Sedward wwcurtowin(cmdwin); 2813977Sedward } 2934107Sedward do 3034107Sedward wwiomux(); 3134107Sedward while ((c = wwgetc()) < 0); 3234107Sedward } 3334107Sedward if (!terse) 3434107Sedward wwputc('\n', cmdwin); 3534107Sedward switch (c) { 3634107Sedward default: 3734107Sedward if (c != escapec) 3814893Sedward break; 3934107Sedward case 'h': case 'j': case 'k': case 'l': 4034107Sedward case ctrl('y'): 4134107Sedward case ctrl('e'): 4234107Sedward case ctrl('u'): 4334107Sedward case ctrl('d'): 4434107Sedward case ctrl('b'): 4534107Sedward case ctrl('f'): 4634107Sedward case ctrl('s'): 4734107Sedward case ctrl('q'): 4834107Sedward case ctrl('['): 4934107Sedward if (selwin == 0) { 5034107Sedward error("No window."); 5134107Sedward continue; 5234107Sedward } 5334107Sedward } 5434107Sedward switch (c) { 5534107Sedward case '1': case '2': case '3': case '4': case '5': 5634107Sedward case '6': case '7': case '8': case '9': 5734107Sedward if ((w = window[c - '1']) == 0) { 5834107Sedward error("%c: No such window.", c); 5914893Sedward break; 6034107Sedward } 6134107Sedward setselwin(w); 6234107Sedward if (checkproc(selwin) >= 0) 6334107Sedward out = 1; 6434107Sedward break; 6534107Sedward case '%': 6634107Sedward if ((w = getwin()) != 0) 6734107Sedward setselwin(w); 6834107Sedward break; 6934107Sedward case ctrl('^'): 7034107Sedward if (lastselwin != 0) { 7134107Sedward setselwin(lastselwin); 7214893Sedward if (checkproc(selwin) >= 0) 7316280Sedward out = 1; 7434107Sedward } else 7534107Sedward error("No previous window."); 7634107Sedward break; 7734107Sedward case 'c': 7834107Sedward if ((w = getwin()) != 0) 7934107Sedward closewin(w); 8034107Sedward break; 8134107Sedward case 'w': 8234107Sedward c_window(); 8334107Sedward break; 8434107Sedward case 'm': 8534107Sedward if ((w = getwin()) != 0) 8634107Sedward c_move(w); 8734107Sedward break; 8834107Sedward case 'M': 8934107Sedward if ((w = getwin()) != 0) 9034107Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 9134107Sedward break; 9234107Sedward case 's': 9334107Sedward if ((w = getwin()) != 0) 9434107Sedward c_size(w); 9534107Sedward break; 9634107Sedward case 'S': 9734107Sedward if ((w = getwin()) != 0) 9834107Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 9934107Sedward break; 10034107Sedward case ':': 10134107Sedward c_colon(); 10234107Sedward break; 10334107Sedward case 'h': 10434107Sedward (void) wwwrite(selwin, "\b", 1); 10534107Sedward break; 10634107Sedward case 'j': 10734107Sedward (void) wwwrite(selwin, "\n", 1); 10834107Sedward break; 10934107Sedward case 'k': 11034107Sedward (void) wwwrite(selwin, "\033A", 2); 11134107Sedward break; 11234107Sedward case 'l': 11334107Sedward (void) wwwrite(selwin, "\033C", 2); 11434107Sedward break; 11534107Sedward case ctrl('e'): 11634107Sedward wwscroll(selwin, 1); 11734107Sedward break; 11834107Sedward case ctrl('y'): 11934107Sedward wwscroll(selwin, -1); 12034107Sedward break; 12134107Sedward case ctrl('d'): 12234107Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 12334107Sedward break; 12434107Sedward case ctrl('u'): 12534107Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 12634107Sedward break; 12734107Sedward case ctrl('f'): 12834107Sedward wwscroll(selwin, selwin->ww_w.nr); 12934107Sedward break; 13034107Sedward case ctrl('b'): 13134107Sedward wwscroll(selwin, - selwin->ww_w.nr); 13234107Sedward break; 13334107Sedward case ctrl('s'): 13434107Sedward stopwin(selwin); 13534107Sedward break; 13634107Sedward case ctrl('q'): 13734107Sedward startwin(selwin); 13834107Sedward break; 13934107Sedward case ctrl('l'): 14034107Sedward wwredraw(); 14134107Sedward break; 14234107Sedward case '?': 14334107Sedward c_help(); 14434107Sedward break; 14534107Sedward case ctrl('['): 14634107Sedward if (checkproc(selwin) >= 0) 14734107Sedward out = 1; 14834107Sedward break; 14934107Sedward case ctrl('z'): 15034107Sedward wwsuspend(); 15134107Sedward break; 15234107Sedward case 'q': 15334107Sedward c_quit(); 15434107Sedward break; 15534107Sedward /* debugging stuff */ 15634107Sedward case '&': 15734107Sedward if (debug) { 15834107Sedward c_debug(); 15914893Sedward break; 16034107Sedward } 16134107Sedward default: 16234107Sedward if (c == escapec) { 16334107Sedward if (checkproc(selwin) >= 0) { 16434107Sedward (void) write(selwin->ww_pty, 16534107Sedward &escapec, 1); 16634107Sedward out = 1; 16714998Sedward } 16834107Sedward } else { 16934107Sedward if (!terse) 17034107Sedward wwbell(); 17134107Sedward error("Type ? for help."); 17214177Sedward } 17314893Sedward } 17413977Sedward } 17516280Sedward if (!quit) 17616280Sedward setcmd(0); 17713977Sedward } 17813977Sedward 17913977Sedward struct ww * 18013977Sedward getwin() 18113977Sedward { 18213977Sedward register int c; 18314184Sedward struct ww *w = 0; 18413977Sedward 18514189Sedward if (!terse) 18616113Sedward wwputs("Which window? ", cmdwin); 18714987Sedward wwcurtowin(cmdwin); 18815871Sedward while ((c = wwgetc()) < 0) 18915871Sedward wwiomux(); 19014407Sedward if (debug && c == 'c') 19114407Sedward w = cmdwin; 19214407Sedward else if (debug && c == 'f') 19314407Sedward w = framewin; 19414795Sedward else if (debug && c == 'b') 19514795Sedward w = boxwin; 19614407Sedward else if (c >= '1' && c < NWINDOW + '1') 19714407Sedward w = window[c - '1']; 19831140Sedward else if (c == '+') 19931140Sedward w = selwin; 20031140Sedward else if (c == '-') 20131140Sedward w = lastselwin; 20214407Sedward if (w == 0) 20316313Sedward wwbell(); 20414189Sedward if (!terse) 20516312Sedward wwputc('\n', cmdwin); 20613977Sedward return w; 20713977Sedward } 20813977Sedward 20914893Sedward checkproc(w) 21014893Sedward struct ww *w; 21114893Sedward { 21214893Sedward if (w->ww_state != WWS_HASPROC) { 21314893Sedward error("No process in window."); 21414893Sedward return -1; 21514893Sedward } 21614893Sedward return 0; 21714893Sedward } 21816280Sedward 21916280Sedward setcmd(new) 22016280Sedward char new; 22116280Sedward { 22216280Sedward if (new && !incmd) { 22316280Sedward if (!terse) 22416280Sedward wwadd(cmdwin, &wwhead); 22516280Sedward if (selwin != 0) 22616280Sedward wwcursor(selwin, 1); 22716280Sedward wwcurwin = 0; 22816280Sedward } else if (!new && incmd) { 22916280Sedward if (!terse) { 23016280Sedward wwdelete(cmdwin); 23116280Sedward reframe(); 23216280Sedward } 23316280Sedward if (selwin != 0) 23416280Sedward wwcursor(selwin, 0); 23516280Sedward wwcurwin = selwin; 23616280Sedward } 23716280Sedward incmd = new; 23816280Sedward } 23916280Sedward 24016280Sedward setterse(new) 24116280Sedward char new; 24216280Sedward { 24316280Sedward if (incmd) 24416280Sedward if (new && !terse) { 24516280Sedward wwdelete(cmdwin); 24616280Sedward reframe(); 24716280Sedward } else if (!new && terse) 24816280Sedward wwadd(cmdwin, &wwhead); 24916280Sedward terse = new; 25016280Sedward } 25116280Sedward 25216280Sedward /* 25316280Sedward * Set the current window. 25416280Sedward */ 25516280Sedward setselwin(w) 25616280Sedward struct ww *w; 25716280Sedward { 25816280Sedward if (selwin == w) 25916280Sedward return; 26016304Sedward if (selwin != 0) 26116304Sedward lastselwin = selwin; 26216304Sedward if ((selwin = w) != 0) 26316304Sedward front(selwin, 1); 26416280Sedward } 265