diff options
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/pcdisplay_subr.c | 43 | ||||
| -rw-r--r-- | sys/dev/ic/pcdisplayvar.h | 3 | ||||
| -rw-r--r-- | sys/dev/ic/vga.c | 23 | ||||
| -rw-r--r-- | sys/dev/wscons/files.wscons | 6 | ||||
| -rw-r--r-- | sys/dev/wscons/wsconsio.h | 10 | ||||
| -rw-r--r-- | sys/dev/wscons/wsdisplay.c | 31 | ||||
| -rw-r--r-- | sys/dev/wscons/wsdisplayvar.h | 39 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_sun.c | 6 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_vt100.c | 195 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_vt100_chars.c | 5 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_vt100_keys.c | 5 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_vt100_subr.c | 23 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemul_vt100var.h | 3 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemulconf.c | 5 | ||||
| -rw-r--r-- | sys/dev/wscons/wsemulvar.h | 5 |
15 files changed, 323 insertions, 79 deletions
diff --git a/sys/dev/ic/pcdisplay_subr.c b/sys/dev/ic/pcdisplay_subr.c index 74213f967bf..86ca0daf48f 100644 --- a/sys/dev/ic/pcdisplay_subr.c +++ b/sys/dev/ic/pcdisplay_subr.c @@ -1,4 +1,4 @@ -/* $NetBSD: pcdisplay_subr.c,v 1.26 2004/05/28 21:42:29 christos Exp $ */ +/* $NetBSD: pcdisplay_subr.c,v 1.27 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1995, 1996 Carnegie-Mellon University. @@ -28,7 +28,10 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pcdisplay_subr.c,v 1.26 2004/05/28 21:42:29 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pcdisplay_subr.c,v 1.27 2004/07/28 12:34:04 jmmv Exp $"); + +#include "opt_wsdisplay_compat.h" /* for WSDISPLAY_CHARFUNCS */ +#include "opt_wsmsgattrs.h" /* for WSDISPLAY_CUSTOM_OUTPUT */ #include <sys/param.h> #include <sys/systm.h> @@ -41,8 +44,6 @@ __KERNEL_RCSID(0, "$NetBSD: pcdisplay_subr.c,v 1.26 2004/05/28 21:42:29 christos #include <dev/wscons/wsdisplayvar.h> -#include "opt_wsdisplay_compat.h" /* for WSDISPLAY_CHARFUNCS */ - void pcdisplay_cursor_init(scr, existing) struct pcdisplayscreen *scr; @@ -278,6 +279,40 @@ pcdisplay_eraserows(id, startrow, nrows, fillattr) scr->mem[off + i] = val; } +#ifdef WSDISPLAY_CUSTOM_OUTPUT +void +pcdisplay_replaceattr(id, oldattr, newattr) + void *id; + long oldattr, newattr; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + int off; + uint16_t chardata; + + if (scr->active) + for (off = 0; off < scr->type->nrows * scr->type->ncols; + off++) { + chardata = bus_space_read_2(memt, memh, + scr->dispoffset + off * 2); + if ((long)(chardata >> 8) == oldattr) + bus_space_write_2(memt, memh, + scr->dispoffset + off * 2, + ((u_int16_t)(newattr << 8)) | + (chardata & 0x00FF)); + } + else + for (off = 0; off < scr->type->nrows * scr->type->ncols; + off++) { + chardata = scr->mem[off]; + if ((long)(chardata >> 8) == oldattr) + scr->mem[off] = ((u_int16_t)(newattr << 8)) | + (chardata & 0x00FF); + } +} +#endif /* WSDISPLAY_CUSTOM_OUTPUT */ + #ifdef WSDISPLAY_CHARFUNCS int pcdisplay_getwschar(id, wschar) diff --git a/sys/dev/ic/pcdisplayvar.h b/sys/dev/ic/pcdisplayvar.h index 28ac8e6215f..11415421a71 100644 --- a/sys/dev/ic/pcdisplayvar.h +++ b/sys/dev/ic/pcdisplayvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: pcdisplayvar.h,v 1.13 2004/05/28 21:42:29 christos Exp $ */ +/* $NetBSD: pcdisplayvar.h,v 1.14 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -88,6 +88,7 @@ void pcdisplay_copycols(void *, int, int, int,int); void pcdisplay_erasecols(void *, int, int, int, long); void pcdisplay_copyrows(void *, int, int, int); void pcdisplay_eraserows(void *, int, int, long); +void pcdisplay_replaceattr(void *, long, long); struct wsdisplay_char; int pcdisplay_getwschar(void *, struct wsdisplay_char *); int pcdisplay_putwschar(void *, struct wsdisplay_char *); diff --git a/sys/dev/ic/vga.c b/sys/dev/ic/vga.c index f4e3cb87555..9fd61a19a5f 100644 --- a/sys/dev/ic/vga.c +++ b/sys/dev/ic/vga.c @@ -1,4 +1,4 @@ -/* $NetBSD: vga.c,v 1.74 2004/05/29 02:04:56 christos Exp $ */ +/* $NetBSD: vga.c,v 1.75 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1995, 1996 Carnegie-Mellon University. @@ -27,8 +27,13 @@ * rights to redistribute these changes. */ +/* for WSCONS_SUPPORT_PCVTFONTS and WSDISPLAY_CHARFUNCS */ +#include "opt_wsdisplay_compat.h" +/* for WSDISPLAY_CUSTOM_OUTPUT */ +#include "opt_wsmsgattrs.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vga.c,v 1.74 2004/05/29 02:04:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vga.c,v 1.75 2004/07/28 12:34:04 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -51,9 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: vga.c,v 1.74 2004/05/29 02:04:56 christos Exp $"); #include <dev/ic/pcdisplay.h> -/* for WSCONS_SUPPORT_PCVTFONTS and WSDISPLAY_CHARFUNCS */ -#include "opt_wsdisplay_compat.h" - int vga_no_builtinfont = 0; static struct wsdisplay_font _vga_builtinfont = { @@ -134,7 +136,12 @@ const struct wsdisplay_emulops vga_emulops = { pcdisplay_erasecols, vga_copyrows, pcdisplay_eraserows, - vga_allocattr + vga_allocattr, +#ifdef WSDISPLAY_CUSTOM_OUTPUT + pcdisplay_replaceattr, +#else + NULL, +#endif }; /* @@ -476,6 +483,10 @@ vga_init_screen(struct vga_config *vc, struct vgascreen *scr, if (!vc->hdl.vh_mono) /* * DEC firmware uses a blue background. + * XXX These should be specified as kernel options for + * XXX alpha only, not hardcoded here (which is wrong + * XXX anyway because the emulation layer will assume + * XXX the default attribute is white on black). */ res = vga_allocattr(scr, WSCOL_WHITE, WSCOL_BLUE, WSATTR_WSCOLORS, attrp); diff --git a/sys/dev/wscons/files.wscons b/sys/dev/wscons/files.wscons index deeb698ffb2..21da2baeee5 100644 --- a/sys/dev/wscons/files.wscons +++ b/sys/dev/wscons/files.wscons @@ -1,4 +1,4 @@ -# $NetBSD: files.wscons,v 1.30 2004/05/28 21:42:29 christos Exp $ +# $NetBSD: files.wscons,v 1.31 2004/07/28 12:34:04 jmmv Exp $ # # "Workstation Console" glue; attaches frame buffer to emulator & keyboard, @@ -14,8 +14,10 @@ defparam opt_wsemul.h WSEMUL_DEFAULT defflag opt_wsemul.h WSEMUL_NO_DUMB WSEMUL_SUN WSEMUL_VT100 -defparam opt_wskernattr.h WS_KERNEL_FG WS_KERNEL_BG +defparam opt_wsmsgattrs.h WS_DEFAULT_COLATTR WS_DEFAULT_MONOATTR + WS_DEFAULT_BG WS_DEFAULT_FG WS_KERNEL_COLATTR WS_KERNEL_MONOATTR + WS_KERNEL_BG WS_KERNEL_FG WSDISPLAY_SCROLLCOMBO defparam opt_wsemul.h WSEMUL_VT100_HILIT_FG WSEMUL_VT100_UNDERLINE_FG WSEMUL_VT100_HILIT_BG WSEMUL_VT100_UNDERLINE_BG diff --git a/sys/dev/wscons/wsconsio.h b/sys/dev/wscons/wsconsio.h index 692fcd6b043..2d15b5ed4f7 100644 --- a/sys/dev/wscons/wsconsio.h +++ b/sys/dev/wscons/wsconsio.h @@ -1,4 +1,4 @@ -/* $NetBSD: wsconsio.h,v 1.67 2004/07/20 20:28:20 heas Exp $ */ +/* $NetBSD: wsconsio.h,v 1.68 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -443,6 +443,14 @@ struct wsdisplay_scroll_data { #define WSDISPLAYIO_DGSCROLL _IOR('W', 87, struct wsdisplay_scroll_data) #define WSDISPLAYIO_DSSCROLL _IOW('W', 88, struct wsdisplay_scroll_data) +struct wsdisplay_msgattrs { + int default_attrs, default_bg, default_fg; + int kernel_attrs, kernel_bg, kernel_fg; +}; + +#define WSDISPLAYIO_GMSGATTRS _IOR('W', 89, struct wsdisplay_msgattrs) +#define WSDISPLAYIO_SMSGATTRS _IOW('W', 90, struct wsdisplay_msgattrs) + /* XXX NOT YET DEFINED */ /* Mapping information retrieval. */ diff --git a/sys/dev/wscons/wsdisplay.c b/sys/dev/wscons/wsdisplay.c index 02db43a8d1a..7920c50850f 100644 --- a/sys/dev/wscons/wsdisplay.c +++ b/sys/dev/wscons/wsdisplay.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplay.c,v 1.79 2004/07/20 20:28:20 heas Exp $ */ +/* $NetBSD: wsdisplay.c,v 1.80 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -31,9 +31,10 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,v 1.79 2004/07/20 20:28:20 heas Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsdisplay.c,v 1.80 2004/07/28 12:34:04 jmmv Exp $"); #include "opt_wsdisplay_compat.h" +#include "opt_wsmsgattrs.h" #include "opt_compat_netbsd.h" #include "wskbd.h" #include "wsmux.h" @@ -1151,6 +1152,32 @@ wsdisplay_internal_ioctl(struct wsdisplay_softc *sc, struct wsscreen *scr, return ENODEV; #endif /* WSDISPLAY_CHARFUNCS */ +#ifdef WSDISPLAY_CUSTOM_OUTPUT + case WSDISPLAYIO_GMSGATTRS: +#define d ((struct wsdisplay_msgattrs *)data) + (*scr->scr_dconf->wsemul->getmsgattrs) + (scr->scr_dconf->wsemulcookie, d); + return (0); +#undef d + + case WSDISPLAYIO_SMSGATTRS: { +#define d ((struct wsdisplay_msgattrs *)data) + int i; + for (i = 0; i < WSDISPLAY_MAXSCREEN; i++) + if (sc->sc_scr[i] != NULL) + (*sc->sc_scr[i]->scr_dconf->wsemul->setmsgattrs) + (sc->sc_scr[i]->scr_dconf->wsemulcookie, + sc->sc_scr[i]->scr_dconf->scrdata, + d); + } + return (0); +#undef d +#else + case WSDISPLAYIO_GMSGATTRS: + case WSDISPLAYIO_SMSGATTRS: + return (ENODEV); +#endif + } /* check ioctls for display */ diff --git a/sys/dev/wscons/wsdisplayvar.h b/sys/dev/wscons/wsdisplayvar.h index b5af20276e6..c4ce3edc926 100644 --- a/sys/dev/wscons/wsdisplayvar.h +++ b/sys/dev/wscons/wsdisplayvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplayvar.h,v 1.27 2004/05/28 22:38:28 christos Exp $ */ +/* $NetBSD: wsdisplayvar.h,v 1.28 2004/07/28 12:34:04 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -73,6 +73,7 @@ struct wsdisplay_emulops { #define WSATTR_UNDERLINE 8 #define WSATTR_WSCOLORS 16 /* XXX need a free_attr() ??? */ + void (*replaceattr)(void *c, long oldattr, long newattr); }; struct wsscreen_descr { @@ -215,3 +216,39 @@ int wsdisplay_stat_inject(struct device *dev, u_int type, int value); void wsdisplay_switchtoconsole(void); const struct wsscreen_descr * wsdisplay_screentype_pick(const struct wsscreen_list *, const char *); + +#if defined(_KERNEL) +# if defined(_KERNEL_OPT) +# include "opt_wsmsgattrs.h" +# endif +# if !defined(WS_DEFAULT_FG) +# define WS_DEFAULT_FG WSCOL_WHITE +# endif +# if !defined(WS_DEFAULT_BG) +# define WS_DEFAULT_BG WSCOL_BLACK +# endif +# if !defined(WS_DEFAULT_COLATTR) +# define WS_DEFAULT_COLATTR 0 +# endif +# if !defined(WS_DEFAULT_MONOATTR) +# define WS_DEFAULT_MONOATTR 0 +# endif +# if defined(WS_KERNEL_FG) || defined(WS_KERNEL_BG) || \ + defined(WS_KERNEL_COLATTR) || defined(WS_KERNEL_MONOATTR) +# define WS_KERNEL_CUSTOMIZED +# else +# undef WS_KERNEL_CUSTOMIZED +# endif +# if !defined(WS_KERNEL_FG) +# define WS_KERNEL_FG WS_DEFAULT_FG +# endif +# if !defined(WS_KERNEL_BG) +# define WS_KERNEL_BG WS_DEFAULT_BG +# endif +# if !defined(WS_KERNEL_COLATTR) +# define WS_KERNEL_COLATTR WS_DEFAULT_COLATTR +# endif +# if !defined(WS_KERNEL_MONOATTR) +# define WS_KERNEL_MONOATTR WS_DEFAULT_MONOATTR +# endif +#endif /* _KERNEL */ diff --git a/sys/dev/wscons/wsemul_sun.c b/sys/dev/wscons/wsemul_sun.c index aab94f6c714..bd9efc7a46f 100644 --- a/sys/dev/wscons/wsemul_sun.c +++ b/sys/dev/wscons/wsemul_sun.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_sun.c,v 1.17 2002/09/27 15:37:40 provos Exp $ */ +/* $NetBSD: wsemul_sun.c,v 1.18 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -33,7 +33,7 @@ /* XXX DESCRIPTION/SOURCE OF INFORMATION */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_sun.c,v 1.17 2002/09/27 15:37:40 provos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_sun.c,v 1.18 2004/07/28 12:34:05 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -47,7 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: wsemul_sun.c,v 1.17 2002/09/27 15:37:40 provos Exp $ #include <dev/wscons/wsksymdef.h> #include <dev/wscons/ascii.h> -#include "opt_wskernattr.h" +#include "opt_wsmsgattrs.h" void *wsemul_sun_cnattach(const struct wsscreen_descr *, void *, int, int, long); diff --git a/sys/dev/wscons/wsemul_vt100.c b/sys/dev/wscons/wsemul_vt100.c index f7d506cac71..9b524e4ed5b 100644 --- a/sys/dev/wscons/wsemul_vt100.c +++ b/sys/dev/wscons/wsemul_vt100.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100.c,v 1.25 2004/03/24 17:26:53 drochner Exp $ */ +/* $NetBSD: wsemul_vt100.c,v 1.26 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -27,7 +27,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100.c,v 1.25 2004/03/24 17:26:53 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100.c,v 1.26 2004/07/28 12:34:05 jmmv Exp $"); + +#include "opt_wsmsgattrs.h" #include <sys/param.h> #include <sys/systm.h> @@ -41,8 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: wsemul_vt100.c,v 1.25 2004/03/24 17:26:53 drochner E #include <dev/wscons/wsemul_vt100var.h> #include <dev/wscons/ascii.h> -#include "opt_wskernattr.h" - void *wsemul_vt100_cnattach(const struct wsscreen_descr *, void *, int, int, long); void *wsemul_vt100_attach(int console, const struct wsscreen_descr *, @@ -50,6 +50,11 @@ void *wsemul_vt100_attach(int console, const struct wsscreen_descr *, void wsemul_vt100_output(void *cookie, const u_char *data, u_int count, int); void wsemul_vt100_detach(void *cookie, u_int *crowp, u_int *ccolp); void wsemul_vt100_resetop(void *, enum wsemul_resetops); +#ifdef WSDISPLAY_CUSTOM_OUTPUT +static void wsemul_vt100_getmsgattrs(void *, struct wsdisplay_msgattrs *); +static void wsemul_vt100_setmsgattrs(void *, const struct wsscreen_descr *, + const struct wsdisplay_msgattrs *); +#endif /* WSDISPLAY_CUSTOM_OUTPUT */ const struct wsemul_ops wsemul_vt100_ops = { "vt100", @@ -58,7 +63,14 @@ const struct wsemul_ops wsemul_vt100_ops = { wsemul_vt100_output, wsemul_vt100_translate, wsemul_vt100_detach, - wsemul_vt100_resetop + wsemul_vt100_resetop, +#ifdef WSDISPLAY_CUSTOM_OUTPUT + wsemul_vt100_getmsgattrs, + wsemul_vt100_setmsgattrs, +#else + NULL, + NULL, +#endif }; struct wsemul_vt100_emuldata wsemul_vt100_console_emuldata; @@ -122,6 +134,8 @@ wsemul_vt100_init(struct wsemul_vt100_emuldata *edp, const struct wsscreen_descr *type, void *cookie, int ccol, int crow, long defattr) { + int error; + edp->emulops = type->textops; edp->emulcookie = cookie; edp->scrcapabilities = type->capabilities; @@ -129,7 +143,64 @@ wsemul_vt100_init(struct wsemul_vt100_emuldata *edp, edp->ncols = type->ncols; edp->crow = crow; edp->ccol = ccol; - edp->defattr = defattr; + + /* The underlying driver has already allocated a default and simple + * attribute for us, which is stored in defattr. We try to set the + * values specified by the kernel options below, but in case of + * failure we fallback to the value given by the driver. */ + + if (type->capabilities & WSSCREEN_WSCOLORS) { + edp->msgattrs.default_attrs = WS_DEFAULT_COLATTR | + WSATTR_WSCOLORS; + edp->msgattrs.default_bg = WS_DEFAULT_BG; + edp->msgattrs.default_fg = WS_DEFAULT_FG; + + edp->msgattrs.kernel_attrs = WS_KERNEL_COLATTR | + WSATTR_WSCOLORS; + edp->msgattrs.kernel_bg = WS_KERNEL_BG; + edp->msgattrs.kernel_fg = WS_KERNEL_FG; + } else { + edp->msgattrs.default_attrs = WS_DEFAULT_MONOATTR; + edp->msgattrs.default_bg = edp->msgattrs.default_fg = 0; + + edp->msgattrs.kernel_attrs = WS_KERNEL_MONOATTR; + edp->msgattrs.kernel_bg = edp->msgattrs.kernel_fg = 0; + } + + error = (*edp->emulops->allocattr)(cookie, + edp->msgattrs.default_fg, + edp->msgattrs.default_bg, + edp->msgattrs.default_attrs, + &edp->defattr); + if (error) { + edp->defattr = defattr; + /* XXX This assumes the driver has allocated white on black + * XXX as the default attribute, which is not always true. + * XXX Maybe we need an emulop that, given an attribute, + * XXX (defattr) returns its flags and colors? */ + edp->msgattrs.default_attrs = 0; + edp->msgattrs.default_bg = WSCOL_BLACK; + edp->msgattrs.default_fg = WSCOL_WHITE; + } else { + if (edp->emulops->replaceattr != NULL) + (*edp->emulops->replaceattr)(cookie, defattr, + edp->defattr); + } + +#if defined(WS_KERNEL_CUSTOMIZED) + /* Set up kernel colors, in case they were customized by the user; + * otherwise default to the colors specified for the console. + * In case of failure, we use console colors too; we can assume + * they are good as they have been previously allocated and + * verified. */ + error = (*edp->emulops->allocattr)(cookie, + edp->msgattrs.kernel_fg, + edp->msgattrs.kernel_bg, + edp->msgattrs.kernel_attrs, + &edp->kernattr); + if (error) +#endif + edp->kernattr = edp->defattr; } void * @@ -137,10 +208,6 @@ wsemul_vt100_cnattach(const struct wsscreen_descr *type, void *cookie, int ccol, int crow, long defattr) { struct wsemul_vt100_emuldata *edp; -#if defined(WS_KERNEL_FG) || defined(WS_KERNEL_BG) || \ - defined(WS_KERNEL_COLATTR) || defined(WS_KERNEL_MONOATTR) - int res; -#endif edp = &wsemul_vt100_console_emuldata; wsemul_vt100_init(edp, type, cookie, ccol, crow, defattr); @@ -149,33 +216,6 @@ wsemul_vt100_cnattach(const struct wsscreen_descr *type, void *cookie, #endif edp->cbcookie = NULL; -#if defined(WS_KERNEL_FG) || defined(WS_KERNEL_BG) || \ - defined(WS_KERNEL_COLATTR) || defined(WS_KERNEL_MONOATTR) -#ifndef WS_KERNEL_FG -#define WS_KERNEL_FG WSCOL_WHITE -#endif -#ifndef WS_KERNEL_BG -#define WS_KERNEL_BG WSCOL_BLACK -#endif -#ifndef WS_KERNEL_COLATTR -#define WS_KERNEL_COLATTR 0 -#endif -#ifndef WS_KERNEL_MONOATTR -#define WS_KERNEL_MONOATTR 0 -#endif - if (type->capabilities & WSSCREEN_WSCOLORS) - res = (*edp->emulops->allocattr)(cookie, - WS_KERNEL_FG, WS_KERNEL_BG, - WS_KERNEL_COLATTR | WSATTR_WSCOLORS, - &edp->kernattr); - else - res = (*edp->emulops->allocattr)(cookie, 0, 0, - WS_KERNEL_MONOATTR, - &edp->kernattr); - if (res) -#endif - edp->kernattr = defattr; - edp->tabs = 0; edp->dblwid = 0; edp->dw = 0; @@ -270,9 +310,9 @@ wsemul_vt100_reset(struct wsemul_vt100_emuldata *edp) edp->state = VT100_EMUL_STATE_NORMAL; edp->flags = VTFL_DECAWM | VTFL_CURSORON; edp->bkgdattr = edp->curattr = edp->defattr; - edp->attrflags = 0; - edp->fgcol = WSCOL_WHITE; - edp->bgcol = WSCOL_BLACK; + edp->attrflags = edp->msgattrs.default_attrs; + edp->fgcol = edp->msgattrs.default_fg; + edp->bgcol = edp->msgattrs.default_bg; edp->scrreg_startrow = 0; edp->scrreg_nrows = edp->nrows; if (edp->tabs) { @@ -939,3 +979,78 @@ wsemul_vt100_output(void *cookie, const u_char *data, u_int count, int kernel) (*edp->emulops->cursor)(edp->emulcookie, 1, edp->crow, edp->ccol << edp->dw); } + +#ifdef WSDISPLAY_CUSTOM_OUTPUT +static void +wsemul_vt100_getmsgattrs(void *cookie, struct wsdisplay_msgattrs *ma) +{ + struct wsemul_vt100_emuldata *edp = cookie; + + *ma = edp->msgattrs; +} + +static void +wsemul_vt100_setmsgattrs(void *cookie, const struct wsscreen_descr *type, + const struct wsdisplay_msgattrs *ma) +{ + int error; + long tmp; + struct wsemul_vt100_emuldata *edp = cookie; + + edp->msgattrs = *ma; + if (type->capabilities & WSSCREEN_WSCOLORS) { + edp->msgattrs.default_attrs |= WSATTR_WSCOLORS; + edp->msgattrs.kernel_attrs |= WSATTR_WSCOLORS; + } else { + edp->msgattrs.default_bg = edp->msgattrs.kernel_bg = 0; + edp->msgattrs.default_fg = edp->msgattrs.kernel_fg = 0; + } + + error = (*edp->emulops->allocattr)(edp->emulcookie, + edp->msgattrs.default_fg, + edp->msgattrs.default_bg, + edp->msgattrs.default_attrs, + &tmp); +#ifdef VT100_DEBUG + if (error) + printf("vt100: failed to allocate attribute for default " + "messages\n"); + else +#endif + { + if (edp->curattr == edp->defattr) { + edp->bkgdattr = edp->curattr = tmp; + edp->attrflags = edp->msgattrs.default_attrs; + edp->bgcol = edp->msgattrs.default_bg; + edp->fgcol = edp->msgattrs.default_fg; + } else { + edp->savedbkgdattr = edp->savedattr = tmp; + edp->savedattrflags = edp->msgattrs.default_attrs; + edp->savedbgcol = edp->msgattrs.default_bg; + edp->savedfgcol = edp->msgattrs.default_fg; + } + if (edp->emulops->replaceattr != NULL) + (*edp->emulops->replaceattr)(edp->emulcookie, + edp->defattr, tmp); + edp->defattr = tmp; + } + + error = (*edp->emulops->allocattr)(edp->emulcookie, + edp->msgattrs.kernel_fg, + edp->msgattrs.kernel_bg, + edp->msgattrs.kernel_attrs, + &tmp); +#ifdef VT100_DEBUG + if (error) + printf("vt100: failed to allocate attribute for kernel " + "messages\n"); + else +#endif + { + if (edp->emulops->replaceattr != NULL) + (*edp->emulops->replaceattr)(edp->emulcookie, + edp->kernattr, tmp); + edp->kernattr = tmp; + } +} +#endif /* WSDISPLAY_CUSTOM_OUTPUT */ diff --git a/sys/dev/wscons/wsemul_vt100_chars.c b/sys/dev/wscons/wsemul_vt100_chars.c index fa3b41674e6..d845a295e5a 100644 --- a/sys/dev/wscons/wsemul_vt100_chars.c +++ b/sys/dev/wscons/wsemul_vt100_chars.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100_chars.c,v 1.9 2004/03/24 17:26:53 drochner Exp $ */ +/* $NetBSD: wsemul_vt100_chars.c,v 1.10 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -27,10 +27,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_chars.c,v 1.9 2004/03/24 17:26:53 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_chars.c,v 1.10 2004/07/28 12:34:05 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <dev/wscons/wsconsio.h> #include <dev/wscons/wsdisplayvar.h> #include <dev/wscons/wsksymvar.h> #include <dev/wscons/wsemulvar.h> diff --git a/sys/dev/wscons/wsemul_vt100_keys.c b/sys/dev/wscons/wsemul_vt100_keys.c index 5a739c55937..3d13a7d3b7a 100644 --- a/sys/dev/wscons/wsemul_vt100_keys.c +++ b/sys/dev/wscons/wsemul_vt100_keys.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100_keys.c,v 1.6 2004/03/24 17:26:53 drochner Exp $ */ +/* $NetBSD: wsemul_vt100_keys.c,v 1.7 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -27,11 +27,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_keys.c,v 1.6 2004/03/24 17:26:53 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_keys.c,v 1.7 2004/07/28 12:34:05 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <dev/wscons/wsconsio.h> #include <dev/wscons/wsdisplayvar.h> #include <dev/wscons/wsksymvar.h> #include <dev/wscons/wsksymdef.h> diff --git a/sys/dev/wscons/wsemul_vt100_subr.c b/sys/dev/wscons/wsemul_vt100_subr.c index 5abaecdb715..71eeea3c610 100644 --- a/sys/dev/wscons/wsemul_vt100_subr.c +++ b/sys/dev/wscons/wsemul_vt100_subr.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100_subr.c,v 1.16 2004/04/23 21:29:16 itojun Exp $ */ +/* $NetBSD: wsemul_vt100_subr.c,v 1.17 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -27,11 +27,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_subr.c,v 1.16 2004/04/23 21:29:16 itojun Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100_subr.c,v 1.17 2004/07/28 12:34:05 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <dev/wscons/wsconsio.h> #include <dev/wscons/wsksymvar.h> #include <dev/wscons/wsdisplayvar.h> #include <dev/wscons/wsemulvar.h> @@ -474,14 +475,14 @@ wsemul_vt100_handle_csi(struct wsemul_vt100_emuldata *edp, u_char c) case 0: /* reset */ if (n == edp->nargs - 1) { edp->bkgdattr = edp->curattr = edp->defattr; - edp->attrflags = 0; - edp->fgcol = WSCOL_WHITE; - edp->bgcol = WSCOL_BLACK; + edp->attrflags = edp->msgattrs.default_attrs; + edp->fgcol = edp->msgattrs.default_fg; + edp->bgcol = edp->msgattrs.default_bg; return; } - flags = 0; - fgcol = WSCOL_WHITE; - bgcol = WSCOL_BLACK; + flags = edp->msgattrs.default_attrs; + fgcol = edp->msgattrs.default_fg; + bgcol = edp->msgattrs.default_bg; break; case 1: /* bold */ flags |= WSATTR_HILIT; @@ -622,13 +623,13 @@ vt100_selectattribute(struct wsemul_vt100_emuldata *edp, { int error; - if ((flags & WSATTR_WSCOLORS) && - !(edp->scrcapabilities & WSSCREEN_WSCOLORS)) { + if (!(edp->scrcapabilities & WSSCREEN_WSCOLORS)) { flags &= ~WSATTR_WSCOLORS; #ifdef VT100_DEBUG printf("colors ignored (impossible)\n"); #endif - } + } else + flags |= WSATTR_WSCOLORS; error = (*edp->emulops->allocattr)(edp->emulcookie, fgcol, bgcol, flags & WSATTR_WSCOLORS, bkgdattr); if (error) diff --git a/sys/dev/wscons/wsemul_vt100var.h b/sys/dev/wscons/wsemul_vt100var.h index a4a039057b8..08e8be573c3 100644 --- a/sys/dev/wscons/wsemul_vt100var.h +++ b/sys/dev/wscons/wsemul_vt100var.h @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100var.h,v 1.8 2004/03/24 17:26:53 drochner Exp $ */ +/* $NetBSD: wsemul_vt100var.h,v 1.9 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1998 @@ -33,6 +33,7 @@ struct wsemul_vt100_emuldata { void *emulcookie; int scrcapabilities; u_int nrows, ncols, crow, ccol; + struct wsdisplay_msgattrs msgattrs; long defattr; /* default attribute */ long kernattr; /* attribute for kernel output */ diff --git a/sys/dev/wscons/wsemulconf.c b/sys/dev/wscons/wsemulconf.c index 5a21bf5699f..2b14db15450 100644 --- a/sys/dev/wscons/wsemulconf.c +++ b/sys/dev/wscons/wsemulconf.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsemulconf.c,v 1.5 2001/10/13 15:56:16 augustss Exp $ */ +/* $NetBSD: wsemulconf.c,v 1.6 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -31,11 +31,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemulconf.c,v 1.5 2001/10/13 15:56:16 augustss Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemulconf.c,v 1.6 2004/07/28 12:34:05 jmmv Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <dev/wscons/wsconsio.h> #include <dev/wscons/wsdisplayvar.h> #include <dev/wscons/wsksymvar.h> #include <dev/wscons/wsemulvar.h> /* pulls in opt_wsemul.h */ diff --git a/sys/dev/wscons/wsemulvar.h b/sys/dev/wscons/wsemulvar.h index 63f61165584..b2849958a32 100644 --- a/sys/dev/wscons/wsemulvar.h +++ b/sys/dev/wscons/wsemulvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: wsemulvar.h,v 1.8 2001/10/13 15:56:16 augustss Exp $ */ +/* $NetBSD: wsemulvar.h,v 1.9 2004/07/28 12:34:05 jmmv Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -50,6 +50,9 @@ struct wsemul_ops { int (*translate)(void *, keysym_t, char **); void (*detach)(void *cookie, u_int *crow, u_int *ccol); void (*reset)(void *, enum wsemul_resetops); + void (*getmsgattrs)(void *, struct wsdisplay_msgattrs *); + void (*setmsgattrs)(void *, const struct wsscreen_descr *, + const struct wsdisplay_msgattrs *); }; #if defined(_KERNEL_OPT) |
