summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/pcdisplay_subr.c43
-rw-r--r--sys/dev/ic/pcdisplayvar.h3
-rw-r--r--sys/dev/ic/vga.c23
-rw-r--r--sys/dev/wscons/files.wscons6
-rw-r--r--sys/dev/wscons/wsconsio.h10
-rw-r--r--sys/dev/wscons/wsdisplay.c31
-rw-r--r--sys/dev/wscons/wsdisplayvar.h39
-rw-r--r--sys/dev/wscons/wsemul_sun.c6
-rw-r--r--sys/dev/wscons/wsemul_vt100.c195
-rw-r--r--sys/dev/wscons/wsemul_vt100_chars.c5
-rw-r--r--sys/dev/wscons/wsemul_vt100_keys.c5
-rw-r--r--sys/dev/wscons/wsemul_vt100_subr.c23
-rw-r--r--sys/dev/wscons/wsemul_vt100var.h3
-rw-r--r--sys/dev/wscons/wsemulconf.c5
-rw-r--r--sys/dev/wscons/wsemulvar.h5
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)