[BACK]Return to wsemul_dumb.c CVS log [TXT][DIR] Up to [local] / sys / dev / wscons

Annotation of sys/dev/wscons/wsemul_dumb.c, Revision 1.1

1.1     ! nbrk        1: /* $OpenBSD: wsemul_dumb.c,v 1.4 2007/03/07 06:23:04 miod Exp $ */
        !             2: /* $NetBSD: wsemul_dumb.c,v 1.7 2000/01/05 11:19:36 drochner Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  * 3. All advertising materials mentioning features or use of this software
        !            16:  *    must display the following acknowledgement:
        !            17:  *      This product includes software developed by Christopher G. Demetriou
        !            18:  *     for the NetBSD Project.
        !            19:  * 4. The name of the author may not be used to endorse or promote products
        !            20:  *    derived from this software without specific prior written permission
        !            21:  *
        !            22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            32:  */
        !            33:
        !            34: #include <sys/cdefs.h>
        !            35:
        !            36: #include <sys/param.h>
        !            37: #include <sys/systm.h>
        !            38: #include <sys/time.h>
        !            39: #include <sys/malloc.h>
        !            40: #include <sys/fcntl.h>
        !            41:
        !            42: #include <dev/wscons/wsconsio.h>
        !            43: #include <dev/wscons/wsdisplayvar.h>
        !            44: #include <dev/wscons/wsemulvar.h>
        !            45: #include <dev/wscons/ascii.h>
        !            46:
        !            47: void   *wsemul_dumb_cnattach(const struct wsscreen_descr *, void *,
        !            48:                                   int, int, long);
        !            49: void   *wsemul_dumb_attach(int console, const struct wsscreen_descr *,
        !            50:                                 void *, int, int, void *, long);
        !            51: void   wsemul_dumb_output(void *cookie, const u_char *data, u_int count,
        !            52:                                int);
        !            53: int    wsemul_dumb_translate(void *cookie, keysym_t, char **);
        !            54: void   wsemul_dumb_detach(void *cookie, u_int *crowp, u_int *ccolp);
        !            55: void   wsemul_dumb_resetop(void *, enum wsemul_resetops);
        !            56:
        !            57: const struct wsemul_ops wsemul_dumb_ops = {
        !            58:        "dumb",
        !            59:        wsemul_dumb_cnattach,
        !            60:        wsemul_dumb_attach,
        !            61:        wsemul_dumb_output,
        !            62:        wsemul_dumb_translate,
        !            63:        wsemul_dumb_detach,
        !            64:        wsemul_dumb_resetop
        !            65: };
        !            66:
        !            67: struct wsemul_dumb_emuldata {
        !            68:        const struct wsdisplay_emulops *emulops;
        !            69:        void *emulcookie;
        !            70:        void *cbcookie;
        !            71:        int crippled;
        !            72:        u_int nrows, ncols, crow, ccol;
        !            73:        long defattr;
        !            74: };
        !            75:
        !            76: struct wsemul_dumb_emuldata wsemul_dumb_console_emuldata;
        !            77:
        !            78: void *
        !            79: wsemul_dumb_cnattach(type, cookie, ccol, crow, defattr)
        !            80:        const struct wsscreen_descr *type;
        !            81:        void *cookie;
        !            82:        int ccol, crow;
        !            83:        long defattr;
        !            84: {
        !            85:        struct wsemul_dumb_emuldata *edp;
        !            86:        const struct wsdisplay_emulops *emulops;
        !            87:
        !            88:        edp = &wsemul_dumb_console_emuldata;
        !            89:
        !            90:        edp->emulops = emulops = type->textops;
        !            91:        edp->emulcookie = cookie;
        !            92:        edp->nrows = type->nrows;
        !            93:        edp->ncols = type->ncols;
        !            94:        edp->crow = crow;
        !            95:        edp->ccol = ccol;
        !            96:        edp->defattr = defattr;
        !            97:        edp->cbcookie = NULL;
        !            98:        edp->crippled = emulops->cursor == NULL ||
        !            99:            emulops->copycols == NULL || emulops->copyrows == NULL ||
        !           100:            emulops->erasecols == NULL || emulops->eraserows == NULL;
        !           101:
        !           102:        return (edp);
        !           103: }
        !           104:
        !           105: void *
        !           106: wsemul_dumb_attach(console, type, cookie, ccol, crow, cbcookie, defattr)
        !           107:        int console;
        !           108:        const struct wsscreen_descr *type;
        !           109:        void *cookie;
        !           110:        int ccol, crow;
        !           111:        void *cbcookie;
        !           112:        long defattr;
        !           113: {
        !           114:        struct wsemul_dumb_emuldata *edp;
        !           115:
        !           116:        if (console)
        !           117:                edp = &wsemul_dumb_console_emuldata;
        !           118:        else {
        !           119:                edp = malloc(sizeof *edp, M_DEVBUF, M_WAITOK);
        !           120:
        !           121:                edp->emulops = type->textops;
        !           122:                edp->emulcookie = cookie;
        !           123:                edp->nrows = type->nrows;
        !           124:                edp->ncols = type->ncols;
        !           125:                edp->crow = crow;
        !           126:                edp->ccol = ccol;
        !           127:                edp->defattr = defattr;
        !           128:        }
        !           129:
        !           130:        edp->cbcookie = cbcookie;
        !           131:
        !           132:        return (edp);
        !           133: }
        !           134:
        !           135: void
        !           136: wsemul_dumb_output(cookie, data, count, kernel)
        !           137:        void *cookie;
        !           138:        const u_char *data;
        !           139:        u_int count;
        !           140:        int kernel; /* ignored */
        !           141: {
        !           142:        struct wsemul_dumb_emuldata *edp = cookie;
        !           143:        u_char c;
        !           144:        int n;
        !           145:
        !           146:        if (edp->crippled) {
        !           147:                while (count-- > 0) {
        !           148:                        c = *data++;
        !           149:
        !           150:                        if (c == ASCII_BEL)
        !           151:                                wsdisplay_emulbell(edp->cbcookie);
        !           152:                        else
        !           153:                                (*edp->emulops->putchar)(edp->emulcookie, 0,
        !           154:                                    0, c, 0);
        !           155:                }
        !           156:                return;
        !           157:        }
        !           158:
        !           159:        /* XXX */
        !           160:        (*edp->emulops->cursor)(edp->emulcookie, 0, edp->crow, edp->ccol);
        !           161:        while (count-- > 0) {
        !           162:                c = *data++;
        !           163:
        !           164:                switch (c) {
        !           165:                case ASCII_BEL:
        !           166:                        wsdisplay_emulbell(edp->cbcookie);
        !           167:                        break;
        !           168:
        !           169:                case ASCII_BS:
        !           170:                        if (edp->ccol > 0)
        !           171:                                edp->ccol--;
        !           172:                        break;
        !           173:
        !           174:                case ASCII_CR:
        !           175:                        edp->ccol = 0;
        !           176:                        break;
        !           177:
        !           178:                case ASCII_HT:
        !           179:                        n = min(8 - (edp->ccol & 7),
        !           180:                            edp->ncols - edp->ccol - 1);
        !           181:                        (*edp->emulops->erasecols)(edp->emulcookie,
        !           182:                            edp->crow, edp->ccol, n, edp->defattr);
        !           183:                        edp->ccol += n;
        !           184:                        break;
        !           185:
        !           186:                case ASCII_FF:
        !           187:                        (*edp->emulops->eraserows)(edp->emulcookie, 0,
        !           188:                            edp->nrows, edp->defattr);
        !           189:                        edp->ccol = 0;
        !           190:                        edp->crow = 0;
        !           191:                        break;
        !           192:
        !           193:                case ASCII_VT:
        !           194:                        if (edp->crow > 0)
        !           195:                                edp->crow--;
        !           196:                        break;
        !           197:
        !           198:                default:
        !           199:                        (*edp->emulops->putchar)(edp->emulcookie, edp->crow,
        !           200:                            edp->ccol, c, edp->defattr);
        !           201:                        edp->ccol++;
        !           202:
        !           203:                        /* if cur col is still on cur line, done. */
        !           204:                        if (edp->ccol < edp->ncols)
        !           205:                                break;
        !           206:
        !           207:                        /* wrap the column around. */
        !           208:                        edp->ccol = 0;
        !           209:
        !           210:                        /* FALLTHROUGH */
        !           211:
        !           212:                case ASCII_LF:
        !           213:                        /* if the cur line isn't the last, incr and leave. */
        !           214:                        if (edp->crow < edp->nrows - 1) {
        !           215:                                edp->crow++;
        !           216:                                break;
        !           217:                        }
        !           218:                        n = 1;          /* number of lines to scroll */
        !           219:                        (*edp->emulops->copyrows)(edp->emulcookie, n, 0,
        !           220:                            edp->nrows - n);
        !           221:                        (*edp->emulops->eraserows)(edp->emulcookie,
        !           222:                            edp->nrows - n, n, edp->defattr);
        !           223:                        edp->crow -= n - 1;
        !           224:                        break;
        !           225:                }
        !           226:        }
        !           227:        /* XXX */
        !           228:        (*edp->emulops->cursor)(edp->emulcookie, 1, edp->crow, edp->ccol);
        !           229: }
        !           230:
        !           231: int
        !           232: wsemul_dumb_translate(cookie, in, out)
        !           233:        void *cookie;
        !           234:        keysym_t in;
        !           235:        char **out;
        !           236: {
        !           237:        return (0);
        !           238: }
        !           239:
        !           240: void
        !           241: wsemul_dumb_detach(cookie, crowp, ccolp)
        !           242:        void *cookie;
        !           243:        u_int *crowp, *ccolp;
        !           244: {
        !           245:        struct wsemul_dumb_emuldata *edp = cookie;
        !           246:
        !           247:        *crowp = edp->crow;
        !           248:        *ccolp = edp->ccol;
        !           249:        if (edp != &wsemul_dumb_console_emuldata)
        !           250:                free(edp, M_DEVBUF);
        !           251: }
        !           252:
        !           253: void
        !           254: wsemul_dumb_resetop(cookie, op)
        !           255:        void *cookie;
        !           256:        enum wsemul_resetops op;
        !           257: {
        !           258:        struct wsemul_dumb_emuldata *edp = cookie;
        !           259:
        !           260:        if (edp->crippled)
        !           261:                return;
        !           262:
        !           263:        switch (op) {
        !           264:        case WSEMUL_CLEARSCREEN:
        !           265:                (*edp->emulops->eraserows)(edp->emulcookie, 0, edp->nrows,
        !           266:                                           edp->defattr);
        !           267:                edp->ccol = edp->crow = 0;
        !           268:                (*edp->emulops->cursor)(edp->emulcookie, 1, 0, 0);
        !           269:                break;
        !           270:        default:
        !           271:                break;
        !           272:        }
        !           273: }

CVSweb