0bc4f8ada7
for vt. Restore syscons' rendering of background (bg) brightness as foreground (fg) blinking and vice versa, and add rendering of blinking as background brightness to vt. Bright/saturated is conflated with light/white in the implementation and in this description. Bright colors were broken in all cases, but appeared to work in the only case shown by "vidcontrol show". A boldness hack was applied only in 1 layering-violation place (for some syscons sequences) where it made some cases seem to work but was undone by clearing bold using ANSI sequences, and more seriously was not undone when setting ANSI/xterm dark colors so left them bright. Move this hack to drivers. The boldness hack is only for fg brightness. Restore/add a similar hack for bg brightness rendered as fg blinking and vice versa. This works even better for vt, since vt changes the default text mode to give the more useful bg brightness instead of fg blinking. The brightness bit in colors was unnecessarily removed by the boldness hack. In other cases, it was lost later by teken_256to8(). Use teken_256to16() to not lose it. teken_256to8() was intended to be used for bg colors to allow finer or bg-specific control for the more difficult reduction to 8; however, since 16 bg colors actually work on VGA except in syscons text mode and the conversion isn't subtle enough to significantly in that mode, teken_256to8() is not used now. There are still bugs, especially in vidcontrol, if bright/blinking background colors are set. Restore XOR logic for bold/bright fg in syscons (don't change OR logic for vt). Remove broken ifdef on FG_UNDERLINE and its wrong or missing bit and restore the correct hard-coded bit. FG_UNDERLINE is only for mono mode which is not really supported. Restore XOR logic for blinking/bright bg in syscons (in vt, add OR logic and render as bright bg). Remove related broken ifdef on BG_BLINKING and its missing bit and restore the correct hard-coded bit. The same bit means blinking or bright bg depending on the mode, and we want to ignore the difference everywhere. Simplify conversions of attributes in syscons. Don't pretend to support bold fonts. Don't support unusual encodings of brightness. It is as good as possible to map 16 VGA colors to 16 xterm-16 colors. E.g., VGA brown -> xterm-16 Olive will be converted back to VGA brown, so we don't need to convert to xterm-256 Brown. Teken cons25 compatibility code already does the same, and duplicates some small tables. This is mostly for the sc -> te direction. The other direction uses teken_256to16() which is too generic.
120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
/*-
|
|
* Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
static void
|
|
teken_subr_cons25_set_cursor_type(teken_t *t, unsigned int type)
|
|
{
|
|
|
|
teken_funcs_param(t, TP_SHOWCURSOR, type != 1);
|
|
}
|
|
|
|
static const teken_color_t cons25_colors[8] = { TC_BLACK, TC_BLUE,
|
|
TC_GREEN, TC_CYAN, TC_RED, TC_MAGENTA, TC_BROWN, TC_WHITE };
|
|
|
|
static void
|
|
teken_subr_cons25_set_adapter_background(teken_t *t, unsigned int c)
|
|
{
|
|
|
|
t->t_defattr.ta_bgcolor = cons25_colors[c % 8] | (c & 8);
|
|
t->t_curattr.ta_bgcolor = cons25_colors[c % 8] | (c & 8);
|
|
}
|
|
|
|
static void
|
|
teken_subr_cons25_set_adapter_foreground(teken_t *t, unsigned int c)
|
|
{
|
|
|
|
t->t_defattr.ta_fgcolor = cons25_colors[c % 8] | (c & 8);
|
|
t->t_curattr.ta_fgcolor = cons25_colors[c % 8] | (c & 8);
|
|
}
|
|
|
|
static const teken_color_t cons25_revcolors[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
|
|
|
|
void
|
|
teken_get_defattr_cons25(teken_t *t, int *fg, int *bg)
|
|
{
|
|
|
|
*fg = cons25_revcolors[teken_256to8(t->t_defattr.ta_fgcolor)];
|
|
if (t->t_defattr.ta_format & TF_BOLD)
|
|
*fg += 8;
|
|
*bg = cons25_revcolors[teken_256to8(t->t_defattr.ta_bgcolor)];
|
|
}
|
|
|
|
static void
|
|
teken_subr_cons25_switch_virtual_terminal(teken_t *t, unsigned int vt)
|
|
{
|
|
|
|
teken_funcs_param(t, TP_SWITCHVT, vt);
|
|
}
|
|
|
|
static void
|
|
teken_subr_cons25_set_bell_pitch_duration(teken_t *t, unsigned int pitch,
|
|
unsigned int duration)
|
|
{
|
|
|
|
teken_funcs_param(t, TP_SETBELLPD, (pitch << 16) |
|
|
(duration & 0xffff));
|
|
}
|
|
|
|
static void
|
|
teken_subr_cons25_set_graphic_rendition(teken_t *t, unsigned int cmd,
|
|
unsigned int param __unused)
|
|
{
|
|
|
|
switch (cmd) {
|
|
case 0: /* Reset. */
|
|
t->t_curattr = t->t_defattr;
|
|
break;
|
|
default:
|
|
teken_printf("unsupported attribute %u\n", cmd);
|
|
}
|
|
}
|
|
|
|
static void
|
|
teken_subr_cons25_set_terminal_mode(teken_t *t, unsigned int mode)
|
|
{
|
|
|
|
switch (mode) {
|
|
case 0: /* Switch terminal to xterm. */
|
|
t->t_stateflags &= ~TS_CONS25;
|
|
break;
|
|
case 1: /* Switch terminal to cons25. */
|
|
t->t_stateflags |= TS_CONS25;
|
|
break;
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
static void
|
|
teken_subr_vt52_decid(teken_t *t)
|
|
{
|
|
const char response[] = "\x1B/Z";
|
|
|
|
teken_funcs_respond(t, response, sizeof response - 1);
|
|
}
|
|
#endif
|