diff options
author | rgrimes <rgrimes@FreeBSD.org> | 1994-05-27 12:33:43 +0000 |
---|---|---|
committer | rgrimes <rgrimes@FreeBSD.org> | 1994-05-27 12:33:43 +0000 |
commit | f9ab90d9d6d02989a075d0f0074496d5b1045e4b (patch) | |
tree | add7e996bac5289cdc55e6935750c352505560a9 /usr.bin/window/cmd.c | |
parent | be22b15ae2ff8d7fe06b6e14fddf0c5b444a95da (diff) | |
download | FreeBSD-src-f9ab90d9d6d02989a075d0f0074496d5b1045e4b.zip FreeBSD-src-f9ab90d9d6d02989a075d0f0074496d5b1045e4b.tar.gz |
BSD 4.4 Lite Usr.bin Sources
Diffstat (limited to 'usr.bin/window/cmd.c')
-rw-r--r-- | usr.bin/window/cmd.c | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/usr.bin/window/cmd.c b/usr.bin/window/cmd.c new file mode 100644 index 0000000..cd105ea --- /dev/null +++ b/usr.bin/window/cmd.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "char.h" + +docmd() +{ + register char c; + register struct ww *w; + char out = 0; + + while (!out && !quit) { + if ((c = wwgetc()) < 0) { + if (terse) + wwsetcursor(0, 0); + else { + wwputs("Command: ", cmdwin); + wwcurtowin(cmdwin); + } + do + wwiomux(); + while ((c = wwgetc()) < 0); + } + if (!terse) + wwputc('\n', cmdwin); + switch (c) { + default: + if (c != escapec) + break; + case 'h': case 'j': case 'k': case 'l': + case 'y': case 'p': + case ctrl('y'): + case ctrl('e'): + case ctrl('u'): + case ctrl('d'): + case ctrl('b'): + case ctrl('f'): + case ctrl('s'): + case ctrl('q'): + case ctrl('['): + if (selwin == 0) { + error("No window."); + continue; + } + } + switch (c) { + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + if ((w = window[c - '1']) == 0) { + error("%c: No such window.", c); + break; + } + setselwin(w); + if (checkproc(selwin) >= 0) + out = 1; + break; + case '%': + if ((w = getwin()) != 0) + setselwin(w); + break; + case ctrl('^'): + if (lastselwin != 0) { + setselwin(lastselwin); + if (checkproc(selwin) >= 0) + out = 1; + } else + error("No previous window."); + break; + case 'c': + if ((w = getwin()) != 0) + closewin(w); + break; + case 'w': + c_window(); + break; + case 'm': + if ((w = getwin()) != 0) + c_move(w); + break; + case 'M': + if ((w = getwin()) != 0) + movewin(w, w->ww_alt.t, w->ww_alt.l); + break; + case 's': + if ((w = getwin()) != 0) + c_size(w); + break; + case 'S': + if ((w = getwin()) != 0) + sizewin(w, w->ww_alt.nr, w->ww_alt.nc); + break; + case 'y': + c_yank(); + break; + case 'p': + c_put(); + break; + case ':': + c_colon(); + break; + case 'h': + (void) wwwrite(selwin, "\b", 1); + break; + case 'j': + (void) wwwrite(selwin, "\n", 1); + break; + case 'k': + (void) wwwrite(selwin, "\033A", 2); + break; + case 'l': + (void) wwwrite(selwin, "\033C", 2); + break; + case ctrl('e'): + wwscroll(selwin, 1); + break; + case ctrl('y'): + wwscroll(selwin, -1); + break; + case ctrl('d'): + wwscroll(selwin, selwin->ww_w.nr / 2); + break; + case ctrl('u'): + wwscroll(selwin, - selwin->ww_w.nr / 2); + break; + case ctrl('f'): + wwscroll(selwin, selwin->ww_w.nr); + break; + case ctrl('b'): + wwscroll(selwin, - selwin->ww_w.nr); + break; + case ctrl('s'): + stopwin(selwin); + break; + case ctrl('q'): + startwin(selwin); + break; + case ctrl('l'): + wwredraw(); + break; + case '?': + c_help(); + break; + case ctrl('['): + if (checkproc(selwin) >= 0) + out = 1; + break; + case ctrl('z'): + wwsuspend(); + break; + case 'q': + c_quit(); + break; + /* debugging stuff */ + case '&': + if (debug) { + c_debug(); + break; + } + default: + if (c == escapec) { + if (checkproc(selwin) >= 0) { + (void) write(selwin->ww_pty, + &escapec, 1); + out = 1; + } + } else { + if (!terse) + wwbell(); + error("Type ? for help."); + } + } + } + if (!quit) + setcmd(0); +} + +struct ww * +getwin() +{ + register int c; + struct ww *w = 0; + + if (!terse) + wwputs("Which window? ", cmdwin); + wwcurtowin(cmdwin); + while ((c = wwgetc()) < 0) + wwiomux(); + if (debug && c == 'c') + w = cmdwin; + else if (debug && c == 'f') + w = framewin; + else if (debug && c == 'b') + w = boxwin; + else if (c >= '1' && c < NWINDOW + '1') + w = window[c - '1']; + else if (c == '+') + w = selwin; + else if (c == '-') + w = lastselwin; + if (w == 0) + wwbell(); + if (!terse) + wwputc('\n', cmdwin); + return w; +} + +checkproc(w) +struct ww *w; +{ + if (w->ww_state != WWS_HASPROC) { + error("No process in window."); + return -1; + } + return 0; +} + +setcmd(new) +char new; +{ + if (new && !incmd) { + if (!terse) + wwadd(cmdwin, &wwhead); + if (selwin != 0) + wwcursor(selwin, 1); + wwcurwin = 0; + } else if (!new && incmd) { + if (!terse) { + wwdelete(cmdwin); + reframe(); + } + if (selwin != 0) + wwcursor(selwin, 0); + wwcurwin = selwin; + } + incmd = new; +} + +setterse(new) +char new; +{ + if (incmd) + if (new && !terse) { + wwdelete(cmdwin); + reframe(); + } else if (!new && terse) + wwadd(cmdwin, &wwhead); + terse = new; +} + +/* + * Set the current window. + */ +setselwin(w) +struct ww *w; +{ + if (selwin == w) + return; + if (selwin != 0) + lastselwin = selwin; + if ((selwin = w) != 0) + front(selwin, 1); +} |