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:
parent
2533eca1c2
commit
4ac3d08a96
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user