The branch main has been updated by imp:

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

commit 4ac3d08a9693c27c1bd2ddd67b2808ac9e18f4c5
Author:     Warner Losh <i...@freebsd.org>
AuthorDate: 2021-11-03 21:55:48 +0000
Commit:     Warner Losh <i...@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);
 }
 

Reply via email to