ch09.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='bells'>
2e9fcaa8aSmrg<title>Bells</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgThe core X protocol allows only applications to explicitly sound the system
6e9fcaa8aSmrgbell with a given duration, pitch, and volume. Xkb extends this capability by
7e9fcaa8aSmrgallowing clients to attach symbolic names to bells, disable audible bells, and
8e9fcaa8aSmrgreceive an event whenever the keyboard bell is rung. For the purposes of this
9e9fcaa8aSmrgdocument, the <emphasis>
10e9fcaa8aSmrgaudible</emphasis>
11e9fcaa8aSmrg bell is defined to be the system bell, or the default keyboard bell, as
12e9fcaa8aSmrgopposed to any other audible sound generated elsewhere in the system.
13e9fcaa8aSmrg</para>
14e9fcaa8aSmrg
15e9fcaa8aSmrg
16e9fcaa8aSmrg<para>
17e9fcaa8aSmrgYou can ask to receive <emphasis>
18e9fcaa8aSmrgXkbBellNotify</emphasis>
19e9fcaa8aSmrg events (see section 9.4) when any client rings any one of the following: <!-- xref -->
20e9fcaa8aSmrg</para>
21e9fcaa8aSmrg
22e9fcaa8aSmrg<itemizedlist>
23e9fcaa8aSmrg<listitem>
24e9fcaa8aSmrg  <para>
25e9fcaa8aSmrgThe default bell
26e9fcaa8aSmrg  </para>
27e9fcaa8aSmrg</listitem>
28e9fcaa8aSmrg<listitem>
29e9fcaa8aSmrg  <para>
30e9fcaa8aSmrgAny bell on an input device that can be specified by a <emphasis>
31e9fcaa8aSmrgbell_class</emphasis>
32e9fcaa8aSmrg and <emphasis>
33e9fcaa8aSmrgbell_id</emphasis>
34e9fcaa8aSmrg pair
35e9fcaa8aSmrg  </para>
36e9fcaa8aSmrg</listitem>
37e9fcaa8aSmrg<listitem>
38e9fcaa8aSmrg  <para>
39e9fcaa8aSmrgAny bell specified only by an arbitrary name. (This is, from the server’s
40e9fcaa8aSmrgpoint of view, merely a name, and not connected with any physical
41e9fcaa8aSmrgsound-generating device. Some client application must generate the sound, or
42e9fcaa8aSmrgvisual feedback, if any, that is associated with the name.)
43e9fcaa8aSmrg  </para>
44e9fcaa8aSmrg</listitem>
45e9fcaa8aSmrg</itemizedlist>
46e9fcaa8aSmrg
47e9fcaa8aSmrg<para>
48e9fcaa8aSmrgYou can also ask to receive <emphasis>
49e9fcaa8aSmrgXkbBellNotify</emphasis>
50e9fcaa8aSmrg events when the server rings the default bell or if any client has requested
51e9fcaa8aSmrgevents only (without the bell sounding) for any of the bell types previously
52e9fcaa8aSmrglisted.
53e9fcaa8aSmrg</para>
54e9fcaa8aSmrg
55e9fcaa8aSmrg<para>
56e9fcaa8aSmrgYou can disable audible bells on a global basis (to set the <emphasis>
57e9fcaa8aSmrgAudibleBell</emphasis>
58e9fcaa8aSmrg control, see Chapter 10). For example, a client that replaces the keyboard
59e9fcaa8aSmrgbell with some other audible cue might want to turn off the <emphasis>
60e9fcaa8aSmrgAudibleBell</emphasis>
61e9fcaa8aSmrg control to prevent the server from also generating a sound and avoid
62e9fcaa8aSmrgcacophony. If you disable audible bells and request to receive <emphasis>
63e9fcaa8aSmrgXkbBellNotify</emphasis>
64e9fcaa8aSmrg events, you can generate feedback different from the default bell.
65e9fcaa8aSmrg</para>
66e9fcaa8aSmrg
67e9fcaa8aSmrg
68e9fcaa8aSmrg<para>
69e9fcaa8aSmrgYou can, however, override the <emphasis>
70e9fcaa8aSmrgAudibleBell</emphasis>
71e9fcaa8aSmrg control by calling one of the functions that force the ringing of a bell in
72e9fcaa8aSmrgspite of the setting of the <emphasis>
73e9fcaa8aSmrgAudibleBell</emphasis>
74e9fcaa8aSmrg control — <emphasis>
75e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
76e9fcaa8aSmrg or <emphasis>
77e9fcaa8aSmrgXkbForceBell</emphasis>
78e9fcaa8aSmrg (see section 9.3.3). In this case the server does not generate a bell event. <!-- xref -->
79e9fcaa8aSmrg</para>
80e9fcaa8aSmrg
81e9fcaa8aSmrg
82e9fcaa8aSmrg<para>
83e9fcaa8aSmrgJust as some keyboards can produce keyclicks to indicate when a key is pressed
84e9fcaa8aSmrgor repeating, Xkb can provide feedback for the controls by using special beep
85e9fcaa8aSmrgcodes. The <emphasis>
86e9fcaa8aSmrgAccessXFeedback</emphasis>
87e9fcaa8aSmrg control is used to configure the specific types of operations that generate
88e9fcaa8aSmrgfeedback. See section 10.6.3 for a discussion on <emphasis> <!-- xref -->
89e9fcaa8aSmrgAccessXFeedback</emphasis>
90e9fcaa8aSmrg control.
91e9fcaa8aSmrg</para>
92e9fcaa8aSmrg
93e9fcaa8aSmrg<para>
94e9fcaa8aSmrgThis chapter describes bell names, the functions used to generate named bells,
95e9fcaa8aSmrgand the events the server generates for bells.
96e9fcaa8aSmrg</para>
97e9fcaa8aSmrg
98e9fcaa8aSmrg<sect1 id='bell_names'>
99e9fcaa8aSmrg<title>Bell Names</title>
100e9fcaa8aSmrg
101e9fcaa8aSmrg<para>
102e9fcaa8aSmrgYou can associate a name to an act of ringing a bell by converting the name to
103e9fcaa8aSmrgan Atom and then using this name when you call the functions listed in this
104e9fcaa8aSmrgchapter. If an event is generated as a result, the name is then passed to all
105e9fcaa8aSmrgother clients interested in receiving <emphasis>
106e9fcaa8aSmrgXkbBellNotify</emphasis>
107e9fcaa8aSmrg events. Note that these are arbitrary names and that there is no binding to
108e9fcaa8aSmrgany sounds. Any sounds or other effects (such as visual bells on the screen)
109e9fcaa8aSmrgmust be generated by a client application upon receipt of the bell event
110e9fcaa8aSmrgcontaining the name. There is no default name for the default keyboard bell.
111e9fcaa8aSmrgThe server does generate some predefined bells for the AccessX controls (see
112e9fcaa8aSmrgsection 10.6.3). These named bells are shown in Table 9.1; the name is included
113e9fcaa8aSmrgin any bell event sent to clients that have requested to receive <emphasis>
114e9fcaa8aSmrgXkbBellNotify</emphasis>
115e9fcaa8aSmrg events.
116e9fcaa8aSmrg</para>
117e9fcaa8aSmrg
118e9fcaa8aSmrg<table frame='none'>
119e9fcaa8aSmrg<title>Predefined Bells</title>
120e9fcaa8aSmrg<tgroup cols='2'>
121e9fcaa8aSmrg<colspec colsep='0'/>
122e9fcaa8aSmrg<colspec colsep='0'/>
123e9fcaa8aSmrg<thead>
124e9fcaa8aSmrg<row rowsep='0'>
125e9fcaa8aSmrg  <entry>Action</entry>
126e9fcaa8aSmrg  <entry>Named Bell</entry>
127e9fcaa8aSmrg</row>
128e9fcaa8aSmrg</thead>
129e9fcaa8aSmrg<tbody>
130e9fcaa8aSmrg<row rowsep='0'>
131e9fcaa8aSmrg    <entry>Indicator turned on</entry>
132e9fcaa8aSmrg    <entry>AX_IndicatorOn</entry>
133e9fcaa8aSmrg</row>
134e9fcaa8aSmrg<row rowsep='0'>
135e9fcaa8aSmrg    <entry>Indicator turned off</entry>
136e9fcaa8aSmrg    <entry>AX_IndicatorOff</entry>
137e9fcaa8aSmrg</row>
138e9fcaa8aSmrg<row rowsep='0'>
139e9fcaa8aSmrg    <entry>More than one indicator changed state</entry>
140e9fcaa8aSmrg    <entry>AX_IndicatorChange</entry>
141e9fcaa8aSmrg</row>
142e9fcaa8aSmrg<row rowsep='0'>
143e9fcaa8aSmrg    <entry>Control turned on</entry>
144e9fcaa8aSmrg    <entry>AX_FeatureOn</entry>
145e9fcaa8aSmrg</row>
146e9fcaa8aSmrg<row rowsep='0'>
147e9fcaa8aSmrg    <entry>Control turned off</entry>
148e9fcaa8aSmrg    <entry>AX_FeatureOff</entry>
149e9fcaa8aSmrg</row>
150e9fcaa8aSmrg<row rowsep='0'>
151e9fcaa8aSmrg    <entry>More than one control changed state</entry>
152e9fcaa8aSmrg    <entry>AX_FeatureChange</entry>
153e9fcaa8aSmrg</row>
154e9fcaa8aSmrg<row rowsep='0'>
155e9fcaa8aSmrg    <entry>SlowKeys and BounceKeys about to be turned on or off</entry>
156e9fcaa8aSmrg    <entry>AX_SlowKeysWarning</entry>
157e9fcaa8aSmrg</row>
158e9fcaa8aSmrg<row rowsep='0'>
159e9fcaa8aSmrg    <entry>SlowKeys key pressed</entry>
160e9fcaa8aSmrg    <entry>AX_SlowKeyPress</entry>
161e9fcaa8aSmrg</row>
162e9fcaa8aSmrg<row rowsep='0'>
163e9fcaa8aSmrg    <entry>SlowKeys key accepted</entry>
164e9fcaa8aSmrg    <entry>AX_SlowKeyAccept</entry>
165e9fcaa8aSmrg</row>
166e9fcaa8aSmrg<row rowsep='0'>
167e9fcaa8aSmrg    <entry>SlowKeys key rejected</entry>
168e9fcaa8aSmrg    <entry>AX_SlowKeyReject</entry>
169e9fcaa8aSmrg</row>
170e9fcaa8aSmrg<row rowsep='0'>
171e9fcaa8aSmrg    <entry>Accepted SlowKeys key released</entry>
172e9fcaa8aSmrg    <entry>AX_SlowKeyRelease</entry>
173e9fcaa8aSmrg</row>
174e9fcaa8aSmrg<row rowsep='0'>
175e9fcaa8aSmrg    <entry>BounceKeys key rejected</entry>
176e9fcaa8aSmrg    <entry>AX_BounceKeyReject</entry>
177e9fcaa8aSmrg</row>
178e9fcaa8aSmrg<row rowsep='0'>
179e9fcaa8aSmrg    <entry>StickyKeys key latched</entry>
180e9fcaa8aSmrg    <entry>AX_StickyLatch</entry>
181e9fcaa8aSmrg</row>
182e9fcaa8aSmrg<row rowsep='0'>
183e9fcaa8aSmrg    <entry>StickyKeys key locked</entry>
184e9fcaa8aSmrg    <entry>AX_StickyLock</entry>
185e9fcaa8aSmrg</row>
186e9fcaa8aSmrg<row rowsep='0'>
187e9fcaa8aSmrg    <entry>StickyKeys key unlocked</entry>
188e9fcaa8aSmrg    <entry>AX_StickyUnlock</entry>
189e9fcaa8aSmrg  </row>
190e9fcaa8aSmrg</tbody>
191e9fcaa8aSmrg</tgroup>
192e9fcaa8aSmrg</table>
193e9fcaa8aSmrg
194e9fcaa8aSmrg</sect1>
195e9fcaa8aSmrg<sect1 id='audible_bells'>
196e9fcaa8aSmrg<title>Audible Bells</title>
197e9fcaa8aSmrg
198e9fcaa8aSmrg<para>
199e9fcaa8aSmrgUsing Xkb you can generate bell events that do not necessarily ring the system
200e9fcaa8aSmrgbell. This is useful if you need to use an audio server instead of the system
201e9fcaa8aSmrgbeep. For example, when an audio client starts, it could disable the audible
202e9fcaa8aSmrgbell (the system bell) and then listen for <emphasis>
203e9fcaa8aSmrgXkbBellNotify</emphasis>
204e9fcaa8aSmrg events (see section 9.4). When it receives a <emphasis> <!-- xref -->
205e9fcaa8aSmrgXkbBellNotify</emphasis>
206e9fcaa8aSmrg event, the audio client could then send a request to an audio server to play a
207e9fcaa8aSmrgsound.
208e9fcaa8aSmrg</para>
209e9fcaa8aSmrg
210e9fcaa8aSmrg
211e9fcaa8aSmrg<para>
212e9fcaa8aSmrgYou can control the audible bells feature by passing the <emphasis>
213e9fcaa8aSmrgXkbAudibleBellMask</emphasis>
214e9fcaa8aSmrg to <emphasis>
215e9fcaa8aSmrgXkbChangeEnabledControls</emphasis>
216e9fcaa8aSmrg (see section 10.1.1). If you set <emphasis> <!-- xref -->
217e9fcaa8aSmrgXkbAudibleBellMask</emphasis>
218e9fcaa8aSmrg on, the server rings the system bell when a bell event occurs. This is the
219e9fcaa8aSmrgdefault. If you set <emphasis>
220e9fcaa8aSmrgXkbAudibleBellMask</emphasis>
221e9fcaa8aSmrg off and a bell event occurs, the server does not ring the system bell unless
222e9fcaa8aSmrgyou call <emphasis>
223e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
224e9fcaa8aSmrg or <emphasis>
225e9fcaa8aSmrgXkbForceBell</emphasis>
226e9fcaa8aSmrg (see section 9.3.3). <!-- xref -->
227e9fcaa8aSmrg</para>
228e9fcaa8aSmrg
229e9fcaa8aSmrg<para>
230e9fcaa8aSmrgAudible bells are also part of the per-client auto-reset controls. For more
231e9fcaa8aSmrginformation on auto-reset controls, see section 10.1.2. <!-- xref -->
232e9fcaa8aSmrg</para>
233e9fcaa8aSmrg
234e9fcaa8aSmrg</sect1>
235e9fcaa8aSmrg<sect1 id='bell_functions'>
236e9fcaa8aSmrg<title>Bell Functions</title>
237e9fcaa8aSmrg
238e9fcaa8aSmrg<para>
239e9fcaa8aSmrgUse the functions described in this section to ring bells and to generate bell
240e9fcaa8aSmrgevents.
241e9fcaa8aSmrg</para>
242e9fcaa8aSmrg
243e9fcaa8aSmrg<para>
244e9fcaa8aSmrgThe input extension has two types of feedbacks that can generate bells — bell
245e9fcaa8aSmrgfeedback and keyboard feedback. Some of the functions in this section have
246e9fcaa8aSmrg<emphasis>
247e9fcaa8aSmrgbell_class</emphasis>
248e9fcaa8aSmrg and <emphasis>
249e9fcaa8aSmrgbell_id</emphasis>
250e9fcaa8aSmrg parameters; set them as follows: Set <emphasis>
251e9fcaa8aSmrgbell_class</emphasis>
252e9fcaa8aSmrg to <emphasis>
253e9fcaa8aSmrgBellFeedbackClass</emphasis>
254e9fcaa8aSmrg or <emphasis>
255e9fcaa8aSmrgKbdFeedbackClass</emphasis>
256e9fcaa8aSmrg. A device can have more than one feedback of each type; set <emphasis>
257e9fcaa8aSmrgbell_id</emphasis>
258e9fcaa8aSmrg to the particular bell feedback of <emphasis>
259e9fcaa8aSmrgbell_class</emphasis>
260e9fcaa8aSmrg type.
261e9fcaa8aSmrg</para>
262e9fcaa8aSmrg
263e9fcaa8aSmrg<para>
264e9fcaa8aSmrgTable 9.2 shows the conditions that cause a bell to sound or an <emphasis> <!-- xref -->
265e9fcaa8aSmrgXkbBellNotifyEvent</emphasis>
266e9fcaa8aSmrg to be generated when a bell function is called.
267e9fcaa8aSmrg</para>
268e9fcaa8aSmrg
269e9fcaa8aSmrg<table frame='none'>
270e9fcaa8aSmrg<title>Bell Sounding and Bell Event Generating</title>
271e9fcaa8aSmrg<tgroup cols='4'>
272e9fcaa8aSmrg<colspec colsep='0'/>
273e9fcaa8aSmrg<colspec colsep='0'/>
274e9fcaa8aSmrg<colspec colsep='0'/>
275e9fcaa8aSmrg<colspec colsep='0'/>
276e9fcaa8aSmrg<thead>
277e9fcaa8aSmrg  <row rowsep='0'>
278e9fcaa8aSmrg    <entry>Function called</entry>
279e9fcaa8aSmrg    <entry>AudibleBell</entry>
280e9fcaa8aSmrg    <entry>Server sounds a bell</entry>
281e9fcaa8aSmrg    <entry>Server sends an XkbBellNotifyEvent</entry>
282e9fcaa8aSmrg  </row>
283e9fcaa8aSmrg</thead>
284e9fcaa8aSmrg<tbody>
285e9fcaa8aSmrg<row rowsep='0'>
286e9fcaa8aSmrg    <entry>XkbDeviceBell</entry>
287e9fcaa8aSmrg    <entry>On</entry>
288e9fcaa8aSmrg    <entry>Yes</entry>
289e9fcaa8aSmrg    <entry>Yes</entry>
290e9fcaa8aSmrg</row>
291e9fcaa8aSmrg<row rowsep='0'>
292e9fcaa8aSmrg    <entry>XkbDeviceBell</entry>
293e9fcaa8aSmrg    <entry>Off</entry>
294e9fcaa8aSmrg    <entry>No</entry>
295e9fcaa8aSmrg    <entry>Yes</entry>
296e9fcaa8aSmrg</row>
297e9fcaa8aSmrg<row rowsep='0'>
298e9fcaa8aSmrg    <entry>XkbBell</entry>
299e9fcaa8aSmrg    <entry>On</entry>
300e9fcaa8aSmrg    <entry>Yes</entry>
301e9fcaa8aSmrg    <entry>Yes</entry>
302e9fcaa8aSmrg</row>
303e9fcaa8aSmrg<row rowsep='0'>
304e9fcaa8aSmrg    <entry>XkbBell</entry>
305e9fcaa8aSmrg    <entry>Off</entry>
306e9fcaa8aSmrg    <entry>No</entry>
307e9fcaa8aSmrg    <entry>Yes</entry>
308e9fcaa8aSmrg</row>
309e9fcaa8aSmrg<row rowsep='0'>
310e9fcaa8aSmrg    <entry>XkbDeviceBellEvent</entry>
311e9fcaa8aSmrg    <entry>On or Off</entry>
312e9fcaa8aSmrg    <entry>No</entry>
313e9fcaa8aSmrg    <entry>Yes</entry>
314e9fcaa8aSmrg</row>
315e9fcaa8aSmrg<row rowsep='0'>
316e9fcaa8aSmrg    <entry>XkbBellEvent</entry>
317e9fcaa8aSmrg    <entry>On or Off</entry>
318e9fcaa8aSmrg    <entry>No</entry>
319e9fcaa8aSmrg    <entry>Yes</entry>
320e9fcaa8aSmrg</row>
321e9fcaa8aSmrg<row rowsep='0'>
322e9fcaa8aSmrg    <entry>XkbDeviceForceBell</entry>
323e9fcaa8aSmrg    <entry>On or Off</entry>
324e9fcaa8aSmrg    <entry>Yes</entry>
325e9fcaa8aSmrg    <entry>No</entry>
326e9fcaa8aSmrg</row>
327e9fcaa8aSmrg<row rowsep='0'>
328e9fcaa8aSmrg    <entry>XkbForceBell</entry>
329e9fcaa8aSmrg    <entry>On or Off</entry>
330e9fcaa8aSmrg    <entry>Yes</entry>
331e9fcaa8aSmrg    <entry>No</entry>
332e9fcaa8aSmrg  </row>
333e9fcaa8aSmrg</tbody>
334e9fcaa8aSmrg</tgroup>
335e9fcaa8aSmrg</table>
336e9fcaa8aSmrg
337e9fcaa8aSmrg<sect2 id='generating_named_bells'>
338e9fcaa8aSmrg<title>Generating Named Bells</title>
339e9fcaa8aSmrg
340e9fcaa8aSmrg<para>
341e9fcaa8aSmrgTo ring the bell on an X input extension device or the default keyboard, use
342e9fcaa8aSmrg<emphasis>
343e9fcaa8aSmrgXkbDeviceBell.</emphasis>
344e9fcaa8aSmrg</para>
345e9fcaa8aSmrg
346e9fcaa8aSmrg<informaltable frame='none'>
347e9fcaa8aSmrg<tgroup cols='1'>
348e9fcaa8aSmrg<colspec colsep='0'/>
349e9fcaa8aSmrg<tbody>
350e9fcaa8aSmrg  <row rowsep='0'>
351e9fcaa8aSmrg    <entry role='functiondecl'>
352e9fcaa8aSmrgBool <emphasis>
353e9fcaa8aSmrgXkbDeviceBell</emphasis>
354e9fcaa8aSmrg(<emphasis>
355e9fcaa8aSmrgdisplay, window, device_id, bell_class, bell_id, percent, name</emphasis>
356e9fcaa8aSmrg)
357e9fcaa8aSmrg    </entry>
358e9fcaa8aSmrg  </row>
359e9fcaa8aSmrg  <row rowsep='0'>
360e9fcaa8aSmrg    <entry role='functionargdecl'>
361e9fcaa8aSmrgDisplay *<emphasis>
362e9fcaa8aSmrg      display</emphasis>
363e9fcaa8aSmrg;            /* connection to the X server */
364e9fcaa8aSmrg    </entry>
365e9fcaa8aSmrg  </row>
366e9fcaa8aSmrg  <row rowsep='0'>
367e9fcaa8aSmrg    <entry role='functionargdecl'>
368e9fcaa8aSmrgWindow<emphasis>
369e9fcaa8aSmrg      window</emphasis>
370e9fcaa8aSmrg;            /* window for which the bell is generated, or None */
371e9fcaa8aSmrg    </entry>
372e9fcaa8aSmrg  </row>
373e9fcaa8aSmrg  <row rowsep='0'>
374e9fcaa8aSmrg    <entry role='functionargdecl'>
375e9fcaa8aSmrgunsigned int      <emphasis>
376e9fcaa8aSmrgdevice_spec</emphasis>
377e9fcaa8aSmrg;            /* device ID, or <emphasis>
378e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
379e9fcaa8aSmrg */
380e9fcaa8aSmrg    </entry>
381e9fcaa8aSmrg  </row>
382e9fcaa8aSmrg  <row rowsep='0'>
383e9fcaa8aSmrg    <entry role='functionargdecl'>
384e9fcaa8aSmrgunsigned int      <emphasis>
385e9fcaa8aSmrgbell_class</emphasis>
386e9fcaa8aSmrg;            /* X input extension bell class of the bell to be rung */
387e9fcaa8aSmrg    </entry>
388e9fcaa8aSmrg  </row>
389e9fcaa8aSmrg  <row rowsep='0'>
390e9fcaa8aSmrg    <entry role='functionargdecl'>
391e9fcaa8aSmrgunsigned int      <emphasis>
392e9fcaa8aSmrgbell_id</emphasis>
393e9fcaa8aSmrg;            /* X input extension bell ID of the bell to be rung */
394e9fcaa8aSmrg    </entry>
395e9fcaa8aSmrg  </row>
396e9fcaa8aSmrg  <row rowsep='0'>
397e9fcaa8aSmrg    <entry role='functionargdecl'>
398e9fcaa8aSmrgint      <emphasis>
399e9fcaa8aSmrgpercent</emphasis>
400e9fcaa8aSmrg;            /* bell volume, from -100 to 100 inclusive */
401e9fcaa8aSmrg    </entry>
402e9fcaa8aSmrg  </row>
403e9fcaa8aSmrg  <row rowsep='0'>
404e9fcaa8aSmrg    <entry role='functionargdecl'>
405e9fcaa8aSmrgAtom      <emphasis>
406e9fcaa8aSmrgname</emphasis>
407e9fcaa8aSmrg;            /* a name for the bell, or <emphasis>
408e9fcaa8aSmrgNULL</emphasis>
409e9fcaa8aSmrg */
410e9fcaa8aSmrg    </entry>
411e9fcaa8aSmrg</row>
412e9fcaa8aSmrg</tbody>
413e9fcaa8aSmrg</tgroup>
414e9fcaa8aSmrg</informaltable>
415e9fcaa8aSmrg
416e9fcaa8aSmrg<para>
417e9fcaa8aSmrgSet <emphasis>
418e9fcaa8aSmrgpercent</emphasis>
419e9fcaa8aSmrg to be the volume relative to the base volume for the keyboard as described for
420e9fcaa8aSmrg<emphasis>
421e9fcaa8aSmrgXBell</emphasis>.
422e9fcaa8aSmrg</para>
423e9fcaa8aSmrg
424e9fcaa8aSmrg<para>
425e9fcaa8aSmrgNote that <emphasis>
426e9fcaa8aSmrgbell_class</emphasis>
427e9fcaa8aSmrg and <emphasis>
428e9fcaa8aSmrgbell_id</emphasis>
429e9fcaa8aSmrg indicate the bell to physically ring. <emphasis>
430e9fcaa8aSmrgname</emphasis>
431e9fcaa8aSmrg is simply an arbitrary moniker for the client application’s use.
432e9fcaa8aSmrg</para>
433e9fcaa8aSmrg
434e9fcaa8aSmrg<para>
435e9fcaa8aSmrgTo determine the current feedback settings of an extension input device, use
436e9fcaa8aSmrg<emphasis>
437e9fcaa8aSmrgXGetFeedbackControl</emphasis>
438e9fcaa8aSmrg. See the X input extension documentation for more information on <emphasis>
439e9fcaa8aSmrgXGetFeedbackControl</emphasis>
440e9fcaa8aSmrg and related data structures.
441e9fcaa8aSmrg</para>
442e9fcaa8aSmrg
443e9fcaa8aSmrg<para>
444e9fcaa8aSmrgIf a compatible keyboard extension is not present in the X server, <emphasis>
445e9fcaa8aSmrgXkbDeviceBell</emphasis>
446e9fcaa8aSmrg immediately returns <emphasis>
447e9fcaa8aSmrgFalse</emphasis>
448e9fcaa8aSmrg. Otherwise, <emphasis>
449e9fcaa8aSmrgXkbDeviceBell </emphasis>
450e9fcaa8aSmrgrings the bell as specified for the display and keyboard device and returns
451e9fcaa8aSmrg<emphasis>
452e9fcaa8aSmrgTrue</emphasis>
453e9fcaa8aSmrg. If you have disabled the audible bell, the server does not ring the system
454e9fcaa8aSmrgbell, although it does generate a <emphasis>
455e9fcaa8aSmrgXkbBellNotify</emphasis>
456e9fcaa8aSmrg event.
457e9fcaa8aSmrg</para>
458e9fcaa8aSmrg
459e9fcaa8aSmrg<para>
460e9fcaa8aSmrgYou can call <emphasis>
461e9fcaa8aSmrgXkbDeviceBell</emphasis>
462e9fcaa8aSmrg without first initializing the keyboard extension.
463e9fcaa8aSmrg</para>
464e9fcaa8aSmrg
465e9fcaa8aSmrg<para>
466e9fcaa8aSmrgAs a convenience function, Xkb provides a function to ring the bell on the
467e9fcaa8aSmrgdefault keyboard: <emphasis>
468e9fcaa8aSmrgXkbBell.</emphasis>
469e9fcaa8aSmrg</para>
470e9fcaa8aSmrg
471e9fcaa8aSmrg<informaltable frame='none'>
472e9fcaa8aSmrg<tgroup cols='1'>
473e9fcaa8aSmrg<colspec colsep='0'/>
474e9fcaa8aSmrg<tbody>
475e9fcaa8aSmrg  <row rowsep='0'>
476e9fcaa8aSmrg    <entry role='functiondecl'>
477e9fcaa8aSmrgBool <emphasis>
478e9fcaa8aSmrgXkbBell</emphasis>
479e9fcaa8aSmrg(<emphasis>
480e9fcaa8aSmrgdisplay, window, percent, name</emphasis>
481e9fcaa8aSmrg)
482e9fcaa8aSmrg    </entry>
483e9fcaa8aSmrg  </row>
484e9fcaa8aSmrg  <row rowsep='0'>
485e9fcaa8aSmrg    <entry role='functionargdecl'>
486e9fcaa8aSmrgDisplay *      <emphasis>
487e9fcaa8aSmrgdisplay</emphasis>
488e9fcaa8aSmrg;            /* connection to the X server */
489e9fcaa8aSmrg    </entry>
490e9fcaa8aSmrg  </row>
491e9fcaa8aSmrg  <row rowsep='0'>
492e9fcaa8aSmrg    <entry role='functionargdecl'>
493e9fcaa8aSmrgWindow<emphasis>
494e9fcaa8aSmrg      window</emphasis>
495e9fcaa8aSmrg;            /* event window, or None*/
496e9fcaa8aSmrg    </entry>
497e9fcaa8aSmrg  </row>
498e9fcaa8aSmrg  <row rowsep='0'>
499e9fcaa8aSmrg    <entry role='functionargdecl'>
500e9fcaa8aSmrgint<emphasis>
501e9fcaa8aSmrg      percent</emphasis>
502e9fcaa8aSmrg;            /* relative volume, which can range from -100 to 100 inclusive */
503e9fcaa8aSmrg    </entry>
504e9fcaa8aSmrg  </row>
505e9fcaa8aSmrg  <row rowsep='0'>
506e9fcaa8aSmrg    <entry role='functionargdecl'>
507e9fcaa8aSmrgAtom<emphasis>
508e9fcaa8aSmrg      name</emphasis>
509e9fcaa8aSmrg;            /* a bell name, or <emphasis>
510e9fcaa8aSmrgNULL</emphasis>
511e9fcaa8aSmrg */
512e9fcaa8aSmrg    </entry>
513e9fcaa8aSmrg</row>
514e9fcaa8aSmrg</tbody>
515e9fcaa8aSmrg</tgroup>
516e9fcaa8aSmrg</informaltable>
517e9fcaa8aSmrg
518e9fcaa8aSmrg<para>
519e9fcaa8aSmrgIf a compatible keyboard extension isn’t present in the X server, <emphasis>
520e9fcaa8aSmrgXkbBell</emphasis>
521e9fcaa8aSmrg calls <emphasis>
522e9fcaa8aSmrgXBell </emphasis>
523e9fcaa8aSmrgwith the specified <emphasis>
524e9fcaa8aSmrgdisplay</emphasis>
525e9fcaa8aSmrg and <emphasis>
526e9fcaa8aSmrgpercent</emphasis>
527e9fcaa8aSmrg, and returns <emphasis>
528e9fcaa8aSmrgFalse</emphasis>
529e9fcaa8aSmrg. Otherwise, <emphasis>
530e9fcaa8aSmrgXkbBell </emphasis>
531e9fcaa8aSmrgcalls <emphasis>
532e9fcaa8aSmrgXkbDeviceBell</emphasis>
533e9fcaa8aSmrg with the specified <emphasis>
534e9fcaa8aSmrgdisplay, window, percent, </emphasis>
535e9fcaa8aSmrgand <emphasis>
536e9fcaa8aSmrgname</emphasis>
537e9fcaa8aSmrg, a <emphasis>
538e9fcaa8aSmrgdevice_spec</emphasis>
539e9fcaa8aSmrg of <emphasis>
540e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
541e9fcaa8aSmrg, a <emphasis>
542e9fcaa8aSmrgbell_class </emphasis>
543e9fcaa8aSmrgof <emphasis>
544e9fcaa8aSmrgXkbDfltXIClass</emphasis>
545e9fcaa8aSmrg, and a <emphasis>
546e9fcaa8aSmrgbell_id </emphasis>
547e9fcaa8aSmrgof <emphasis>
548e9fcaa8aSmrgXkbDfltXIId,</emphasis>
549e9fcaa8aSmrg and returns <emphasis>
550e9fcaa8aSmrgTrue</emphasis>.
551e9fcaa8aSmrg</para>
552e9fcaa8aSmrg
553e9fcaa8aSmrg<para>
554e9fcaa8aSmrgIf you have disabled the audible bell, the server does not ring the system
555e9fcaa8aSmrgbell, although it does generate a <emphasis>
556e9fcaa8aSmrgXkbBellNotify</emphasis>
557e9fcaa8aSmrg event.
558e9fcaa8aSmrg</para>
559e9fcaa8aSmrg
560e9fcaa8aSmrg<para>
561e9fcaa8aSmrgYou can call <emphasis>
562e9fcaa8aSmrgXkbBell</emphasis>
563e9fcaa8aSmrg without first initializing the keyboard extension.
564e9fcaa8aSmrg</para>
565e9fcaa8aSmrg
566e9fcaa8aSmrg</sect2>
567e9fcaa8aSmrg<sect2 id='generating_named_bell_events'>
568e9fcaa8aSmrg<title>Generating Named Bell Events</title>
569e9fcaa8aSmrg
570e9fcaa8aSmrg<para>
571e9fcaa8aSmrgUsing Xkb, you can also generate a named bell event that does not ring any
572e9fcaa8aSmrgbell. This allows you to do things such as generate events when your
573e9fcaa8aSmrgapplication starts.
574e9fcaa8aSmrg</para>
575e9fcaa8aSmrg
576e9fcaa8aSmrg<para>
577e9fcaa8aSmrgFor example, if an audio client listens for these types of bells, it can
578e9fcaa8aSmrgproduce a "whoosh" sound when it receives a named bell event to indicate a
579e9fcaa8aSmrgclient just started. In this manner, applications can generate start-up
580e9fcaa8aSmrgfeedback and not worry about producing annoying beeps if an audio server is not
581e9fcaa8aSmrgrunning.
582e9fcaa8aSmrg</para>
583e9fcaa8aSmrg
584e9fcaa8aSmrg
585e9fcaa8aSmrg<para>
586e9fcaa8aSmrgTo cause a bell event for an X input extension device or for the keyboard,
587e9fcaa8aSmrgwithout ringing the corresponding bell, use <emphasis>
588e9fcaa8aSmrgXkbDeviceBellEvent.</emphasis>
589e9fcaa8aSmrg</para>
590e9fcaa8aSmrg
591e9fcaa8aSmrg<informaltable frame='none'>
592e9fcaa8aSmrg<tgroup cols='1'>
593e9fcaa8aSmrg<colspec colsep='0'/>
594e9fcaa8aSmrg<tbody>
595e9fcaa8aSmrg  <row rowsep='0'>
596e9fcaa8aSmrg    <entry role='functiondecl'>
597e9fcaa8aSmrgBool <emphasis>
598e9fcaa8aSmrgXkbDeviceBellEvent</emphasis>
599e9fcaa8aSmrg(<emphasis>
600e9fcaa8aSmrgdisplay, window, device_spec, bell_class, bell_id, percent, name</emphasis>
601e9fcaa8aSmrg)
602e9fcaa8aSmrg    </entry>
603e9fcaa8aSmrg  </row>
604e9fcaa8aSmrg  <row rowsep='0'>
605e9fcaa8aSmrg    <entry role='functionargdecl'>
606e9fcaa8aSmrgDisplay *      <emphasis>
607e9fcaa8aSmrgdisplay</emphasis>
608e9fcaa8aSmrg;      /* connection to the X server */
609e9fcaa8aSmrg    </entry>
610e9fcaa8aSmrg  </row>
611e9fcaa8aSmrg  <row rowsep='0'>
612e9fcaa8aSmrg    <entry role='functionargdecl'>
613e9fcaa8aSmrgWindow      <emphasis>
614e9fcaa8aSmrgwindow</emphasis>
615e9fcaa8aSmrg;      /* event window, or None*/
616e9fcaa8aSmrg    </entry>
617e9fcaa8aSmrg  </row>
618e9fcaa8aSmrg  <row rowsep='0'>
619e9fcaa8aSmrg    <entry role='functionargdecl'>
620e9fcaa8aSmrgunsigned int      <emphasis>
621e9fcaa8aSmrgdevice_spec</emphasis>
622e9fcaa8aSmrg;      /* device ID, or <emphasis>
623e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
624e9fcaa8aSmrg */
625e9fcaa8aSmrg    </entry>
626e9fcaa8aSmrg  </row>
627e9fcaa8aSmrg  <row rowsep='0'>
628e9fcaa8aSmrg    <entry role='functionargdecl'>
629e9fcaa8aSmrgunsigned int      <emphasis>
630e9fcaa8aSmrgbell_class;</emphasis>
631e9fcaa8aSmrg      /* input extension bell class for the event */
632e9fcaa8aSmrg    </entry>
633e9fcaa8aSmrg  </row>
634e9fcaa8aSmrg  <row rowsep='0'>
635e9fcaa8aSmrg    <entry role='functionargdecl'>
636e9fcaa8aSmrgunsigned int      <emphasis>
637e9fcaa8aSmrgbell_id</emphasis>
638e9fcaa8aSmrg;      /* input extension bell ID for the event */
639e9fcaa8aSmrg    </entry>
640e9fcaa8aSmrg  </row>
641e9fcaa8aSmrg  <row rowsep='0'>
642e9fcaa8aSmrg    <entry role='functionargdecl'>
643e9fcaa8aSmrgint      <emphasis>
644e9fcaa8aSmrgpercent</emphasis>
645e9fcaa8aSmrg;      /* volume for the bell, which can range from -100 to 100 inclusive */
646e9fcaa8aSmrg    </entry>
647e9fcaa8aSmrg  </row>
648e9fcaa8aSmrg  <row rowsep='0'>
649e9fcaa8aSmrg    <entry role='functionargdecl'>
650e9fcaa8aSmrgAtom      <emphasis>
651e9fcaa8aSmrgname</emphasis>
652e9fcaa8aSmrg;      /* a bell name, or <emphasis>
653e9fcaa8aSmrgNULL</emphasis>
654e9fcaa8aSmrg */
655e9fcaa8aSmrg    </entry>
656e9fcaa8aSmrg</row>
657e9fcaa8aSmrg</tbody>
658e9fcaa8aSmrg</tgroup>
659e9fcaa8aSmrg</informaltable>
660e9fcaa8aSmrg
661e9fcaa8aSmrg<para>
662e9fcaa8aSmrgIf a compatible keyboard extension isn’t present in the X server, <emphasis>
663e9fcaa8aSmrgXkbDeviceBellEvent</emphasis>
664e9fcaa8aSmrg immediately returns <emphasis>
665e9fcaa8aSmrgFalse</emphasis>
666e9fcaa8aSmrg. Otherwise, <emphasis>
667e9fcaa8aSmrgXkbDeviceBellEvent</emphasis>
668e9fcaa8aSmrg causes an <emphasis>
669e9fcaa8aSmrgXkbBellNotify</emphasis>
670e9fcaa8aSmrg event to be sent to all interested clients and returns <emphasis>
671e9fcaa8aSmrgTrue</emphasis>
672e9fcaa8aSmrg. Set <emphasis>
673e9fcaa8aSmrgpercent</emphasis>
674e9fcaa8aSmrg to be the volume relative to the base volume for the keyboard as described for
675e9fcaa8aSmrg<emphasis>XBell</emphasis>.
676e9fcaa8aSmrg</para>
677e9fcaa8aSmrg
678e9fcaa8aSmrg
679e9fcaa8aSmrg<para>
680e9fcaa8aSmrgIn addition, <emphasis>
681e9fcaa8aSmrgXkbDeviceBellEvent</emphasis>
682e9fcaa8aSmrg may generate <emphasis>
683e9fcaa8aSmrgAtom</emphasis>
684e9fcaa8aSmrg protocol errors as well as <emphasis>
685e9fcaa8aSmrgXkbBellNotify</emphasis>
686e9fcaa8aSmrg events. You can call <emphasis>
687e9fcaa8aSmrgXkbBell</emphasis>
688e9fcaa8aSmrg without first initializing the keyboard extension.
689e9fcaa8aSmrg</para>
690e9fcaa8aSmrg
691e9fcaa8aSmrg
692e9fcaa8aSmrg<para>
693e9fcaa8aSmrgAs a convenience function, Xkb provides a function to cause a bell event for
694e9fcaa8aSmrgthe keyboard without ringing the bell: <emphasis>
695e9fcaa8aSmrgXkbBellEvent.</emphasis>
696e9fcaa8aSmrg</para>
697e9fcaa8aSmrg
698e9fcaa8aSmrg
699e9fcaa8aSmrg<informaltable frame='none'>
700e9fcaa8aSmrg<tgroup cols='1'>
701e9fcaa8aSmrg<colspec colsep='0'/>
702e9fcaa8aSmrg<tbody>
703e9fcaa8aSmrg  <row rowsep='0'>
704e9fcaa8aSmrg    <entry role='functiondecl'>
705e9fcaa8aSmrgBool <emphasis>
706e9fcaa8aSmrgXkbBellEvent</emphasis>
707e9fcaa8aSmrg(<emphasis>
708e9fcaa8aSmrgdisplay, window, percent, name</emphasis>
709e9fcaa8aSmrg)
710e9fcaa8aSmrg    </entry>
711e9fcaa8aSmrg  </row>
712e9fcaa8aSmrg  <row rowsep='0'>
713e9fcaa8aSmrg    <entry role='functionargdecl'>
714e9fcaa8aSmrgDisplay *      <emphasis>
715e9fcaa8aSmrgdisplay</emphasis>
716e9fcaa8aSmrg;            /* connection to the X server */
717e9fcaa8aSmrg    </entry>
718e9fcaa8aSmrg  </row>
719e9fcaa8aSmrg  <row rowsep='0'>
720e9fcaa8aSmrg    <entry role='functionargdecl'>
721e9fcaa8aSmrgWindow      <emphasis>
722e9fcaa8aSmrgwindow</emphasis>
723e9fcaa8aSmrg;            /* the event window, or None */
724e9fcaa8aSmrg    </entry>
725e9fcaa8aSmrg  </row>
726e9fcaa8aSmrg  <row rowsep='0'>
727e9fcaa8aSmrg    <entry role='functionargdecl'>
728e9fcaa8aSmrgint      <emphasis>
729e9fcaa8aSmrgpercent</emphasis>
730e9fcaa8aSmrg;            /* relative volume, which can range from -100 to 100 inclusive */
731e9fcaa8aSmrg    </entry>
732e9fcaa8aSmrg  </row>
733e9fcaa8aSmrg  <row rowsep='0'>
734e9fcaa8aSmrg    <entry role='functionargdecl'>
735e9fcaa8aSmrgAtom      <emphasis>
736e9fcaa8aSmrgname</emphasis>
737e9fcaa8aSmrg;            /* a bell name, or <emphasis>
738e9fcaa8aSmrgNULL</emphasis>
739e9fcaa8aSmrg */
740e9fcaa8aSmrg    </entry>
741e9fcaa8aSmrg</row>
742e9fcaa8aSmrg</tbody>
743e9fcaa8aSmrg</tgroup>
744e9fcaa8aSmrg</informaltable>
745e9fcaa8aSmrg
746e9fcaa8aSmrg<para>
747e9fcaa8aSmrgIf a compatible keyboard extension isn’t present in the X server, <emphasis>
748e9fcaa8aSmrgXkbBellEvent</emphasis>
749e9fcaa8aSmrg immediately returns <emphasis>
750e9fcaa8aSmrgFalse</emphasis>
751e9fcaa8aSmrg. Otherwise, <emphasis>
752e9fcaa8aSmrgXkbBellEvent </emphasis>
753e9fcaa8aSmrgcalls<emphasis>
754e9fcaa8aSmrg XkbDeviceBellEvent</emphasis>
755e9fcaa8aSmrg with the specified <emphasis>
756e9fcaa8aSmrgdisplay, window, percent, </emphasis>
757e9fcaa8aSmrgand <emphasis>
758e9fcaa8aSmrgname</emphasis>
759e9fcaa8aSmrg, a <emphasis>
760e9fcaa8aSmrgdevice_spec</emphasis>
761e9fcaa8aSmrg of <emphasis>
762e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
763e9fcaa8aSmrg, a <emphasis>
764e9fcaa8aSmrgbell_class </emphasis>
765e9fcaa8aSmrgof <emphasis>
766e9fcaa8aSmrgXkbDfltXIClass</emphasis>
767e9fcaa8aSmrg, and a <emphasis>
768e9fcaa8aSmrgbell_id </emphasis>
769e9fcaa8aSmrgof <emphasis>
770e9fcaa8aSmrgXkbDfltXIId,</emphasis>
771e9fcaa8aSmrg and returns what <emphasis>
772e9fcaa8aSmrgXkbDeviceBellEvent</emphasis>
773e9fcaa8aSmrg returns.
774e9fcaa8aSmrg</para>
775e9fcaa8aSmrg
776e9fcaa8aSmrg<para>
777e9fcaa8aSmrg<emphasis>XkbBellEvent</emphasis>
778e9fcaa8aSmrggenerates a <emphasis>XkbBellNotify</emphasis>
779e9fcaa8aSmrgevent.
780e9fcaa8aSmrg</para>
781e9fcaa8aSmrg
782e9fcaa8aSmrg
783e9fcaa8aSmrg<para>
784e9fcaa8aSmrgYou can call <emphasis>
785e9fcaa8aSmrgXkbBellEvent</emphasis>
786e9fcaa8aSmrgwithout first initializing the keyboard extension.
787e9fcaa8aSmrg</para>
788e9fcaa8aSmrg
789e9fcaa8aSmrg</sect2>
790e9fcaa8aSmrg<sect2 id='forcing_a_server_generated_bell'>
791e9fcaa8aSmrg<title>Forcing a Server-Generated Bell</title>
792e9fcaa8aSmrg
793e9fcaa8aSmrg<para>
794e9fcaa8aSmrgTo ring the bell on any keyboard, overriding user preference settings for
795e9fcaa8aSmrgaudible bells, use <emphasis>XkbForceDeviceBell</emphasis>.
796e9fcaa8aSmrg</para>
797e9fcaa8aSmrg
798e9fcaa8aSmrg<informaltable frame='none'>
799e9fcaa8aSmrg<tgroup cols='1'>
800e9fcaa8aSmrg<colspec colsep='0'/>
801e9fcaa8aSmrg<tbody>
802e9fcaa8aSmrg  <row rowsep='0'>
803e9fcaa8aSmrg    <entry role='functiondecl'>
804e9fcaa8aSmrgBool <emphasis>
805e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
806e9fcaa8aSmrg(<emphasis>
807e9fcaa8aSmrgdisplay, window, device_spec, bell_class, bell_id, percent</emphasis>
808e9fcaa8aSmrg)
809e9fcaa8aSmrg    </entry>
810e9fcaa8aSmrg  </row>
811e9fcaa8aSmrg  <row rowsep='0'>
812e9fcaa8aSmrg    <entry role='functionargdecl'>
813e9fcaa8aSmrgDisplay *      <emphasis>
814e9fcaa8aSmrgdisplay</emphasis>
815e9fcaa8aSmrg;            /* connection to the X server */
816e9fcaa8aSmrg    </entry>
817e9fcaa8aSmrg  </row>
818e9fcaa8aSmrg  <row rowsep='0'>
819e9fcaa8aSmrg    <entry role='functionargdecl'>
820e9fcaa8aSmrgWindow      <emphasis>
821e9fcaa8aSmrgwindow</emphasis>
822e9fcaa8aSmrg;            /* event window, or None */
823e9fcaa8aSmrg    </entry>
824e9fcaa8aSmrg  </row>
825e9fcaa8aSmrg  <row rowsep='0'>
826e9fcaa8aSmrg    <entry role='functionargdecl'>
827e9fcaa8aSmrgunsigned int      <emphasis>
828e9fcaa8aSmrgdevice_spec</emphasis>
829e9fcaa8aSmrg;            /* device ID, or <emphasis>
830e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
831e9fcaa8aSmrg */
832e9fcaa8aSmrg    </entry>
833e9fcaa8aSmrg  </row>
834e9fcaa8aSmrg  <row rowsep='0'>
835e9fcaa8aSmrg    <entry role='functionargdecl'>
836e9fcaa8aSmrgunsigned int      <emphasis>
837e9fcaa8aSmrgbell_class</emphasis>
838e9fcaa8aSmrg;            /* input extension class of the bell to be rung */
839e9fcaa8aSmrg    </entry>
840e9fcaa8aSmrg  </row>
841e9fcaa8aSmrg  <row rowsep='0'>
842e9fcaa8aSmrg    <entry role='functionargdecl'>
843e9fcaa8aSmrgunsigned int      <emphasis>
844e9fcaa8aSmrgbell_id</emphasis>
845e9fcaa8aSmrg;            /* input extension ID of the bell to be rung */
846e9fcaa8aSmrg    </entry>
847e9fcaa8aSmrg  </row>
848e9fcaa8aSmrg  <row rowsep='0'>
849e9fcaa8aSmrg    <entry role='functionargdecl'>
850e9fcaa8aSmrgint      <emphasis>
851e9fcaa8aSmrgpercent</emphasis>
852e9fcaa8aSmrg;            /* relative volume, which can range from -100 to 100 inclusive */
853e9fcaa8aSmrg    </entry>
854e9fcaa8aSmrg</row>
855e9fcaa8aSmrg</tbody>
856e9fcaa8aSmrg</tgroup>
857e9fcaa8aSmrg</informaltable>
858e9fcaa8aSmrg
859e9fcaa8aSmrg<para>
860e9fcaa8aSmrgIf a compatible keyboard extension isn’t present in the X server, <emphasis>
861e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
862e9fcaa8aSmrg immediately returns <emphasis>
863e9fcaa8aSmrgFalse</emphasis>
864e9fcaa8aSmrg. Otherwise, <emphasis>
865e9fcaa8aSmrgXkbForceDeviceBell </emphasis>
866e9fcaa8aSmrgrings the bell as specified for the display and keyboard device and returns
867e9fcaa8aSmrg<emphasis>
868e9fcaa8aSmrgTrue</emphasis>
869e9fcaa8aSmrg. Set <emphasis>
870e9fcaa8aSmrgpercent</emphasis>
871e9fcaa8aSmrg to be the volume relative to the base volume for the keyboard as described for
872e9fcaa8aSmrg<emphasis>
873e9fcaa8aSmrgXBell</emphasis>
874e9fcaa8aSmrg. There is no <emphasis>
875e9fcaa8aSmrgname</emphasis>
876e9fcaa8aSmrg parameter because <emphasis>
877e9fcaa8aSmrgXkbForceDeviceBell </emphasis>
878e9fcaa8aSmrgdoes not cause an <emphasis>
879e9fcaa8aSmrgXkbBellNotify</emphasis>
880e9fcaa8aSmrg event.
881e9fcaa8aSmrg</para>
882e9fcaa8aSmrg
883e9fcaa8aSmrg<para>
884e9fcaa8aSmrgYou can call <emphasis>
885e9fcaa8aSmrgXkbBell</emphasis>
886e9fcaa8aSmrg without first initializing the keyboard extension.
887e9fcaa8aSmrg</para>
888e9fcaa8aSmrg
889e9fcaa8aSmrg<para>
890e9fcaa8aSmrgTo ring the bell on the default keyboard, overriding user preference settings
891e9fcaa8aSmrgfor audible bells, use <emphasis>
892e9fcaa8aSmrgXkbForceBell</emphasis>.
893e9fcaa8aSmrg</para>
894e9fcaa8aSmrg
895e9fcaa8aSmrg<informaltable frame='none'>
896e9fcaa8aSmrg<tgroup cols='1'>
897e9fcaa8aSmrg<colspec colsep='0'/>
898e9fcaa8aSmrg<tbody>
899e9fcaa8aSmrg  <row rowsep='0'>
900e9fcaa8aSmrg    <entry role='functiondecl'>
901e9fcaa8aSmrgBool <emphasis>
902e9fcaa8aSmrgXkbForceBell</emphasis>
903e9fcaa8aSmrg(<emphasis>
904e9fcaa8aSmrgdisplay, percent)</emphasis>
905e9fcaa8aSmrg    </entry>
906e9fcaa8aSmrg  </row>
907e9fcaa8aSmrg  <row rowsep='0'>
908e9fcaa8aSmrg    <entry role='functionargdecl'>
909e9fcaa8aSmrgDisplay *      <emphasis>
910e9fcaa8aSmrgdisplay</emphasis>
911e9fcaa8aSmrg;      /* connection to the X server */
912e9fcaa8aSmrg    </entry>
913e9fcaa8aSmrg  </row>
914e9fcaa8aSmrg  <row rowsep='0'>
915e9fcaa8aSmrg    <entry role='functionargdecl'>
916e9fcaa8aSmrgint      <emphasis>
917e9fcaa8aSmrgpercent</emphasis>
918e9fcaa8aSmrg;      /* volume for the bell, which can range from -100 to 100 inclusive */
919e9fcaa8aSmrg    </entry>
920e9fcaa8aSmrg</row>
921e9fcaa8aSmrg</tbody>
922e9fcaa8aSmrg</tgroup>
923e9fcaa8aSmrg</informaltable>
924e9fcaa8aSmrg
925e9fcaa8aSmrg<para>
926e9fcaa8aSmrgIf a compatible keyboard extension isn’t present in the X server, <emphasis>
927e9fcaa8aSmrgXkbForceBell</emphasis>
928e9fcaa8aSmrg calls <emphasis>
929e9fcaa8aSmrgXBell </emphasis>
930e9fcaa8aSmrgwith the specified <emphasis>
931e9fcaa8aSmrgdisplay</emphasis>
932e9fcaa8aSmrg and <emphasis>
933e9fcaa8aSmrgpercent</emphasis>
934e9fcaa8aSmrg and returns <emphasis>
935e9fcaa8aSmrgFalse</emphasis>
936e9fcaa8aSmrg. Otherwise, <emphasis>
937e9fcaa8aSmrgXkbForceBell </emphasis>
938e9fcaa8aSmrgcalls <emphasis>
939e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
940e9fcaa8aSmrg with the specified <emphasis>
941e9fcaa8aSmrgdisplay </emphasis>
942e9fcaa8aSmrgand<emphasis>
943e9fcaa8aSmrg percent</emphasis>
944e9fcaa8aSmrg, <emphasis>
945e9fcaa8aSmrgdevice_spec</emphasis>
946e9fcaa8aSmrg =<emphasis>
947e9fcaa8aSmrgXkbUseCoreKbd</emphasis>
948e9fcaa8aSmrg, <emphasis>
949e9fcaa8aSmrgbell_class </emphasis>
950e9fcaa8aSmrg= <emphasis>
951e9fcaa8aSmrgXkbDfltXIClass</emphasis>
952e9fcaa8aSmrg, <emphasis>
953e9fcaa8aSmrgbell_id </emphasis>
954e9fcaa8aSmrg= <emphasis>
955e9fcaa8aSmrgXkbDfltXIId,</emphasis>
956e9fcaa8aSmrg <emphasis>
957e9fcaa8aSmrgwindow</emphasis>
958e9fcaa8aSmrg = None, and <emphasis>
959e9fcaa8aSmrgname</emphasis>
960e9fcaa8aSmrg = <emphasis>
961e9fcaa8aSmrgNULL</emphasis>
962e9fcaa8aSmrg, and returns what<emphasis>
963e9fcaa8aSmrg XkbForceDeviceBell</emphasis>
964e9fcaa8aSmrg returns.
965e9fcaa8aSmrg</para>
966e9fcaa8aSmrg
967e9fcaa8aSmrg<para>
968e9fcaa8aSmrg<emphasis>
969e9fcaa8aSmrgXkbForceBell </emphasis>
970e9fcaa8aSmrgdoes not cause an <emphasis>
971e9fcaa8aSmrgXkbBellNotify</emphasis>
972e9fcaa8aSmrg event.
973e9fcaa8aSmrg</para>
974e9fcaa8aSmrg
975e9fcaa8aSmrg<para>
976e9fcaa8aSmrgYou can call <emphasis>
977e9fcaa8aSmrgXkbBell</emphasis>
978e9fcaa8aSmrg without first initializing the keyboard extension.
979e9fcaa8aSmrg</para>
980e9fcaa8aSmrg
981e9fcaa8aSmrg</sect2>
982e9fcaa8aSmrg</sect1>
983e9fcaa8aSmrg<sect1 id='detecting_bells'>
984e9fcaa8aSmrg<title>Detecting Bells</title>
985e9fcaa8aSmrg
986e9fcaa8aSmrg<para>
987e9fcaa8aSmrgXkb generates <emphasis>
988e9fcaa8aSmrgXkbBellNotify</emphasis>
989e9fcaa8aSmrg events for all bells except for those resulting from calls to <emphasis>
990e9fcaa8aSmrgXkbForceDeviceBell</emphasis>
991e9fcaa8aSmrg and <emphasis>
992e9fcaa8aSmrgXkbForceBell</emphasis>
993e9fcaa8aSmrg. To receive <emphasis>
994e9fcaa8aSmrgXkbBellNotify</emphasis>
995e9fcaa8aSmrg events under all possible conditions, pass <emphasis>
996e9fcaa8aSmrgXkbBellNotifyMask</emphasis>
997e9fcaa8aSmrg in both the <emphasis>
998e9fcaa8aSmrgbits_to_change </emphasis>
999e9fcaa8aSmrgand<emphasis>
1000e9fcaa8aSmrg values_for_bits</emphasis>
1001e9fcaa8aSmrg parameters to <emphasis>
1002e9fcaa8aSmrgXkbSelectEvents</emphasis>
1003e9fcaa8aSmrg (see section 4.3). <!-- xref -->
1004e9fcaa8aSmrg</para>
1005e9fcaa8aSmrg
1006e9fcaa8aSmrg<para>
1007e9fcaa8aSmrgThe <emphasis>
1008e9fcaa8aSmrgXkbBellNotify</emphasis>
1009e9fcaa8aSmrg event has no event details. It is either selected or it is not. However, you
1010e9fcaa8aSmrgcan call <emphasis>
1011e9fcaa8aSmrgXkbSelectEventDetails</emphasis>
1012e9fcaa8aSmrg using <emphasis>
1013e9fcaa8aSmrgXkbBellNotify</emphasis>
1014e9fcaa8aSmrg as the <emphasis>
1015e9fcaa8aSmrgevent_type</emphasis>
1016e9fcaa8aSmrg and specifying <emphasis>
1017e9fcaa8aSmrgXkbAllBellNotifyMask</emphasis>
1018e9fcaa8aSmrg in <emphasis>
1019e9fcaa8aSmrgbits_to_change</emphasis>
1020e9fcaa8aSmrg and <emphasis>
1021e9fcaa8aSmrgvalues_for_bits.</emphasis>
1022e9fcaa8aSmrg This has the same effect as a call to <emphasis>
1023e9fcaa8aSmrgXkbSelectEvents</emphasis>.
1024e9fcaa8aSmrg</para>
1025e9fcaa8aSmrg
1026e9fcaa8aSmrg<para>
1027e9fcaa8aSmrgThe structure for the <emphasis>
1028e9fcaa8aSmrgXkbBellNotify</emphasis>
1029e9fcaa8aSmrg event type contains:
1030e9fcaa8aSmrg</para>
1031e9fcaa8aSmrg
1032e9fcaa8aSmrg<para><programlisting>
1033e9fcaa8aSmrgtypedef struct _XkbBellNotify {
1034e9fcaa8aSmrg      int             type;        /* Xkb extension base event code */
1035e9fcaa8aSmrg      unsigned long   serial;      /* X server serial number for event */
1036e9fcaa8aSmrg      Bool            send_event;  /* <emphasis> True</emphasis> =&gt; synthetically generated */
1037e9fcaa8aSmrg      Display *       display;     /* server connection where event generated */
1038e9fcaa8aSmrg      Time            time;        /* server time when event generated */
1039e9fcaa8aSmrg      int             xkb_type;    /* <emphasis> XkbBellNotify</emphasis> */
1040e9fcaa8aSmrg      unsigned int    device;      /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
1041e9fcaa8aSmrg      int             percent;     /* requested volume as % of max */
1042e9fcaa8aSmrg      int             pitch;       /* requested pitch in Hz */
1043e9fcaa8aSmrg      int             duration;    /* requested duration in microseconds */
1044e9fcaa8aSmrg      unsigned int    bell_class;  /* X input extension feedback class */
1045e9fcaa8aSmrg      unsigned int    bell_id;     /* X input extension feedback ID */
1046e9fcaa8aSmrg      Atom            name;        /* "name" of requested bell */
1047e9fcaa8aSmrg      Window          window;      /* window associated with event */
1048e9fcaa8aSmrg      Bool            event_only;  /* <emphasis> False</emphasis> -&gt; the server did not produce a beep */
1049e9fcaa8aSmrg} <emphasis>XkbBellNotifyEvent</emphasis>;
1050e9fcaa8aSmrg</programlisting></para>
1051e9fcaa8aSmrg
1052e9fcaa8aSmrg<para>
1053e9fcaa8aSmrgIf your application needs to generate visual bell feedback on the screen when
1054e9fcaa8aSmrgit receives a bell event, use the window ID in the <emphasis>
1055e9fcaa8aSmrgXkbBellNotifyEvent</emphasis>
1056e9fcaa8aSmrg, if present.
1057e9fcaa8aSmrg</para>
1058e9fcaa8aSmrg
1059e9fcaa8aSmrg</sect1>
1060e9fcaa8aSmrg</chapter>
1061