Bells
The core X protocol allows only applications to explicitly sound the system
bell with a given duration, pitch, and volume. Xkb extends this capability by
allowing clients to attach symbolic names to bells, disable audible bells, and
receive an event whenever the keyboard bell is rung. For the purposes of this
document, the
audible
bell is defined to be the system bell, or the default keyboard bell, as
opposed to any other audible sound generated elsewhere in the system.
You can ask to receive
XkbBellNotify
events (see section 9.4) when any client rings any one of the following:
The default bell
Any bell on an input device that can be specified by a
bell_class
and
bell_id
pair
Any bell specified only by an arbitrary name. (This is, from the server’s
point of view, merely a name, and not connected with any physical
sound-generating device. Some client application must generate the sound, or
visual feedback, if any, that is associated with the name.)
You can also ask to receive
XkbBellNotify
events when the server rings the default bell or if any client has requested
events only (without the bell sounding) for any of the bell types previously
listed.
You can disable audible bells on a global basis (to set the
AudibleBell
control, see Chapter 10). For example, a client that replaces the keyboard
bell with some other audible cue might want to turn off the
AudibleBell
control to prevent the server from also generating a sound and avoid
cacophony. If you disable audible bells and request to receive
XkbBellNotify
events, you can generate feedback different from the default bell.
You can, however, override the
AudibleBell
control by calling one of the functions that force the ringing of a bell in
spite of the setting of the
AudibleBell
control —
XkbForceDeviceBell
or
XkbForceBell
(see section 9.3.3). In this case the server does not generate a bell event.
Just as some keyboards can produce keyclicks to indicate when a key is pressed
or repeating, Xkb can provide feedback for the controls by using special beep
codes. The
AccessXFeedback
control is used to configure the specific types of operations that generate
feedback. See section 10.6.3 for a discussion on
AccessXFeedback
control.
This chapter describes bell names, the functions used to generate named bells,
and the events the server generates for bells.
Bell Names
You can associate a name to an act of ringing a bell by converting the name to
an Atom and then using this name when you call the functions listed in this
chapter. If an event is generated as a result, the name is then passed to all
other clients interested in receiving
XkbBellNotify
events. Note that these are arbitrary names and that there is no binding to
any sounds. Any sounds or other effects (such as visual bells on the screen)
must be generated by a client application upon receipt of the bell event
containing the name. There is no default name for the default keyboard bell.
The server does generate some predefined bells for the AccessX controls (see
section 10.6.3). These named bells are shown in Table 9.1; the name is included
in any bell event sent to clients that have requested to receive
XkbBellNotify
events.
Predefined Bells
Action
Named Bell
Indicator turned on
AX_IndicatorOn
Indicator turned off
AX_IndicatorOff
More than one indicator changed state
AX_IndicatorChange
Control turned on
AX_FeatureOn
Control turned off
AX_FeatureOff
More than one control changed state
AX_FeatureChange
SlowKeys and BounceKeys about to be turned on or off
AX_SlowKeysWarning
SlowKeys key pressed
AX_SlowKeyPress
SlowKeys key accepted
AX_SlowKeyAccept
SlowKeys key rejected
AX_SlowKeyReject
Accepted SlowKeys key released
AX_SlowKeyRelease
BounceKeys key rejected
AX_BounceKeyReject
StickyKeys key latched
AX_StickyLatch
StickyKeys key locked
AX_StickyLock
StickyKeys key unlocked
AX_StickyUnlock
Audible Bells
Using Xkb you can generate bell events that do not necessarily ring the system
bell. This is useful if you need to use an audio server instead of the system
beep. For example, when an audio client starts, it could disable the audible
bell (the system bell) and then listen for
XkbBellNotify
events (see section 9.4). When it receives a
XkbBellNotify
event, the audio client could then send a request to an audio server to play a
sound.
You can control the audible bells feature by passing the
XkbAudibleBellMask
to
XkbChangeEnabledControls
(see section 10.1.1). If you set
XkbAudibleBellMask
on, the server rings the system bell when a bell event occurs. This is the
default. If you set
XkbAudibleBellMask
off and a bell event occurs, the server does not ring the system bell unless
you call
XkbForceDeviceBell
or
XkbForceBell
(see section 9.3.3).
Audible bells are also part of the per-client auto-reset controls. For more
information on auto-reset controls, see section 10.1.2.
Bell Functions
Use the functions described in this section to ring bells and to generate bell
events.
The input extension has two types of feedbacks that can generate bells — bell
feedback and keyboard feedback. Some of the functions in this section have
bell_class
and
bell_id
parameters; set them as follows: Set
bell_class
to
BellFeedbackClass
or
KbdFeedbackClass
. A device can have more than one feedback of each type; set
bell_id
to the particular bell feedback of
bell_class
type.
Table 9.2 shows the conditions that cause a bell to sound or an
XkbBellNotifyEvent
to be generated when a bell function is called.
Bell Sounding and Bell Event Generating
Function called
AudibleBell
Server sounds a bell
Server sends an XkbBellNotifyEvent
XkbDeviceBell
On
Yes
Yes
XkbDeviceBell
Off
No
Yes
XkbBell
On
Yes
Yes
XkbBell
Off
No
Yes
XkbDeviceBellEvent
On or Off
No
Yes
XkbBellEvent
On or Off
No
Yes
XkbDeviceForceBell
On or Off
Yes
No
XkbForceBell
On or Off
Yes
No
Generating Named Bells
To ring the bell on an X input extension device or the default keyboard, use
XkbDeviceBell.
Bool
XkbDeviceBell
(
display, window, device_id, bell_class, bell_id, percent, name
)
Display *
display
; /* connection to the X server */
Window
window
; /* window for which the bell is generated, or None */
unsigned int
device_spec
; /* device ID, or
XkbUseCoreKbd
*/
unsigned int
bell_class
; /* X input extension bell class of the bell to be rung */
unsigned int
bell_id
; /* X input extension bell ID of the bell to be rung */
int
percent
; /* bell volume, from -100 to 100 inclusive */
Atom
name
; /* a name for the bell, or
NULL
*/
Set
percent
to be the volume relative to the base volume for the keyboard as described for
XBell.
Note that
bell_class
and
bell_id
indicate the bell to physically ring.
name
is simply an arbitrary moniker for the client application’s use.
To determine the current feedback settings of an extension input device, use
XGetFeedbackControl
. See the X input extension documentation for more information on
XGetFeedbackControl
and related data structures.
If a compatible keyboard extension is not present in the X server,
XkbDeviceBell
immediately returns
False
. Otherwise,
XkbDeviceBell
rings the bell as specified for the display and keyboard device and returns
True
. If you have disabled the audible bell, the server does not ring the system
bell, although it does generate a
XkbBellNotify
event.
You can call
XkbDeviceBell
without first initializing the keyboard extension.
As a convenience function, Xkb provides a function to ring the bell on the
default keyboard:
XkbBell.
Bool
XkbBell
(
display, window, percent, name
)
Display *
display
; /* connection to the X server */
Window
window
; /* event window, or None*/
int
percent
; /* relative volume, which can range from -100 to 100 inclusive */
Atom
name
; /* a bell name, or
NULL
*/
If a compatible keyboard extension isn’t present in the X server,
XkbBell
calls
XBell
with the specified
display
and
percent
, and returns
False
. Otherwise,
XkbBell
calls
XkbDeviceBell
with the specified
display, window, percent,
and
name
, a
device_spec
of
XkbUseCoreKbd
, a
bell_class
of
XkbDfltXIClass
, and a
bell_id
of
XkbDfltXIId,
and returns
True.
If you have disabled the audible bell, the server does not ring the system
bell, although it does generate a
XkbBellNotify
event.
You can call
XkbBell
without first initializing the keyboard extension.
Generating Named Bell Events
Using Xkb, you can also generate a named bell event that does not ring any
bell. This allows you to do things such as generate events when your
application starts.
For example, if an audio client listens for these types of bells, it can
produce a "whoosh" sound when it receives a named bell event to indicate a
client just started. In this manner, applications can generate start-up
feedback and not worry about producing annoying beeps if an audio server is not
running.
To cause a bell event for an X input extension device or for the keyboard,
without ringing the corresponding bell, use
XkbDeviceBellEvent.
Bool
XkbDeviceBellEvent
(
display, window, device_spec, bell_class, bell_id, percent, name
)
Display *
display
; /* connection to the X server */
Window
window
; /* event window, or None*/
unsigned int
device_spec
; /* device ID, or
XkbUseCoreKbd
*/
unsigned int
bell_class;
/* input extension bell class for the event */
unsigned int
bell_id
; /* input extension bell ID for the event */
int
percent
; /* volume for the bell, which can range from -100 to 100 inclusive */
Atom
name
; /* a bell name, or
NULL
*/
If a compatible keyboard extension isn’t present in the X server,
XkbDeviceBellEvent
immediately returns
False
. Otherwise,
XkbDeviceBellEvent
causes an
XkbBellNotify
event to be sent to all interested clients and returns
True
. Set
percent
to be the volume relative to the base volume for the keyboard as described for
XBell.
In addition,
XkbDeviceBellEvent
may generate
Atom
protocol errors as well as
XkbBellNotify
events. You can call
XkbBell
without first initializing the keyboard extension.
As a convenience function, Xkb provides a function to cause a bell event for
the keyboard without ringing the bell:
XkbBellEvent.
Bool
XkbBellEvent
(
display, window, percent, name
)
Display *
display
; /* connection to the X server */
Window
window
; /* the event window, or None */
int
percent
; /* relative volume, which can range from -100 to 100 inclusive */
Atom
name
; /* a bell name, or
NULL
*/
If a compatible keyboard extension isn’t present in the X server,
XkbBellEvent
immediately returns
False
. Otherwise,
XkbBellEvent
calls
XkbDeviceBellEvent
with the specified
display, window, percent,
and
name
, a
device_spec
of
XkbUseCoreKbd
, a
bell_class
of
XkbDfltXIClass
, and a
bell_id
of
XkbDfltXIId,
and returns what
XkbDeviceBellEvent
returns.
XkbBellEvent
generates a XkbBellNotify
event.
You can call
XkbBellEvent
without first initializing the keyboard extension.
Forcing a Server-Generated Bell
To ring the bell on any keyboard, overriding user preference settings for
audible bells, use XkbForceDeviceBell.
Bool
XkbForceDeviceBell
(
display, window, device_spec, bell_class, bell_id, percent
)
Display *
display
; /* connection to the X server */
Window
window
; /* event window, or None */
unsigned int
device_spec
; /* device ID, or
XkbUseCoreKbd
*/
unsigned int
bell_class
; /* input extension class of the bell to be rung */
unsigned int
bell_id
; /* input extension ID of the bell to be rung */
int
percent
; /* relative volume, which can range from -100 to 100 inclusive */
If a compatible keyboard extension isn’t present in the X server,
XkbForceDeviceBell
immediately returns
False
. Otherwise,
XkbForceDeviceBell
rings the bell as specified for the display and keyboard device and returns
True
. Set
percent
to be the volume relative to the base volume for the keyboard as described for
XBell
. There is no
name
parameter because
XkbForceDeviceBell
does not cause an
XkbBellNotify
event.
You can call
XkbBell
without first initializing the keyboard extension.
To ring the bell on the default keyboard, overriding user preference settings
for audible bells, use
XkbForceBell.
Bool
XkbForceBell
(
display, percent)
Display *
display
; /* connection to the X server */
int
percent
; /* volume for the bell, which can range from -100 to 100 inclusive */
If a compatible keyboard extension isn’t present in the X server,
XkbForceBell
calls
XBell
with the specified
display
and
percent
and returns
False
. Otherwise,
XkbForceBell
calls
XkbForceDeviceBell
with the specified
display
and
percent
,
device_spec
=
XkbUseCoreKbd
,
bell_class
=
XkbDfltXIClass
,
bell_id
=
XkbDfltXIId,
window
= None, and
name
=
NULL
, and returns what
XkbForceDeviceBell
returns.
XkbForceBell
does not cause an
XkbBellNotify
event.
You can call
XkbBell
without first initializing the keyboard extension.
Detecting Bells
Xkb generates
XkbBellNotify
events for all bells except for those resulting from calls to
XkbForceDeviceBell
and
XkbForceBell
. To receive
XkbBellNotify
events under all possible conditions, pass
XkbBellNotifyMask
in both the
bits_to_change
and
values_for_bits
parameters to
XkbSelectEvents
(see section 4.3).
The
XkbBellNotify
event has no event details. It is either selected or it is not. However, you
can call
XkbSelectEventDetails
using
XkbBellNotify
as the
event_type
and specifying
XkbAllBellNotifyMask
in
bits_to_change
and
values_for_bits.
This has the same effect as a call to
XkbSelectEvents.
The structure for the
XkbBellNotify
event type contains:
typedef struct _XkbBellNotify {
int type; /* Xkb extension base event code */
unsigned long serial; /* X server serial number for event */
Bool send_event; /* True => synthetically generated */
Display * display; /* server connection where event generated */
Time time; /* server time when event generated */
int xkb_type; /* XkbBellNotify */
unsigned int device; /* Xkb device ID, will not be XkbUseCoreKbd */
int percent; /* requested volume as % of max */
int pitch; /* requested pitch in Hz */
int duration; /* requested duration in microseconds */
unsigned int bell_class; /* X input extension feedback class */
unsigned int bell_id; /* X input extension feedback ID */
Atom name; /* "name" of requested bell */
Window window; /* window associated with event */
Bool event_only; /* False -> the server did not produce a beep */
} XkbBellNotifyEvent;
If your application needs to generate visual bell feedback on the screen when
it receives a bell event, use the window ID in the
XkbBellNotifyEvent
, if present.