vt: Add devctl message for bells

Generate VT events when the bell beeps. When coupled with disabling the
bell,this allows custom bells to be rung when we'd otherwise beep.

Reviewed by:	kevans
Differential Revision:	https://reviews.freebsd.org/D32656
This commit is contained in:
Warner Losh 2021-11-03 15:55:48 -06:00
parent 2533eca1c2
commit 4ac3d08a96
3 changed files with 55 additions and 4 deletions

View File

@ -604,6 +604,15 @@ Notification of a filesystem being unmounted.
.Pp
.Bl -column "System" "Subsystem" "1234567" -compact
.Sy "System" Ta Sy "Subsystem" Ta Sy "Type" Ta Sy "Description"
.It Li VT Ta BELL Ta RING Ta
Notifcation that the console bell has run.
See
.Xr vt 4
for details.
.El
.Pp
.Bl -column "System" "Subsystem" "1234567" -compact
.Sy "System" Ta Sy "Subsystem" Ta Sy "Type" Ta Sy "Description"
.It Li ZFS Ta ZFS Ta Ta
Events about the ZFS subsystem.
See

View File

@ -297,6 +297,20 @@ console fonts
.It Pa /usr/share/vt/keymaps/*.kbd
keyboard layouts
.El
.Sh DEVCTL MESSAGES
.Bl -column "System" "Subsystem" "1234567" -compact
.Sy "System" Ta Sy "Subsystem" Ta Sy "Type" Ta Sy "Description"
.It Li VT Ta BELL Ta RING Ta
Notifcation that the console bell has run.
.El
.Pp
.Bl -column "Variable" "Meaning" -compact
.Sy "Variable" Ta Sy "Meaning"
.It Li duration_ms Ta Length of time the bell was requested to ring in milliseconds.
.It Li enabled Ta true or false indicating whether or not the bell was enabled when rung.
.It Li hz Ta Tone that was requested in Hz.
.El
.Pp
.Sh EXAMPLES
This example changes the default color of normal text to green on a
black background, or black on a green background when reversed.

View File

@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/consio.h>
#include <sys/devctl.h>
#include <sys/eventhandler.h>
#include <sys/fbio.h>
#include <sys/font.h>
@ -51,6 +52,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/random.h>
#include <sys/reboot.h>
#include <sys/sbuf.h>
#include <sys/systm.h>
#include <sys/terminal.h>
@ -1090,12 +1092,35 @@ vt_allocate_keyboard(struct vt_device *vd)
return (idx0);
}
#define DEVCTL_LEN 64
static void
vtterm_devctl(bool enabled, int hz, sbintime_t duration)
{
struct sbuf sb;
char *buf;
buf = malloc(DEVCTL_LEN, M_VT, M_NOWAIT);
if (buf == NULL)
return;
sbuf_new(&sb, buf, DEVCTL_LEN, SBUF_FIXEDLEN);
sbuf_printf(&sb, "enabled=%s hz=%d duration_ms=%d",
enabled ? "true" : "false", hz, (int)(duration / SBT_1MS));
sbuf_finish(&sb);
if (sbuf_error(&sb) == 0)
devctl_notify("VT", "BELL", "RING", sbuf_data(&sb));
sbuf_delete(&sb);
free(buf, M_VT);
}
static void
vtterm_bell(struct terminal *tm)
{
struct vt_window *vw = tm->tm_softc;
struct vt_device *vd = vw->vw_device;
vtterm_devctl(vt_enable_bell, vw->vw_bell_pitch,
vw->vw_bell_duration);
if (!vt_enable_bell)
return;
@ -1112,10 +1137,8 @@ vtterm_bell(struct terminal *tm)
static void
vtterm_beep(struct terminal *tm, u_int param)
{
u_int freq, period;
if (!vt_enable_bell)
return;
u_int freq;
sbintime_t period;
if ((param == 0) || ((param & 0xffff) == 0)) {
vtterm_bell(tm);
@ -1125,6 +1148,11 @@ vtterm_beep(struct terminal *tm, u_int param)
period = ((param >> 16) & 0xffff) * SBT_1MS;
freq = 1193182 / (param & 0xffff);
vtterm_devctl(vt_enable_bell, freq, period);
if (!vt_enable_bell)
return;
sysbeep(freq, period);
}