[BACK]Return to ww.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / window

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))