248 lines
9.9 KiB
Plaintext
248 lines
9.9 KiB
Plaintext
|
Visible bell mini-Howto
|
|||
|
Alessandro Rubini, rubini@linux.it
|
|||
|
v2.3, 2001-12-03
|
|||
|
|
|||
|
This document explains how to use termcap to configure a visual bell
|
|||
|
on one's system and describes how to disable audible bells on demand.
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
|
|||
|
1. Copyright and License
|
|||
|
|
|||
|
2. Introduction
|
|||
|
|
|||
|
3. Spekearectomy
|
|||
|
|
|||
|
4. Per-console Beep Configuration
|
|||
|
|
|||
|
5. Basic Concepts About Termcap and Terminfo
|
|||
|
|
|||
|
6. Defining a Visible Bell
|
|||
|
|
|||
|
7. Disabling the Audible Bell on the Text Console
|
|||
|
|
|||
|
8. Telling Applications to Avoid Beeping
|
|||
|
|
|||
|
9. The Dark Side of the Problem
|
|||
|
|
|||
|
|
|||
|
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
1. Copyright and License
|
|||
|
|
|||
|
This document is Copyright (c) 1997, Alessandro Rubini.
|
|||
|
|
|||
|
This document is distributed under the terms of the GNU Free
|
|||
|
Documentation License. You should have received a copy along with it.
|
|||
|
If not, it is available from http://www.fsf.org/licenses/fdl.html.
|
|||
|
|
|||
|
|
|||
|
2. Introduction
|
|||
|
|
|||
|
The Linux console driver beeps the audible bell whenever a BEL char is
|
|||
|
output (ASCII code 7). Though this is a right choice for the default
|
|||
|
behaviour, many users don't like their computer to beep. This mini-
|
|||
|
Howto is meant to explain how to tell applications not to output the
|
|||
|
BEL code. It also explain how to instruct the kernel and the X Window
|
|||
|
System to avoid beeping when a BEL is output. Note that most of this
|
|||
|
document refers to the text console, as configuring the X server is an
|
|||
|
easy catch-all for any user who works in a graphic environment.
|
|||
|
|
|||
|
In my opinion the best way to face a fussy computer is fixing the
|
|||
|
hardware, and my own computer doesn't even carry a loudspeaker.
|
|||
|
|
|||
|
|
|||
|
3. Spekearectomy
|
|||
|
|
|||
|
Speakerectomy is by far the most brilliant solution to the audible
|
|||
|
bell problem. As its name implies, it consists in removing the beeps
|
|||
|
by removing the beeper. The operation is straightforward and you don't
|
|||
|
even need any anesthetic, but if you want there's room for refinement.
|
|||
|
|
|||
|
PC's are usually equipped with a silly switch to lower CPU clock. The
|
|||
|
switch is never used when you work in a multitasking environment, as
|
|||
|
you don't even need to slow the computer down to run games based on
|
|||
|
software loops. Unfortunately we can't use the switch to increase
|
|||
|
processor speed, but we can use it to enable/disable the loudspeaker.
|
|||
|
Sometimes the speaker is useful even if you enjoy a silent number
|
|||
|
cruncher, for example to signal the end of a lenghty compilation. To
|
|||
|
modify the switch functionality, just detatch it from the main board
|
|||
|
and connect its wires in series with the loudspeaker.
|
|||
|
|
|||
|
Owners of laptop boxes, unfortunately, don't have easy access to the
|
|||
|
loudspeaker, and neither they have a spare switch to turn to a
|
|||
|
different task. The preferred solution for such users is configuring
|
|||
|
their software to avoid beeping, as described below.
|
|||
|
|
|||
|
|
|||
|
4. Per-console Beep Configuration
|
|||
|
|
|||
|
As of Linux 1.3.43, Martin Mares added the ability to configure the
|
|||
|
pitch and duration of the beep, by modifying console.c. Each console
|
|||
|
can be configured to feature a different duration and/or pitch of the
|
|||
|
bell sound; the task is accomplished by using escape sequences to the
|
|||
|
console device. You can configure your own ~/.profile or ~/.login
|
|||
|
file to select a different beep sound associated to each console (or
|
|||
|
no beep at all, if needed).
|
|||
|
|
|||
|
The escape sequences work as follow:
|
|||
|
|
|||
|
<20> ESC-[10;xx] selects the bell frequency in Hertz. The value should
|
|||
|
be in the range 21-32766, otherwise the result is undefined. If
|
|||
|
the `xx' argument is missing, the default value (750Hz) will apply,
|
|||
|
as in `ESC-[10].
|
|||
|
|
|||
|
<20> ESC-[11;xx] selects the bell duration, in milli-seconds. If you
|
|||
|
specify more than 2 seconds, the default applies (125ms). Once
|
|||
|
again, if the `xx' argument is missing (ESC-[11]) the default value
|
|||
|
will be used.
|
|||
|
|
|||
|
To select, for example, a 50Hz pitch for one-second duration, you can
|
|||
|
"echo -e "\\33[10;50]\\33[11;1000]"" with bash (where "-e" means
|
|||
|
`understand Escape sequences'. If you use tcsh the same command spells
|
|||
|
"echo "\\033[10;50]\\033[11;1000]"".
|
|||
|
|
|||
|
Although I don't know of any version of the setterm command that
|
|||
|
supports such configuration, a future version of the command might
|
|||
|
well support a command-line option to configure the bell sound.
|
|||
|
|
|||
|
If you run Linux-1.3.43 or newer, you may be satisfied with the escape
|
|||
|
sequences and avoid reading further. If you run an older kernel, or if
|
|||
|
you want the visual bell, you'll enjoy the rest of this document.
|
|||
|
|
|||
|
|
|||
|
5. Basic Concepts About Termcap and Terminfo
|
|||
|
|
|||
|
The file /etc/termcap is a text file that lists the terminal
|
|||
|
capabilities. Several applications use the termcap information to move
|
|||
|
the cursor around the screen and do other screen-oriented tasks.
|
|||
|
tcsh, bash, vi and all the curses-based applications use the termcap
|
|||
|
database.
|
|||
|
|
|||
|
The database describes several terminal types. The TERM environment
|
|||
|
variable selects the right behaviour at run-time, by naming a termcap
|
|||
|
entry to be used by applications.
|
|||
|
|
|||
|
Within the database, each capability of the terminal appears as a two-
|
|||
|
letter code and a representation of the actual escape sequence used to
|
|||
|
get the desired effect. The separator character between different
|
|||
|
capabilities is the colon (":"). As an example, the audible bell,
|
|||
|
with code "bl", usually appears as "bl=^G". This sequence tells that
|
|||
|
the bell sound is obtained by printing the control-G character, the
|
|||
|
ASCII BEL.
|
|||
|
|
|||
|
In addition to the bl capability, the vb capability is recognized. It
|
|||
|
is used to represent the "visible bell". vb is usually missing in the
|
|||
|
linux entry of the termcap file.
|
|||
|
|
|||
|
Most modern applications and libraries use the terminfo database
|
|||
|
instead of termcap. This database uses one file per terminal-type and
|
|||
|
lives in /usr/lib/terminfo; to avoid using huge directories, the
|
|||
|
description of each terminal type is stored in a directory named after
|
|||
|
its first letter; the linux entry, therefore, is
|
|||
|
/usr/lib/terminfo/l/linux. To build a terminfo entry you'll
|
|||
|
``compile'' the termcap description; refer to the tic program and its
|
|||
|
manual page.
|
|||
|
|
|||
|
|
|||
|
6. Defining a Visible Bell
|
|||
|
|
|||
|
You can add the entry for the vb capability in your own termcap file,
|
|||
|
if it doesn't already define one. Dennis Henriksen (duke@diku.dk)
|
|||
|
suggested to insert the following line in the termcap entry for linux
|
|||
|
(note that the entry is called console in old distributions):
|
|||
|
|
|||
|
|
|||
|
:vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The trailing backslash is used to escape the newline in the database.
|
|||
|
Dennis' code does the following (his own words):
|
|||
|
|
|||
|
<20> Save the cursor position (uust a safety precaution).
|
|||
|
|
|||
|
<20> Change the background color several times between normal and
|
|||
|
reverse.
|
|||
|
|
|||
|
<20> Restore the cursor position.
|
|||
|
|
|||
|
|
|||
|
7. Disabling the Audible Bell on the Text Console
|
|||
|
|
|||
|
If you want to force the visible bell on your console you can use the
|
|||
|
"bl" entry in termcap and define it with the same string suggested for
|
|||
|
"vb" above. This approach is handy if you don't want to customize
|
|||
|
each application (which is described below, anyway). I use this
|
|||
|
option on all the machines where I can run Linux and I can't detach
|
|||
|
the speaker.
|
|||
|
|
|||
|
|
|||
|
8. Telling Applications to Avoid Beeping
|
|||
|
|
|||
|
This is an incomplete list of applications that can be instrued to use
|
|||
|
the vb entry for the current terminal type (using either the termcap
|
|||
|
information or the terminfo one):
|
|||
|
|
|||
|
|
|||
|
<20> The X server: use the "xset b" command to select the bell's
|
|||
|
behaviour. The command takes three numeric arguments: volume, pitch
|
|||
|
and duration. "xset -b" disables the bell altogether. Configuring
|
|||
|
the X server affects all the applications running on the display.
|
|||
|
|
|||
|
<20> xterm: xterm can convert each bell to either a visible or audible
|
|||
|
signal. If you use the audible bell, the settings of "xset" will
|
|||
|
apply. The bell in xterm defualts to be audible, but you can use
|
|||
|
the "-vb" command line option and the "xterm*visualBell: true"
|
|||
|
resource to turn it to a visible flash. You can toggle
|
|||
|
visible/audible signaling at run-time by using the menu invoked by
|
|||
|
control--left-mouse-button. If you run X you most likely won't
|
|||
|
need the following information.
|
|||
|
|
|||
|
|
|||
|
<20> tcsh (6.04 and later): "set visiblebell". The instruction can be
|
|||
|
placed in .cshrc or can be issued interactively. To reset the
|
|||
|
audible bell just "unset visiblebell". To disable any notification
|
|||
|
issue use "set nobeep" instead.
|
|||
|
|
|||
|
<20> bash (any bash, as fas as I know): put "set bell-style visible" in
|
|||
|
your ~/.bashrc. Possible bell-style's are also "none" or "audible".
|
|||
|
|
|||
|
<20> bash (with readline, as well as other readline based applications):
|
|||
|
put "set prefer-visible-bell" in ~/.inputrc.
|
|||
|
|
|||
|
<20> nvi and elvis: put "set flash" in ~/.exrc or tell ":set flash"
|
|||
|
interactively (note the colon). To disable the visible bell use
|
|||
|
noflash in place of flash.
|
|||
|
|
|||
|
<20> emacs: put "(setq visible-bell t)" in your ~/.emacs. It is
|
|||
|
disabled by "(setq visible-bell nil)".
|
|||
|
|
|||
|
<20> less: use "-q" on command line to use the visual bell, use "-Q" to
|
|||
|
disable any reporting. Default options can be put in your
|
|||
|
environment variable "LESS".
|
|||
|
|
|||
|
<20> screen: issue the CtrlA-CtrlG command. It changes the behaviour of
|
|||
|
all the virtual screens. Refer to the man page under
|
|||
|
"CUSTOMIZATION" for setting the default.
|
|||
|
|
|||
|
|
|||
|
9. The Dark Side of the Problem
|
|||
|
|
|||
|
The bad news is that not every application uses termcap or terminfo.
|
|||
|
Most small programs feature 'backslash-a' (alarm) characters in the C
|
|||
|
source code. The "alarm" code becomes a literal ASCII BEL in the
|
|||
|
strings as stored in the executable binary. Real application don't
|
|||
|
usually fall in this category, but be careful of C newcomers who give
|
|||
|
you their own programs. Students of computer science are the worst of
|
|||
|
all, granted.
|
|||
|
|
|||
|
The only way to make these programs silent applications is
|
|||
|
spekearectomy, or using the escape sequences by Martin Mares.
|
|||
|
|
|||
|
|
|||
|
|