Connect the restored dumb and sc terminal emulators to the kernel build.

Add or fix options to control static and dynamic configuration.  Keep
the default of scteken, but default to statically configuring all available
emulators (now 3 instead of 1).

The dumb emulator is almost usable.  libedit and libreadline handle
dumb terminals perfectly for at least shell history.  less(1) works
as well as possible except on exit.  But curses programs make messes.
The dumb emulator has strange color support, with 2 dumb colors for
normal output but fancy colorization for the cursor, mouse pointer and
(with a non-dumb initial emulator) for low-level console output.

Using the sc emulator instead of the default of scteken fixes at least
the following bugs:
- NUL is a printing character in cons25 but not in teken
- teken doesn't support fixed colors for "reverse" video.
- The best versions of sc are about 10 times faster than scteken (for
  printing to the frame buffer).  This version is only about 5 times
  faster.

Fix configuration features:
- make SC_DFLT_TERM (for setting the initial emulator) a normal option.

Add configuration features:
- negative options SC_NO_TERM_* for omitting emulators in the static config.
  Modules for emulators might work, but I don't know of any
- vidcontrol -e shows the available emulators
- vidcontrol -E <emulator> sets the active emulator.
This commit is contained in:
bde 2019-02-22 06:41:47 +00:00
parent aedcdb3466
commit d68a4690a6
6 changed files with 89 additions and 9 deletions

View File

@ -38,6 +38,7 @@
.Cd "options SC_ALT_MOUSE_IMAGE" .Cd "options SC_ALT_MOUSE_IMAGE"
.Cd "options SC_CUT_SEPCHARS=_characters_" .Cd "options SC_CUT_SEPCHARS=_characters_"
.Cd "options SC_CUT_SPACES2TABS" .Cd "options SC_CUT_SPACES2TABS"
.Cd "options SC_DFLT_TERM"
.Cd "options SC_DISABLE_KDBKEY" .Cd "options SC_DISABLE_KDBKEY"
.Cd "options SC_DISABLE_REBOOT" .Cd "options SC_DISABLE_REBOOT"
.Cd "options SC_HISTORY_SIZE=N" .Cd "options SC_HISTORY_SIZE=N"
@ -48,6 +49,9 @@
.Cd "options SC_NO_PALETTE_LOADING" .Cd "options SC_NO_PALETTE_LOADING"
.Cd "options SC_NO_SUSPEND_VTYSWITCH" .Cd "options SC_NO_SUSPEND_VTYSWITCH"
.Cd "options SC_NO_SYSMOUSE" .Cd "options SC_NO_SYSMOUSE"
.Cd "options SC_NO_TERM_DUMB"
.Cd "options SC_NO_TERM_SC"
.Cd "options SC_NO_TERM_SCTEKEN"
.Cd "options SC_PIXEL_MODE" .Cd "options SC_PIXEL_MODE"
.Cd "options SC_TWOBUTTON_MOUSE" .Cd "options SC_TWOBUTTON_MOUSE"
.Cd "options SC_NORM_ATTR=_attribute_" .Cd "options SC_NORM_ATTR=_attribute_"
@ -285,6 +289,8 @@ This options instructs the driver to convert leading spaces into tabs
when copying data into cut buffer. when copying data into cut buffer.
This might be useful to preserve This might be useful to preserve
indentation when copying tab-indented text. indentation when copying tab-indented text.
.It Dv SC_DFLT_TERM=_name_
This option specifies the name of the preferred terminal emulator.
.It Dv SC_DISABLE_KDBKEY .It Dv SC_DISABLE_KDBKEY
This option disables the ``debug'' key combination (by default, it is This option disables the ``debug'' key combination (by default, it is
.Dv Alt-Esc , .Dv Alt-Esc ,
@ -409,6 +415,15 @@ will fail if this option is defined.
This option implies the This option implies the
.Dv SC_NO_CUTPASTE .Dv SC_NO_CUTPASTE
option too. option too.
.It Dv SC_NO_TERM_DUMB
.It Dv SC_NO_TERM_SC
.It Dv SC_NO_TERM_SCTEKEN
These options remove the
.Qq dumb ,
.Qq sc ,
and
.Qq scteken
terminal emulators, respectively.
.El .El
.Ss Driver Flags .Ss Driver Flags
The following driver flags can be used to control the The following driver flags can be used to control the

View File

@ -1488,6 +1488,7 @@ options MAXCONS=16 # number of virtual consoles
options SC_ALT_MOUSE_IMAGE # simplified mouse cursor in text mode options SC_ALT_MOUSE_IMAGE # simplified mouse cursor in text mode
options SC_DFLT_FONT # compile font in options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT=cp850 makeoptions SC_DFLT_FONT=cp850
options SC_DFLT_TERM=\"sc\" # default terminal emulator
options SC_DISABLE_KDBKEY # disable `debug' key options SC_DISABLE_KDBKEY # disable `debug' key
options SC_DISABLE_REBOOT # disable reboot key sequence options SC_DISABLE_REBOOT # disable reboot key sequence
options SC_HISTORY_SIZE=200 # number of history buffer lines options SC_HISTORY_SIZE=200 # number of history buffer lines
@ -1518,6 +1519,9 @@ options SC_NO_HISTORY
options SC_NO_MODE_CHANGE options SC_NO_MODE_CHANGE
options SC_NO_SYSMOUSE options SC_NO_SYSMOUSE
options SC_NO_SUSPEND_VTYSWITCH options SC_NO_SUSPEND_VTYSWITCH
#!options SC_NO_TERM_DUMB
#!options SC_NO_TERM_SC
#!options SC_NO_TERM_SCTEKEN
# `flags' for sc # `flags' for sc
# 0x80 Put the video card in the VESA 800x600 dots, 16 color mode # 0x80 Put the video card in the VESA 800x600 dots, 16 color mode

View File

@ -3133,7 +3133,9 @@ dev/syscons/rain/rain_saver.c optional rain_saver
dev/syscons/schistory.c optional sc dev/syscons/schistory.c optional sc
dev/syscons/scmouse.c optional sc dev/syscons/scmouse.c optional sc
dev/syscons/scterm.c optional sc dev/syscons/scterm.c optional sc
dev/syscons/scterm-teken.c optional sc dev/syscons/scterm-dumb.c optional sc !SC_NO_TERM_DUMB
dev/syscons/scterm-sc.c optional sc !SC_NO_TERM_SC
dev/syscons/scterm-teken.c optional sc !SC_NO_TERM_TEKEN
dev/syscons/scvidctl.c optional sc dev/syscons/scvidctl.c optional sc
dev/syscons/scvtb.c optional sc dev/syscons/scvtb.c optional sc
dev/syscons/snake/snake_saver.c optional snake_saver dev/syscons/snake/snake_saver.c optional snake_saver
@ -4883,7 +4885,7 @@ security/mac_veriexec/mac_veriexec_sha1.c optional mac_veriexec_sha1
security/mac_veriexec/mac_veriexec_sha256.c optional mac_veriexec_sha256 security/mac_veriexec/mac_veriexec_sha256.c optional mac_veriexec_sha256
security/mac_veriexec/mac_veriexec_sha384.c optional mac_veriexec_sha384 security/mac_veriexec/mac_veriexec_sha384.c optional mac_veriexec_sha384
security/mac_veriexec/mac_veriexec_sha512.c optional mac_veriexec_sha512 security/mac_veriexec/mac_veriexec_sha512.c optional mac_veriexec_sha512
teken/teken.c optional sc | vt teken/teken.c optional sc !SC_NO_TERM_TEKEN | vt
ufs/ffs/ffs_alloc.c optional ffs ufs/ffs/ffs_alloc.c optional ffs
ufs/ffs/ffs_balloc.c optional ffs ufs/ffs/ffs_balloc.c optional ffs
ufs/ffs/ffs_inode.c optional ffs ufs/ffs/ffs_inode.c optional ffs

View File

@ -767,6 +767,7 @@ SC_CUT_SPACES2TABS opt_syscons.h
SC_CUT_SEPCHARS opt_syscons.h SC_CUT_SEPCHARS opt_syscons.h
SC_DEBUG_LEVEL opt_syscons.h SC_DEBUG_LEVEL opt_syscons.h
SC_DFLT_FONT opt_syscons.h SC_DFLT_FONT opt_syscons.h
SC_DFLT_TERM opt_syscons.h
SC_DISABLE_KDBKEY opt_syscons.h SC_DISABLE_KDBKEY opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h SC_DISABLE_REBOOT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h SC_HISTORY_SIZE opt_syscons.h
@ -780,6 +781,9 @@ SC_NO_HISTORY opt_syscons.h
SC_NO_MODE_CHANGE opt_syscons.h SC_NO_MODE_CHANGE opt_syscons.h
SC_NO_SUSPEND_VTYSWITCH opt_syscons.h SC_NO_SUSPEND_VTYSWITCH opt_syscons.h
SC_NO_SYSMOUSE opt_syscons.h SC_NO_SYSMOUSE opt_syscons.h
SC_NO_TERM_DUMB opt_syscons.h
SC_NO_TERM_SC opt_syscons.h
SC_NO_TERM_TEKEN opt_syscons.h
SC_NORM_ATTR opt_syscons.h SC_NORM_ATTR opt_syscons.h
SC_NORM_REV_ATTR opt_syscons.h SC_NORM_REV_ATTR opt_syscons.h
SC_PIXEL_MODE opt_syscons.h SC_PIXEL_MODE opt_syscons.h

View File

@ -21,9 +21,10 @@
.Nd system console control and configuration utility .Nd system console control and configuration utility
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl CdLHPpx .Op Fl CdHLPpx
.Op Fl b Ar color .Op Fl b Ar color
.Op Fl c Ar appearance .Op Fl c Ar appearance
.Op Fl E Ar emulator
.Oo .Oo
.Fl f .Fl f
.Oo .Oo
@ -282,6 +283,11 @@ Show the current changes.
.El .El
.It Fl d .It Fl d
Print out current output screen map. Print out current output screen map.
.It Fl E Ar emulator
Set the terminal emulator to
.Ar emulator .
.It Fl e
Show the active and available terminal emulators.
.It Xo .It Xo
.Fl f .Fl f
.Oo .Oo

View File

@ -204,11 +204,11 @@ usage(void)
" [foreground [background]] [show]"); " [foreground [background]] [show]");
else else
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n", fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
"usage: vidcontrol [-CdHLPpx] [-b color] [-c appearance] [-f [size] file]", "usage: vidcontrol [-CdHLPpx] [-b color] [-c appearance] [-E emulator]",
" [-g geometry] [-h size] [-i active | adapter | mode]", " [-f [[size] file]] [-g geometry] [-h size]",
" [-l screen_map] [-M char] [-m on | off]", " [-i active | adapter | mode] [-l screen_map] [-M char]",
" [-r foreground background] [-S on | off] [-s number]", " [-m on | off] [-r foreground background] [-S on | off]",
" [-T xterm | cons25] [-t N | off] [mode]", " [-s number] [-T xterm | cons25] [-t N | off] [mode]",
" [foreground [background]] [show]"); " [foreground [background]] [show]");
exit(1); exit(1);
} }
@ -1384,6 +1384,45 @@ clear_history(void)
} }
} }
static int
get_terminal_emulator(int i, struct term_info *tip)
{
tip->ti_index = i;
if (ioctl(0, CONS_GETTERM, tip) == 0)
return (1);
strlcpy(tip->ti_name, "unknown", sizeof(tip->ti_name));
strlcpy(tip->ti_desc, "unknown", sizeof(tip->ti_desc));
return (0);
}
static void
get_terminal_emulators(void)
{
struct term_info ti;
int i;
for (i = 0; i < 10; i++) {
if (get_terminal_emulator(i, &ti) == 0)
break;
printf("%d: %s (%s)%s\n", i, ti.ti_name, ti.ti_desc,
i == 0 ? " (active)" : "");
}
}
static void
set_terminal_emulator(const char *name)
{
struct term_info old_ti, ti;
get_terminal_emulator(0, &old_ti);
strlcpy(ti.ti_name, name, sizeof(ti.ti_name));
if (ioctl(0, CONS_SETTERM, &ti) != 0)
warn("SETTERM '%s'", name);
get_terminal_emulator(0, &ti);
printf("%s (%s) -> %s (%s)\n", old_ti.ti_name, old_ti.ti_desc,
ti.ti_name, ti.ti_desc);
}
static void static void
set_terminal_mode(char *arg) set_terminal_mode(char *arg)
{ {
@ -1412,7 +1451,7 @@ main(int argc, char **argv)
if (vt4_mode) if (vt4_mode)
opts = "b:Cc:fg:h:Hi:M:m:pPr:S:s:T:t:x"; opts = "b:Cc:fg:h:Hi:M:m:pPr:S:s:T:t:x";
else else
opts = "b:Cc:dfg:h:Hi:l:LM:m:pPr:S:s:T:t:x"; opts = "b:Cc:deE:fg:h:Hi:l:LM:m:pPr:S:s:T:t:x";
while ((opt = getopt(argc, argv, opts)) != -1) while ((opt = getopt(argc, argv, opts)) != -1)
switch(opt) { switch(opt) {
@ -1430,6 +1469,16 @@ main(int argc, char **argv)
break; break;
print_scrnmap(); print_scrnmap();
break; break;
case 'E':
if (vt4_mode)
break;
set_terminal_emulator(optarg);
break;
case 'e':
if (vt4_mode)
break;
get_terminal_emulators();
break;
case 'f': case 'f':
optarg = nextarg(argc, argv, &optind, 'f', 0); optarg = nextarg(argc, argv, &optind, 'f', 0);
if (optarg != NULL) { if (optarg != NULL) {