Annotation of 43BSD/ucb/window/win.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)win.c      3.14 4/24/85";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1983 Regents of the University of California,
                      7:  * All rights reserved.  Redistribution permitted subject to
                      8:  * the terms of the Berkeley Software License Agreement.
                      9:  */
                     10: 
                     11: #include "defs.h"
                     12: #include "char.h"
                     13: 
                     14: /*
                     15:  * Higher level routines for dealing with windows.
                     16:  *
                     17:  * There are two types of windows: user window, and information window.
                     18:  * User windows are the ones with a pty and shell.  Information windows
                     19:  * are for displaying error messages, and other information.
                     20:  *
                     21:  * The windows are doubly linked in overlapping order and divided into
                     22:  * two groups: foreground and normal.  Information
                     23:  * windows are always foreground.  User windows can be either.
                     24:  * Addwin() adds a window to the list at the top of one of the two groups.
                     25:  * Deletewin() deletes a window.  Front() moves a window to the front
                     26:  * of its group.  Wwopen(), wwadd(), and wwdelete() should never be called
                     27:  * directly.
                     28:  */
                     29: 
                     30: /*
                     31:  * Open a user window.
                     32:  */
                     33: struct ww *
                     34: openwin(id, row, col, nrow, ncol, nline, label, haspty, hasframe, shf, sh)
                     35: char *label;
                     36: char haspty, hasframe;
                     37: char *shf, **sh;
                     38: {
                     39:        register struct ww *w;
                     40: 
                     41:        if (id < 0 && (id = findid()) < 0)
                     42:                return 0;
                     43:        if (row + nrow <= 0 || row > wwnrow - 1
                     44:            || col + ncol <= 0 || col > wwncol - 1) {
                     45:                error("Illegal window position.");
                     46:                return 0;
                     47:        }
                     48:        w = wwopen(haspty ? WWO_PTY : WWO_SOCKET, nrow, ncol, row, col, nline);
                     49:        if (w == 0) {
                     50:                error("Can't open window: %s.", wwerror());
                     51:                return 0;
                     52:        }
                     53:        w->ww_id = id;
                     54:        window[id] = w;
                     55:        w->ww_hasframe = hasframe;
                     56:        w->ww_alt = w->ww_w;
                     57:        if (label != 0 && setlabel(w, label) < 0)
                     58:                error("No memory for label.");
                     59:        wwcursor(w, 1);
                     60:        /*
                     61:         * We have to do this little maneuver to make sure
                     62:         * addwin() puts w at the top, so we don't waste an
                     63:         * insert and delete operation.
                     64:         */
                     65:        setselwin((struct ww *)0);
                     66:        addwin(w, 0);
                     67:        setselwin(w);
                     68:        wwupdate();
                     69:        wwflush();
                     70:        if (wwspawn(w, shf, sh) < 0) {
                     71:                error("Can't execute %s: %s.", shf, wwerror());
                     72:                c_close(w);
                     73:                return 0;
                     74:        }
                     75:        return w;
                     76: }
                     77: 
                     78: findid()
                     79: {
                     80:        register i;
                     81: 
                     82:        for (i = 0; i < NWINDOW && window[i] != 0; i++)
                     83:                ;
                     84:        if (i >= NWINDOW) {
                     85:                error("Too many windows.");
                     86:                return -1;
                     87:        }
                     88:        return i;
                     89: }
                     90: 
                     91: /*
                     92:  * Close a user window.
                     93:  * May leave selwin == 0.
                     94:  */
                     95: closewin(w)
                     96: register struct ww *w;
                     97: {
                     98:        if (w == selwin)
                     99:                selwin = 0;
                    100:        if (w == lastselwin)
                    101:                lastselwin = 0;
                    102:        if (w->ww_id >= 0 && w->ww_id < NWINDOW)
                    103:                window[w->ww_id] = 0;
                    104:        if (w->ww_label)
                    105:                str_free(w->ww_label);
                    106:        deletewin(w);
                    107:        wwclose(w);
                    108: }
                    109: 
                    110: /*
                    111:  * Open an information (display) window.
                    112:  */
                    113: struct ww *
                    114: openiwin(nrow, label)
                    115: char *label;
                    116: {
                    117:        register struct ww *w;
                    118: 
                    119:        if ((w = wwopen(0, nrow, wwncol, 2, 0, 0)) == 0)
                    120:                return 0;
                    121:        w->ww_mapnl = 1;
                    122:        w->ww_hasframe = 1;
                    123:        w->ww_nointr = 1;
                    124:        w->ww_noupdate = 1;
                    125:        w->ww_unctrl = 1;
                    126:        w->ww_id = -1;
                    127:        w->ww_center = 1;
                    128:        (void) setlabel(w, label);
                    129:        addwin(w, 1);
                    130:        reframe();
                    131:        wwupdate();
                    132:        return w;
                    133: }
                    134: 
                    135: /*
                    136:  * Close an information window.
                    137:  */
                    138: closeiwin(w)
                    139: struct ww *w;
                    140: {
                    141:        closewin(w);
                    142:        reframe();
                    143: }
                    144: 
                    145: /*
                    146:  * Move the window to the top of its group.
                    147:  * Don't do it if already fully visible.
                    148:  * Wwvisible() doesn't work for tinted windows.
                    149:  * But anything to make it faster.
                    150:  * Always reframe() if doreframe is true.
                    151:  */
                    152: front(w, doreframe)
                    153: register struct ww *w;
                    154: char doreframe;
                    155: {
                    156:        if (w->ww_back != (isfg(w) ? framewin : fgwin) && !wwvisible(w)) {
                    157:                deletewin(w);
                    158:                addwin(w, isfg(w));
                    159:                doreframe = 1;
                    160:        }
                    161:        if (doreframe)
                    162:                reframe();
                    163: }
                    164: 
                    165: /*
                    166:  * Add a window at the top of normal windows or foreground windows.
                    167:  * For normal windows, we put it behind the current window.
                    168:  */
                    169: addwin(w, fg)
                    170: register struct ww *w;
                    171: char fg;
                    172: {
                    173:        if (fg) {
                    174:                wwadd(w, framewin);
                    175:                if (fgwin == framewin)
                    176:                        fgwin = w;
                    177:        } else
                    178:                wwadd(w, selwin != 0 && selwin != w && !isfg(selwin)
                    179:                                ? selwin : fgwin);
                    180: }
                    181: 
                    182: /*
                    183:  * Delete a window.
                    184:  */
                    185: deletewin(w)
                    186: register struct ww *w;
                    187: {
                    188:        if (fgwin == w)
                    189:                fgwin = w->ww_back;
                    190:        wwdelete(w);
                    191: }
                    192: 
                    193: reframe()
                    194: {
                    195:        register struct ww *w;
                    196: 
                    197:        wwunframe(framewin);
                    198:        for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
                    199:                if (w->ww_hasframe) {
                    200:                        wwframe(w, framewin);
                    201:                        labelwin(w);
                    202:                }
                    203: }
                    204: 
                    205: labelwin(w)
                    206: register struct ww *w;
                    207: {
                    208:        int mode = w == selwin ? WWM_REV : 0;
                    209: 
                    210:        if (!w->ww_hasframe)
                    211:                return;
                    212:        if (w->ww_id >= 0) {
                    213:                char buf[2];
                    214: 
                    215:                buf[0] = w->ww_id + '1';
                    216:                buf[1] = 0;
                    217:                wwlabel(w, framewin, 1, buf, mode);
                    218:        }
                    219:        if (w->ww_label) {
                    220:                int col;
                    221: 
                    222:                if (w->ww_center) {
                    223:                        col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
                    224:                        col = MAX(3, col);
                    225:                } else
                    226:                        col = 3;
                    227:                wwlabel(w, framewin, col, w->ww_label, mode);
                    228:        }
                    229: }
                    230: 
                    231: stopwin(w)
                    232:        register struct ww *w;
                    233: {
                    234:        w->ww_stopped = 1;
                    235:        if (w->ww_pty >= 0 && w->ww_ispty)
                    236:                (void) ioctl(w->ww_pty, (int)TIOCSTOP, (char *)0);
                    237: }
                    238: 
                    239: startwin(w)
                    240:        register struct ww *w;
                    241: {
                    242:        w->ww_stopped = 0;
                    243:        if (w->ww_pty >= 0 && w->ww_ispty)
                    244:                (void) ioctl(w->ww_pty, (int)TIOCSTART, (char *)0);
                    245: }
                    246: 
                    247: sizewin(w, nrow, ncol)
                    248: register struct ww *w;
                    249: {
                    250:        struct ww *back = w->ww_back;
                    251: 
                    252:        w->ww_alt.nr = w->ww_w.nr;
                    253:        w->ww_alt.nc = w->ww_w.nc;
                    254:        wwdelete(w);
                    255:        if (wwsize(w, nrow, ncol) < 0)
                    256:                error("Can't resize window: %s.", wwerror());
                    257:        wwadd(w, back);
                    258:        reframe();
                    259: }
                    260: 
                    261: waitnl(w)
                    262: struct ww *w;
                    263: {
                    264:        (void) waitnl1(w, "[Type any key to continue]");
                    265: }
                    266: 
                    267: more(w, always)
                    268: register struct ww *w;
                    269: char always;
                    270: {
                    271:        int c;
                    272:        char uc = w->ww_unctrl;
                    273: 
                    274:        if (!always && w->ww_cur.r < w->ww_w.b - 2)
                    275:                return 0;
                    276:        c = waitnl1(w, "[Type escape to abort, any other key to continue]");
                    277:        w->ww_unctrl = 0;
                    278:        wwputs("\033E", w);
                    279:        w->ww_unctrl = uc;
                    280:        return c == ctrl([) ? 2 : 1;
                    281: }
                    282: 
                    283: waitnl1(w, prompt)
                    284: register struct ww *w;
                    285: char *prompt;
                    286: {
                    287:        char uc = w->ww_unctrl;
                    288: 
                    289:        w->ww_unctrl = 0;
                    290:        front(w, 0);
                    291:        wwprintf(w, "\033Y%c%c\033p%s\033q ",
                    292:                w->ww_w.nr - 1 + ' ', ' ', prompt);     /* print on last line */
                    293:        wwcurtowin(w);
                    294:        while (wwpeekc() < 0)
                    295:                wwiomux();
                    296:        w->ww_unctrl = uc;
                    297:        return wwgetc();
                    298: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.