Annotation of src/usr.bin/window/cmd.c, Revision 1.1
1.1 ! deraadt 1: /* $NetBSD: cmd.c,v 1.3 1995/09/28 10:34:02 tls Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1983, 1993
! 5: * The Regents of the University of California. All rights reserved.
! 6: *
! 7: * This code is derived from software contributed to Berkeley by
! 8: * Edward Wang at The University of California, Berkeley.
! 9: *
! 10: * Redistribution and use in source and binary forms, with or without
! 11: * modification, are permitted provided that the following conditions
! 12: * are met:
! 13: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: * 3. All advertising materials mentioning features or use of this software
! 19: * must display the following acknowledgement:
! 20: * This product includes software developed by the University of
! 21: * California, Berkeley and its contributors.
! 22: * 4. Neither the name of the University nor the names of its contributors
! 23: * may be used to endorse or promote products derived from this software
! 24: * without specific prior written permission.
! 25: *
! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 36: * SUCH DAMAGE.
! 37: */
! 38:
! 39: #ifndef lint
! 40: #if 0
! 41: static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93";
! 42: #else
! 43: static char rcsid[] = "$NetBSD: cmd.c,v 1.3 1995/09/28 10:34:02 tls Exp $";
! 44: #endif
! 45: #endif /* not lint */
! 46:
! 47: #include "defs.h"
! 48: #include "char.h"
! 49:
! 50: docmd()
! 51: {
! 52: register char c;
! 53: register struct ww *w;
! 54: char out = 0;
! 55:
! 56: while (!out && !quit) {
! 57: if ((c = wwgetc()) < 0) {
! 58: if (terse)
! 59: wwsetcursor(0, 0);
! 60: else {
! 61: wwputs("Command: ", cmdwin);
! 62: wwcurtowin(cmdwin);
! 63: }
! 64: do
! 65: wwiomux();
! 66: while ((c = wwgetc()) < 0);
! 67: }
! 68: if (!terse)
! 69: wwputc('\n', cmdwin);
! 70: switch (c) {
! 71: default:
! 72: if (c != escapec)
! 73: break;
! 74: case 'h': case 'j': case 'k': case 'l':
! 75: case 'y': case 'p':
! 76: case ctrl('y'):
! 77: case ctrl('e'):
! 78: case ctrl('u'):
! 79: case ctrl('d'):
! 80: case ctrl('b'):
! 81: case ctrl('f'):
! 82: case ctrl('s'):
! 83: case ctrl('q'):
! 84: case ctrl('['):
! 85: if (selwin == 0) {
! 86: error("No window.");
! 87: continue;
! 88: }
! 89: }
! 90: switch (c) {
! 91: case '1': case '2': case '3': case '4': case '5':
! 92: case '6': case '7': case '8': case '9':
! 93: if ((w = window[c - '1']) == 0) {
! 94: error("%c: No such window.", c);
! 95: break;
! 96: }
! 97: setselwin(w);
! 98: if (checkproc(selwin) >= 0)
! 99: out = 1;
! 100: break;
! 101: case '%':
! 102: if ((w = getwin()) != 0)
! 103: setselwin(w);
! 104: break;
! 105: case ctrl('^'):
! 106: if (lastselwin != 0) {
! 107: setselwin(lastselwin);
! 108: if (checkproc(selwin) >= 0)
! 109: out = 1;
! 110: } else
! 111: error("No previous window.");
! 112: break;
! 113: case 'c':
! 114: if ((w = getwin()) != 0)
! 115: closewin(w);
! 116: break;
! 117: case 'w':
! 118: c_window();
! 119: break;
! 120: case 'm':
! 121: if ((w = getwin()) != 0)
! 122: c_move(w);
! 123: break;
! 124: case 'M':
! 125: if ((w = getwin()) != 0)
! 126: movewin(w, w->ww_alt.t, w->ww_alt.l);
! 127: break;
! 128: case 's':
! 129: if ((w = getwin()) != 0)
! 130: c_size(w);
! 131: break;
! 132: case 'S':
! 133: if ((w = getwin()) != 0)
! 134: sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
! 135: break;
! 136: case 'y':
! 137: c_yank();
! 138: break;
! 139: case 'p':
! 140: c_put();
! 141: break;
! 142: case ':':
! 143: c_colon();
! 144: break;
! 145: case 'h':
! 146: (void) wwwrite(selwin, "\b", 1);
! 147: break;
! 148: case 'j':
! 149: (void) wwwrite(selwin, "\n", 1);
! 150: break;
! 151: case 'k':
! 152: (void) wwwrite(selwin, "\033A", 2);
! 153: break;
! 154: case 'l':
! 155: (void) wwwrite(selwin, "\033C", 2);
! 156: break;
! 157: case ctrl('e'):
! 158: wwscroll(selwin, 1);
! 159: break;
! 160: case ctrl('y'):
! 161: wwscroll(selwin, -1);
! 162: break;
! 163: case ctrl('d'):
! 164: wwscroll(selwin, selwin->ww_w.nr / 2);
! 165: break;
! 166: case ctrl('u'):
! 167: wwscroll(selwin, - selwin->ww_w.nr / 2);
! 168: break;
! 169: case ctrl('f'):
! 170: wwscroll(selwin, selwin->ww_w.nr);
! 171: break;
! 172: case ctrl('b'):
! 173: wwscroll(selwin, - selwin->ww_w.nr);
! 174: break;
! 175: case ctrl('s'):
! 176: stopwin(selwin);
! 177: break;
! 178: case ctrl('q'):
! 179: startwin(selwin);
! 180: break;
! 181: case ctrl('l'):
! 182: wwredraw();
! 183: break;
! 184: case '?':
! 185: c_help();
! 186: break;
! 187: case ctrl('['):
! 188: if (checkproc(selwin) >= 0)
! 189: out = 1;
! 190: break;
! 191: case ctrl('z'):
! 192: wwsuspend();
! 193: break;
! 194: case 'q':
! 195: c_quit();
! 196: break;
! 197: /* debugging stuff */
! 198: case '&':
! 199: if (debug) {
! 200: c_debug();
! 201: break;
! 202: }
! 203: default:
! 204: if (c == escapec) {
! 205: if (checkproc(selwin) >= 0) {
! 206: (void) write(selwin->ww_pty,
! 207: &escapec, 1);
! 208: out = 1;
! 209: }
! 210: } else {
! 211: if (!terse)
! 212: wwbell();
! 213: error("Type ? for help.");
! 214: }
! 215: }
! 216: }
! 217: if (!quit)
! 218: setcmd(0);
! 219: }
! 220:
! 221: struct ww *
! 222: getwin()
! 223: {
! 224: register int c;
! 225: struct ww *w = 0;
! 226:
! 227: if (!terse)
! 228: wwputs("Which window? ", cmdwin);
! 229: wwcurtowin(cmdwin);
! 230: while ((c = wwgetc()) < 0)
! 231: wwiomux();
! 232: if (debug && c == 'c')
! 233: w = cmdwin;
! 234: else if (debug && c == 'f')
! 235: w = framewin;
! 236: else if (debug && c == 'b')
! 237: w = boxwin;
! 238: else if (c >= '1' && c < NWINDOW + '1')
! 239: w = window[c - '1'];
! 240: else if (c == '+')
! 241: w = selwin;
! 242: else if (c == '-')
! 243: w = lastselwin;
! 244: if (w == 0)
! 245: wwbell();
! 246: if (!terse)
! 247: wwputc('\n', cmdwin);
! 248: return w;
! 249: }
! 250:
! 251: checkproc(w)
! 252: struct ww *w;
! 253: {
! 254: if (w->ww_state != WWS_HASPROC) {
! 255: error("No process in window.");
! 256: return -1;
! 257: }
! 258: return 0;
! 259: }
! 260:
! 261: setcmd(new)
! 262: char new;
! 263: {
! 264: if (new && !incmd) {
! 265: if (!terse)
! 266: wwadd(cmdwin, &wwhead);
! 267: if (selwin != 0)
! 268: wwcursor(selwin, 1);
! 269: wwcurwin = 0;
! 270: } else if (!new && incmd) {
! 271: if (!terse) {
! 272: wwdelete(cmdwin);
! 273: reframe();
! 274: }
! 275: if (selwin != 0)
! 276: wwcursor(selwin, 0);
! 277: wwcurwin = selwin;
! 278: }
! 279: incmd = new;
! 280: }
! 281:
! 282: setterse(new)
! 283: char new;
! 284: {
! 285: if (incmd)
! 286: if (new && !terse) {
! 287: wwdelete(cmdwin);
! 288: reframe();
! 289: } else if (!new && terse)
! 290: wwadd(cmdwin, &wwhead);
! 291: terse = new;
! 292: }
! 293:
! 294: /*
! 295: * Set the current window.
! 296: */
! 297: setselwin(w)
! 298: struct ww *w;
! 299: {
! 300: if (selwin == w)
! 301: return;
! 302: if (selwin != 0)
! 303: lastselwin = selwin;
! 304: if ((selwin = w) != 0)
! 305: front(selwin, 1);
! 306: }