Annotation of src/usr.bin/window/ww.h, Revision 1.1
1.1 ! deraadt 1: /* $NetBSD: ww.h,v 1.3 1995/09/28 10:35:07 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: * @(#)ww.h 8.1 (Berkeley) 6/6/93
! 39: */
! 40:
! 41: #ifdef OLD_TTY
! 42: #include <sgtty.h>
! 43: #else
! 44: #include <termios.h>
! 45: #endif
! 46: #include <setjmp.h>
! 47: #include <machine/endian.h>
! 48:
! 49: #define NWW 30 /* maximum number of windows */
! 50:
! 51: /* a rectangle */
! 52: struct ww_dim {
! 53: int nr; /* number of rows */
! 54: int nc; /* number of columns */
! 55: int t, b; /* top, bottom */
! 56: int l, r; /* left, right */
! 57: };
! 58:
! 59: /* a coordinate */
! 60: struct ww_pos {
! 61: int r; /* row */
! 62: int c; /* column */
! 63: };
! 64:
! 65: /* the window structure */
! 66: struct ww {
! 67: /* general flags and states */
! 68: char ww_state; /* state of window */
! 69: char ww_oflags; /* wwopen flags */
! 70:
! 71: /* information for overlap */
! 72: struct ww *ww_forw; /* doubly linked list, for overlapping info */
! 73: struct ww *ww_back;
! 74: char ww_index; /* the window index, for wwindex[] */
! 75: char ww_order; /* the overlapping order */
! 76:
! 77: /* sizes and positions */
! 78: struct ww_dim ww_w; /* window size and pos */
! 79: struct ww_dim ww_b; /* buffer size and pos */
! 80: struct ww_dim ww_i; /* the part inside the screen */
! 81: struct ww_pos ww_cur; /* the cursor position, relative to ww_w */
! 82:
! 83: /* arrays */
! 84: char **ww_win; /* the window */
! 85: union ww_char **ww_buf; /* the buffer */
! 86: char **ww_fmap; /* map for frame and box windows */
! 87: short *ww_nvis; /* how many ww_buf chars are visible per row */
! 88:
! 89: /* information for wwwrite() and company */
! 90: char ww_wstate; /* state for outputting characters */
! 91: char ww_modes; /* current display modes */
! 92: char ww_insert; /* insert mode */
! 93: char ww_mapnl; /* map \n to \r\n */
! 94: char ww_noupdate; /* don't do updates in wwwrite() */
! 95: char ww_unctrl; /* expand control characters */
! 96: char ww_nointr; /* wwwrite() not interruptable */
! 97: char ww_hascursor; /* has fake cursor */
! 98:
! 99: /* things for the window process and io */
! 100: char ww_ispty; /* ww_pty is really a pty, not socket pair */
! 101: char ww_stopped; /* output stopped */
! 102: int ww_pty; /* file descriptor of pty or socket pair */
! 103: int ww_socket; /* other end of socket pair */
! 104: int ww_pid; /* pid of process, if WWS_HASPROC true */
! 105: char ww_ttyname[11]; /* "/dev/ttyp?" */
! 106: char *ww_ob; /* output buffer */
! 107: char *ww_obe; /* end of ww_ob */
! 108: char *ww_obp; /* current read position in ww_ob */
! 109: char *ww_obq; /* current write position in ww_ob */
! 110:
! 111: /* things for the user, they really don't belong here */
! 112: char ww_id; /* the user window id */
! 113: char ww_center; /* center the label */
! 114: char ww_hasframe; /* frame it */
! 115: char ww_keepopen; /* keep it open after the process dies */
! 116: char *ww_label; /* the user supplied label */
! 117: struct ww_dim ww_alt; /* alternate position and size */
! 118: };
! 119:
! 120: /* state of a tty */
! 121: struct ww_tty {
! 122: #ifdef OLD_TTY
! 123: struct sgttyb ww_sgttyb;
! 124: struct tchars ww_tchars;
! 125: struct ltchars ww_ltchars;
! 126: int ww_lmode;
! 127: int ww_ldisc;
! 128: #else
! 129: struct termios ww_termios;
! 130: #endif
! 131: int ww_fflags;
! 132: };
! 133:
! 134: union ww_char {
! 135: short c_w; /* as a word */
! 136: struct {
! 137: #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
! 138: char C_c; /* the character part */
! 139: char C_m; /* the mode part */
! 140: #endif
! 141: #if BYTE_ORDER == BIG_ENDIAN
! 142: char C_m; /* the mode part */
! 143: char C_c; /* the character part */
! 144: #endif
! 145: } c_un;
! 146: };
! 147: #define c_c c_un.C_c
! 148: #define c_m c_un.C_m
! 149:
! 150: /* for display update */
! 151: struct ww_update {
! 152: int best_gain;
! 153: int best_col;
! 154: int gain;
! 155: };
! 156:
! 157: /* parts of ww_char */
! 158: #define WWC_CMASK 0x00ff
! 159: #define WWC_MMASK 0xff00
! 160: #define WWC_MSHIFT 8
! 161:
! 162: /* c_m bits */
! 163: #define WWM_REV 0x01 /* reverse video */
! 164: #define WWM_BLK 0x02 /* blinking */
! 165: #define WWM_UL 0x04 /* underlined */
! 166: #define WWM_GRP 0x08 /* graphics */
! 167: #define WWM_DIM 0x10 /* half intensity */
! 168: #define WWM_USR 0x20 /* user specified mode */
! 169: #define WWM_GLS 0x40 /* window only, glass, i.e., transparent */
! 170:
! 171: /* ww_state values */
! 172: #define WWS_INITIAL 0 /* just opened */
! 173: #define WWS_HASPROC 1 /* has process on pty */
! 174: #define WWS_DEAD 3 /* child died */
! 175:
! 176: /* flags for ww_fmap */
! 177: #define WWF_U 0x01
! 178: #define WWF_R 0x02
! 179: #define WWF_D 0x04
! 180: #define WWF_L 0x08
! 181: #define WWF_MASK (WWF_U|WWF_R|WWF_D|WWF_L)
! 182: #define WWF_LABEL 0x40
! 183: #define WWF_TOP 0x80
! 184:
! 185: /* flags to wwopen() */
! 186: #define WWO_PTY 0x01 /* want pty */
! 187: #define WWO_SOCKET 0x02 /* want socket pair */
! 188: #define WWO_REVERSE 0x04 /* make it all reverse video */
! 189: #define WWO_GLASS 0x08 /* make it all glass */
! 190: #define WWO_FRAME 0x10 /* this is a frame window */
! 191:
! 192: /* special ww_index value */
! 193: #define WWX_NOBODY NWW
! 194:
! 195: /* error codes */
! 196: #define WWE_NOERR 0
! 197: #define WWE_SYS 1 /* system error */
! 198: #define WWE_NOMEM 2 /* out of memory */
! 199: #define WWE_TOOMANY 3 /* too many windows */
! 200: #define WWE_NOPTY 4 /* no more ptys */
! 201: #define WWE_SIZE 5 /* bad window size */
! 202: #define WWE_BADTERM 6 /* bad terminal type */
! 203: #define WWE_CANTDO 7 /* dumb terminal */
! 204:
! 205: /* wwtouched[] bits, there used to be more than one */
! 206: #define WWU_TOUCHED 0x01 /* touched */
! 207:
! 208: /* the window structures */
! 209: struct ww wwhead;
! 210: struct ww *wwindex[NWW + 1]; /* last location is for wwnobody */
! 211: struct ww wwnobody;
! 212:
! 213: /* tty things */
! 214: struct ww_tty wwoldtty; /* the old (saved) terminal settings */
! 215: struct ww_tty wwnewtty; /* the new (current) terminal settings */
! 216: struct ww_tty wwwintty; /* the terminal settings for windows */
! 217: char *wwterm; /* the terminal name */
! 218: char wwtermcap[1024]; /* place for the termcap */
! 219:
! 220: /* generally useful variables */
! 221: int wwnrow, wwncol; /* the screen size */
! 222: char wwavailmodes; /* actually supported modes */
! 223: char wwcursormodes; /* the modes for the fake cursor */
! 224: char wwwrap; /* terminal has auto wrap around */
! 225: int wwdtablesize; /* result of getdtablesize() call */
! 226: char **wwsmap; /* the screen map */
! 227: union ww_char **wwos; /* the old (current) screen */
! 228: union ww_char **wwns; /* the new (desired) screen */
! 229: union ww_char **wwcs; /* the checkpointed screen */
! 230: char *wwtouched; /* wwns changed flags */
! 231: struct ww_update *wwupd; /* for display update */
! 232: int wwospeed; /* output baud rate, copied from wwoldtty */
! 233: int wwbaud; /* wwospeed converted into actual number */
! 234: int wwcursorrow, wwcursorcol; /* where we want the cursor to be */
! 235: int wwerrno; /* error number */
! 236:
! 237: /* statistics */
! 238: int wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc;
! 239: int wwnwwr, wwnwwra, wwnwwrc;
! 240: int wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc;
! 241: int wwnupdate, wwnupdline, wwnupdmiss;
! 242: int wwnupdscan, wwnupdclreol, wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline;
! 243: int wwnread, wwnreade, wwnreadz;
! 244: int wwnreadc, wwnreadack, wwnreadnack, wwnreadstat, wwnreadec;
! 245: int wwnwread, wwnwreade, wwnwreadz, wwnwreadd, wwnwreadc, wwnwreadp;
! 246: int wwnselect, wwnselecte, wwnselectz;
! 247:
! 248: /* quicky macros */
! 249: #define wwsetcursor(r,c) (wwcursorrow = (r), wwcursorcol = (c))
! 250: #define wwcurtowin(w) wwsetcursor((w)->ww_cur.r, (w)->ww_cur.c)
! 251: #define wwunbox(w) wwunframe(w)
! 252: #define wwclreol(w,r,c) wwclreol1((w), (r), (c), 0)
! 253: #define wwredrawwin(w) wwredrawwin1((w), (w)->ww_i.t, (w)->ww_i.b, 0)
! 254: #define wwupdate() wwupdate1(0, wwnrow);
! 255:
! 256: /* things for handling input */
! 257: void wwrint(); /* interrupt handler */
! 258: struct ww *wwcurwin; /* window to copy input into */
! 259: char *wwib; /* input (keyboard) buffer */
! 260: char *wwibe; /* wwib + sizeof buffer */
! 261: char *wwibp; /* current read position in buffer */
! 262: char *wwibq; /* current write position in buffer */
! 263: #define wwmaskc(c) ((c) & 0x7f)
! 264: #define wwgetc() (wwibp < wwibq ? wwmaskc(*wwibp++) : -1)
! 265: #define wwpeekc() (wwibp < wwibq ? wwmaskc(*wwibp) : -1)
! 266: #define wwungetc(c) (wwibp > wwib ? *--wwibp = (c) : -1)
! 267:
! 268: /* things for short circuiting wwiomux() */
! 269: char wwintr; /* interrupting */
! 270: char wwsetjmp; /* want a longjmp() from wwrint() and wwchild() */
! 271: jmp_buf wwjmpbuf; /* jmpbuf for above */
! 272: #define wwinterrupt() wwintr
! 273: #define wwsetintr() do { wwintr = 1; if (wwsetjmp) longjmp(wwjmpbuf, 1); } \
! 274: while (0)
! 275: #define wwclrintr() (wwintr = 0)
! 276:
! 277: /* checkpointing */
! 278: int wwdocheckpoint;
! 279:
! 280: /* the window virtual terminal */
! 281: #define WWT_TERM "window-v2"
! 282: #define WWT_TERMCAP "WW|window-v2|window program version 2:\
! 283: :am:bs:da:db:ms:pt:cr=^M:nl=^J:bl=^G:ta=^I:\
! 284: :cm=\\EY%+ %+ :le=^H:nd=\\EC:up=\\EA:do=\\EB:ho=\\EH:\
! 285: :cd=\\EJ:ce=\\EK:cl=\\EE:me=\\Er^?:"
! 286: #define WWT_REV "se=\\ErA:so=\\EsA:mr=\\EsA:"
! 287: #define WWT_BLK "BE=\\ErB:BS=\\EsB:mb=\\EsB:"
! 288: #define WWT_UL "ue=\\ErD:us=\\EsD:"
! 289: #define WWT_GRP "ae=\\ErH:as=\\EsH:"
! 290: #define WWT_DIM "HE=\\ErP:HS=\\EsP:mh=\\EsP:"
! 291: #define WWT_USR "XE=\\Er`:XS=\\Es`:"
! 292: #define WWT_ALDL "al=\\EL:dl=\\EM:"
! 293: #define WWT_IMEI "im=\\E@:ei=\\EO:ic=:mi:" /* XXX, ic for emacs bug */
! 294: #define WWT_IC "ic=\\EP:"
! 295: #define WWT_DC "dc=\\EN:"
! 296: char wwwintermcap[1024]; /* terminal-specific but window-independent
! 297: part of the window termcap */
! 298: #ifdef TERMINFO
! 299: /* where to put the temporary terminfo directory */
! 300: char wwterminfopath[1024];
! 301: #endif
! 302:
! 303: /* our functions */
! 304: struct ww *wwopen();
! 305: void wwchild();
! 306: void wwalarm();
! 307: void wwquit();
! 308: char **wwalloc();
! 309: char *wwerror();
! 310:
! 311: /* c library functions */
! 312: char *malloc();
! 313: char *calloc();
! 314: char *getenv();
! 315: char *tgetstr();
! 316: char *rindex();
! 317: char *strcpy();
! 318: char *strcat();
! 319:
! 320: #undef MIN
! 321: #undef MAX
! 322: #define MIN(x, y) ((x) > (y) ? (y) : (x))
! 323: #define MAX(x, y) ((x) > (y) ? (x) : (y))