git: 4ac3d08a9693 - main - vt: Add devctl message for bells

From: Warner Losh <imp_at_FreeBSD.org>
Date: Wed, 03 Nov 2021 22:04:19 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=4ac3d08a9693c27c1bd2ddd67b2808ac9e18f4c5

commit 4ac3d08a9693c27c1bd2ddd67b2808ac9e18f4c5
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-11-03 21:55:48 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2021-11-03 22:03:51 +0000

    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
---
 sbin/devd/devd.conf.5 |  9 +++++++++
 share/man/man4/vt.4   | 14 ++++++++++++++
 sys/dev/vt/vt_core.c  | 36 ++++++++++++++++++++++++++++++++----
 3 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/sbin/devd/devd.conf.5 b/sbin/devd/devd.conf.5
index f6579ac3f20f..887ce5ec9a3d 100644
--- a/sbin/devd/devd.conf.5
+++ b/sbin/devd/devd.conf.5
@@ -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
diff --git a/share/man/man4/vt.4 b/share/man/man4/vt.4
index 8584706dc1aa..d0672ff9e5a0 100644
--- a/share/man/man4/vt.4
+++ b/share/man/man4/vt.4
@@ -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.
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index a197c8e8be68..38efd1e5501c 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -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);
 }