summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorjmmv <jmmv@NetBSD.org>2004-07-28 12:34:02 +0000
committerjmmv <jmmv@NetBSD.org>2004-07-28 12:34:02 +0000
commit92f81ea7d3230a3390fd962f3788dcdcbc17ddd2 (patch)
treea12e9fc1ac5ff154d36f8fd820431df8e485879b /sys/dev
parent3f5c400809f99ead824e182465a941b3fcad41c1 (diff)
Implement support to dynamically change wscons console and kernel colors.
Two new ioctls are added to the wsdisplay device, named WSDISPLAY_GMSGATTRS and WSDISPLAY_SMSGATTRS, used to retrieve the actual values and set them, respectively (the name, if you are wondering, comes from "message attributes"). A new emulop is added to the underlying display driver (only vga, for now) which sets the new attribute for the whole screen, without having to clear it. This is optional, which means that this also works with other drivers that don't have this new operation. Five new kernel options have been added, although only documented in i386 kernels (for now): - WSDISPLAY_CUSTOM_OUTPUT, which enables the ioctls described above to change the colors dynamically from userland. This is enabled by default in the GENERIC kernel (as well as others) but disabled on all INSTALL* kernels (as this feature is useless there). - WS_DEFAULT_COLATTR, WS_DEFAULT_MONOATTR, WS_DEFAULT_BG and WS_DEFAULT_FG, which specify the default colors for the console at boot time. These have the same meaning as the (already existing) WS_KERNEL_* variables. wsconsctl is modified to add msg.default.{attrs,bg,fg} and msg.kernel.{attrs,bg,fg} to the display part, so that colors can be changed after boot. Tested on NetBSD/i386 with vga (and vga in mono mode), and on NetBSD/mac68k. No objections in tech-kern@.
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)