Fix many long-standing bugs and problems with pcvt, namely:

. make pccncheck() work even when interrupts are disabled, so the
  ``Press a key on the console...'' procedure will work,
. make kernel colors #ifndef, so they can be overridden from the
  config file,
. use shutdown_nice() instead of cpu_reset() if Ctrl-Alt-Del is
  enabled,
. allow pccngetc() to return more than a single character, so the
  arrow keys will work (and thus visual UserConfig!),
. fix a warning.

This closes all know PRs related to pcvt, in particular #845, #1236,
and #1265.  PR #991 is a duplicate for 845, and PR #1283 has already
been fixed earlier in rev 1.11 of pcvt_conf.h.

Submitted by:	Ulf Kieber (kieber@sax.de), for the kernel color fix
This commit is contained in:
Joerg Wunsch 1996-08-10 22:14:36 +00:00
parent b458c95f75
commit fae988778b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=17504
4 changed files with 40 additions and 19 deletions

View File

@ -460,12 +460,18 @@
* emphasize messages from the kernel on color and mono displays.
*---------------------------------------------------------------------------*/
/* color displays */
#if !defined COLOR_KERNEL_FG /* color displays */
#define COLOR_KERNEL_FG FG_LIGHTGREY /* kernel messages, foreground */
#endif
#if !defined COLOR_KERNEL_BG
#define COLOR_KERNEL_BG BG_RED /* kernel messages, background */
#endif
/* monochrome displays */
#if !defined MONO_KERNEL_FG /* monochrome displays */
#define MONO_KERNEL_FG FG_UNDERLINE /* kernel messages, foreground */
#endif
#if !defined MONO_KERNEL_BG
#define MONO_KERNEL_BG BG_BLACK /* kernel messages, background */
#endif
/*---------------------------------- E O F ----------------------------------*/

View File

@ -1207,7 +1207,7 @@ int
pccngetc(Dev_t dev)
{
register int s;
register u_char *cp;
static u_char *cp;
#ifdef XSERVER
@ -1221,24 +1221,39 @@ pccngetc(Dev_t dev)
#endif /* XSERVER */
if (cp && *cp)
/*
* We still have a pending key sequence, e.g.
* from an arrow key. Deliver this one first.
*/
return (*cp++);
s = spltty(); /* block pcrint while we poll */
kbd_polling = 1;
cp = sgetc(0);
kbd_polling = 0;
splx(s);
#if ! (PCVT_FREEBSD >= 201)
/* this belongs to cons.c */
if (*cp == '\r')
return('\n');
*cp = '\n';
#endif /* ! (PCVT_FREEBSD >= 201) */
return (*cp);
return (*cp++);
}
#if PCVT_FREEBSD >= 200
int
pccncheckc(Dev_t dev)
{
return (sgetc(1) != 0); /* did someone press the "Any" key? */
char *cp;
int x = spltty();
kbd_polling = 1;
cp = sgetc(1);
kbd_polling = 0;
splx(x);
return (cp != 0); /* did someone press the "Any" key? */
}
#endif /* PCVT_FREEBSD >= 200 */

View File

@ -1396,12 +1396,12 @@ static __inline void vt_selattr(struct video_state *svsp)
/* 0x84 to produce keyboard controller */
/* access delays */
#define PCVT_KBD_DELAY() \
{ u_char x = inb(0x84); } \
{ u_char x = inb(0x84); } \
{ u_char x = inb(0x84); } \
{ u_char x = inb(0x84); } \
{ u_char x = inb(0x84); } \
{ u_char x = inb(0x84); }
{ (void)inb(0x84); } \
{ (void)inb(0x84); } \
{ (void)inb(0x84); } \
{ (void)inb(0x84); } \
{ (void)inb(0x84); } \
{ (void)inb(0x84); }
#else /* PCVT_PORTIO_DELAY */
/* use system supplied delay function for */

View File

@ -935,10 +935,10 @@ loop:
/* see if there is data from the keyboard available either from */
/* the keyboard fifo or from the 8042 keyboard controller */
if ((( noblock) && (pcvt_kbd_count)) ||
((!noblock) && (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)))
if ((noblock && pcvt_kbd_count) ||
((!noblock || kbd_polling) && (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)))
{
if (!noblock) /* source = 8042 */
if (!noblock || kbd_polling) /* source = 8042 */
{
PCVT_KBD_DELAY(); /* 7 us delay */
dt = inb(CONTROLLER_DATA); /* get from obuf */
@ -1245,10 +1245,10 @@ no_mouse_event:
/* see if there is data from the keyboard available either from */
/* the keyboard fifo or from the 8042 keyboard controller */
if ((( noblock) && (pcvt_kbd_count)) ||
((!noblock) && (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)))
if ((noblock && pcvt_kbd_count) ||
((!noblock || kbd_polling) && (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)))
{
if (!noblock) /* source = 8042 */
if (!noblock || kbd_polling) /* source = 8042 */
{
PCVT_KBD_DELAY(); /* 7 us delay */
dt = inb(CONTROLLER_DATA);
@ -1355,7 +1355,7 @@ regular:
#if PCVT_CTRL_ALT_DEL /* Check for cntl-alt-del */
if((key == 76) && ctrl_down && (meta_down||altgr_down))
cpu_reset();
shutdown_nice();
#endif /* PCVT_CTRL_ALT_DEL */
#if !(PCVT_NETBSD || PCVT_FREEBSD >= 200)