aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2021-11-03 21:55:48 +0000
committerWarner Losh <imp@FreeBSD.org>2021-11-03 22:03:51 +0000
commit4ac3d08a9693c27c1bd2ddd67b2808ac9e18f4c5 (patch)
treead0fed604d636e5d62d7deebfba13030eaaac6f1
parent2533eca1c2b9d561c42d28bcb6f1c1c35562fbcc (diff)
downloadsrc-4ac3d08a9693.tar.gz
src-4ac3d08a9693.zip
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
-rw-r--r--sbin/devd/devd.conf.59
-rw-r--r--share/man/man4/vt.414
-rw-r--r--sys/dev/vt/vt_core.c36
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);
}