ch08.xml revision eb411b4b
1eb411b4bSmrg<chapter id='Indicators'> 2e9fcaa8aSmrg<title>Indicators</title> 3e9fcaa8aSmrg 4e9fcaa8aSmrg<para> 5e9fcaa8aSmrgAlthough the core X implementation supports up to 32 LEDs on an input device, 6e9fcaa8aSmrgit does not provide any linkage between the state of the LEDs and the logical 7e9fcaa8aSmrgstate of the input device. For example, most keyboards have a <emphasis> 8e9fcaa8aSmrgCapsLock</emphasis> 9e9fcaa8aSmrg LED, but X does not provide a mechanism to make the LED automatically follow 10e9fcaa8aSmrgthe logical state of the <emphasis> 11e9fcaa8aSmrgCapsLock</emphasis> 12e9fcaa8aSmrg key. 13e9fcaa8aSmrg</para> 14e9fcaa8aSmrg 15e9fcaa8aSmrg 16e9fcaa8aSmrg<para> 17e9fcaa8aSmrgFurthermore, the core X implementation does not provide clients with the 18e9fcaa8aSmrgability to determine what bits in the <emphasis> 19e9fcaa8aSmrgled_mask</emphasis> 20e9fcaa8aSmrg field of the <emphasis> 21e9fcaa8aSmrgXKeyboardState</emphasis> 22e9fcaa8aSmrg map to the particular LEDs on the keyboard. For example, X does not provide a 23e9fcaa8aSmrgmethod for a client to determine what bit to set in the <emphasis> 24e9fcaa8aSmrgled_mask</emphasis> 25e9fcaa8aSmrg field to turn on the <emphasis> 26e9fcaa8aSmrgScroll Lock </emphasis> 27e9fcaa8aSmrgLED or whether the keyboard even has a <emphasis> 28e9fcaa8aSmrgScroll Lock</emphasis> 29e9fcaa8aSmrg LED. 30e9fcaa8aSmrg</para> 31e9fcaa8aSmrg 32e9fcaa8aSmrg 33e9fcaa8aSmrg<para> 34e9fcaa8aSmrgXkb provides indicator names and programmable indicators to help solve these 35e9fcaa8aSmrgproblems. Using Xkb, clients can determine the names of the various indicators, 36e9fcaa8aSmrgdetermine and control the way that the individual indicators should be updated 37e9fcaa8aSmrgto reflect keyboard changes, and determine which of the 32 keyboard indicators 38e9fcaa8aSmrgreported by the protocol are actually present on the keyboard. Clients may also 39e9fcaa8aSmrgrequest immediate notification of changes to the state of any subset of the 40e9fcaa8aSmrgkeyboard indicators, which makes it straightforward to provide an on-screen 41e9fcaa8aSmrg"virtual" LED panel. This chapter describes Xkb indicators and the functions 42e9fcaa8aSmrgused for manipulating them. 43e9fcaa8aSmrg</para> 44e9fcaa8aSmrg 45eb411b4bSmrg<sect1 id='Indicator_Names'> 46e9fcaa8aSmrg<title>Indicator Names</title> 47e9fcaa8aSmrg 48e9fcaa8aSmrg<para> 49e9fcaa8aSmrgXkb provides the capability of symbolically naming indicators. Xkb itself 50e9fcaa8aSmrgdoesn’t use these symbolic names for anything; they are there only to help 51e9fcaa8aSmrgmake the keyboard description comprehensible to humans. To set the names of 52e9fcaa8aSmrgspecific indicators, use <emphasis> 53e9fcaa8aSmrgXkbSetNames</emphasis> 54e9fcaa8aSmrg as discussed in Chapter 18. Then set the map using <emphasis> <!-- xref --> 55e9fcaa8aSmrgXkbSetMap</emphasis> 56e9fcaa8aSmrg (see section 14.3) or <emphasis> <!-- xref --> 57e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 58e9fcaa8aSmrg (below). To retrieve indicator names, use <emphasis> 59e9fcaa8aSmrgXkbGetNames</emphasis> 60e9fcaa8aSmrg (Chapter 18). <!-- xref --> 61e9fcaa8aSmrg</para> 62e9fcaa8aSmrg 63e9fcaa8aSmrg 64e9fcaa8aSmrg</sect1> 65eb411b4bSmrg<sect1 id='Indicator_Data_Structures'> 66e9fcaa8aSmrg<title>Indicator Data Structures</title> 67e9fcaa8aSmrg 68e9fcaa8aSmrg<para> 69e9fcaa8aSmrgUse the indicator description record, <emphasis> 70e9fcaa8aSmrgXkbIndicatorRec</emphasis> 71e9fcaa8aSmrg, and its indicator map, <emphasis> 72e9fcaa8aSmrgXkbIndicatorMapRec</emphasis> 73e9fcaa8aSmrg, to inquire about and control most indicator properties and behaviors. 74e9fcaa8aSmrg</para> 75e9fcaa8aSmrg 76e9fcaa8aSmrg 77eb411b4bSmrg<sect2 id='XkbIndicatorRec'> 78e9fcaa8aSmrg<title>XkbIndicatorRec</title> 79e9fcaa8aSmrg 80e9fcaa8aSmrg<para> 81e9fcaa8aSmrgThe description for all the Xkb indicators is held in the <emphasis> 82e9fcaa8aSmrgindicators</emphasis> 83e9fcaa8aSmrg field of the complete keyboard description (see Chapter 6), which is defined <!-- xref --> 84e9fcaa8aSmrgas follows: 85e9fcaa8aSmrg</para> 86e9fcaa8aSmrg 87e9fcaa8aSmrg<para><programlisting> 88e9fcaa8aSmrg#define XkbNumIndicators 32 89e9fcaa8aSmrg</programlisting></para> 90e9fcaa8aSmrg<para><programlisting> 91e9fcaa8aSmrgtypedef struct { 92e9fcaa8aSmrg unsigned long phys_indicators; /* LEDs existence */ 93e9fcaa8aSmrg XkbIndicatorMapRec maps[XkbNumIndicators]; /* indicator maps */ 94e9fcaa8aSmrg} <emphasis>XkbIndicatorRec</emphasis>,*XkbIndicatorPtr; 95e9fcaa8aSmrg</programlisting></para> 96e9fcaa8aSmrg 97e9fcaa8aSmrg<para> 98e9fcaa8aSmrgThis structure contains the <emphasis> 99e9fcaa8aSmrgphys_indicators</emphasis> 100e9fcaa8aSmrg field, which relates some information about the correspondence between 101e9fcaa8aSmrgindicators and physical LEDs on the keyboard, and an array of indicator 102e9fcaa8aSmrg<emphasis> 103e9fcaa8aSmrgmaps</emphasis> 104e9fcaa8aSmrg, one map per indicator. 105e9fcaa8aSmrg</para> 106e9fcaa8aSmrg 107e9fcaa8aSmrg<para> 108e9fcaa8aSmrgThe <emphasis> 109e9fcaa8aSmrgphys_indicators</emphasis> 110e9fcaa8aSmrg field indicates which indicators are bound to physical LEDs on the keyboard; 111e9fcaa8aSmrgif a bit is set in <emphasis> 112e9fcaa8aSmrgphys_indicators</emphasis> 113e9fcaa8aSmrg, then the associated indicator has a physical LED associated with it. This 114e9fcaa8aSmrgfield is necessary because some indicators may not have corresponding physical 115e9fcaa8aSmrgLEDs on the keyboard. For example, most keyboards have an LED for indicating 116e9fcaa8aSmrgthe state of <emphasis> 117e9fcaa8aSmrgCapsLock</emphasis> 118e9fcaa8aSmrg, but most keyboards do not have an LED that indicates the current group. 119e9fcaa8aSmrgBecause <emphasis> 120e9fcaa8aSmrgphys_indicators</emphasis> 121e9fcaa8aSmrg describes a physical characteristic of the keyboard, you cannot directly 122e9fcaa8aSmrgchange it under program control. However, if a client program loads a 123e9fcaa8aSmrgcompletely new keyboard description via <emphasis> 124e9fcaa8aSmrgXkbGetKeyboardByName</emphasis> 125e9fcaa8aSmrg, or if a new keyboard is attached and the X implementation notices, <emphasis> 126e9fcaa8aSmrgphys_indicators</emphasis> 127e9fcaa8aSmrg changes if the indicators for the new keyboard are different. 128e9fcaa8aSmrg</para> 129e9fcaa8aSmrg 130e9fcaa8aSmrg 131e9fcaa8aSmrg</sect2> 132eb411b4bSmrg<sect2 id='XkbIndicatorMapRec'> 133e9fcaa8aSmrg<title>XkbIndicatorMapRec</title> 134e9fcaa8aSmrg 135e9fcaa8aSmrg<para> 136e9fcaa8aSmrgEach indicator has its own set of attributes that specify whether clients can 137e9fcaa8aSmrgexplicitly set its state and whether it tracks the keyboard state. The 138e9fcaa8aSmrgattributes of each indicator are held in the <emphasis> 139e9fcaa8aSmrgmaps</emphasis> 140e9fcaa8aSmrg array, which is an array of <emphasis> 141e9fcaa8aSmrgXkbIndicatorRec</emphasis> 142e9fcaa8aSmrg structures: 143e9fcaa8aSmrg</para> 144e9fcaa8aSmrg 145e9fcaa8aSmrg<para><programlisting> 146e9fcaa8aSmrgtypedef struct { 147e9fcaa8aSmrg unsigned char flags; /* how the indicator can be changed */ 148e9fcaa8aSmrg unsigned char which_groups; /* match criteria for groups */ 149e9fcaa8aSmrg unsigned char groups; /* which keyboard groups the indicator watches */ 150e9fcaa8aSmrg unsigned char which_mods; /* match criteria for modifiers */ 151e9fcaa8aSmrg XkbModsRec mods; /* which modifiers the indicator watches */ 152e9fcaa8aSmrg unsigned int ctrls; /* which controls the indicator watches */ 153e9fcaa8aSmrg} <emphasis>XkbIndicatorMapRec</emphasis>, *XkbIndicatorMapPtr; 154e9fcaa8aSmrg</programlisting></para> 155e9fcaa8aSmrg 156e9fcaa8aSmrg<para> 157e9fcaa8aSmrgThis indicator map specifies for each indicator: 158e9fcaa8aSmrg</para> 159e9fcaa8aSmrg 160e9fcaa8aSmrg<itemizedlist> 161e9fcaa8aSmrg<listitem> 162e9fcaa8aSmrg <para> 163e9fcaa8aSmrgThe conditions under which the keyboard modifier state affects the indicator 164e9fcaa8aSmrg </para> 165e9fcaa8aSmrg</listitem> 166e9fcaa8aSmrg<listitem> 167e9fcaa8aSmrg <para> 168e9fcaa8aSmrgThe conditions under which the keyboard group state affects the indicator 169e9fcaa8aSmrg </para> 170e9fcaa8aSmrg</listitem> 171e9fcaa8aSmrg<listitem> 172e9fcaa8aSmrg <para> 173e9fcaa8aSmrgThe conditions under which the state of the boolean controls affects the 174e9fcaa8aSmrgindicator 175e9fcaa8aSmrg </para> 176e9fcaa8aSmrg</listitem> 177e9fcaa8aSmrg<listitem> 178e9fcaa8aSmrg <para> 179e9fcaa8aSmrgThe effect (if any) of attempts to explicitly change the state of the indicator 180e9fcaa8aSmrgusing the functions <emphasis> 181e9fcaa8aSmrgXkbSetControls</emphasis> 182e9fcaa8aSmrg or <emphasis> 183e9fcaa8aSmrgXChangeKeyboardControl</emphasis> 184e9fcaa8aSmrg 185e9fcaa8aSmrg </para> 186e9fcaa8aSmrg</listitem> 187e9fcaa8aSmrg</itemizedlist> 188e9fcaa8aSmrg 189e9fcaa8aSmrg<para> 190e9fcaa8aSmrgFor more information on the effects of explicit changes to indicators and the 191e9fcaa8aSmrgrelationship to the indicator map, see section 8.4.1. <!-- xref --> 192e9fcaa8aSmrg</para> 193e9fcaa8aSmrg 194eb411b4bSmrg<sect3 id='XkbIndicatorMapRec_flags_field'> 195e9fcaa8aSmrg<title>XkbIndicatorMapRec flags field</title> 196e9fcaa8aSmrg 197e9fcaa8aSmrg<para> 198e9fcaa8aSmrgThe <emphasis> 199e9fcaa8aSmrgflags</emphasis> 200e9fcaa8aSmrg field specifies the conditions under which the indicator can be changed and 201e9fcaa8aSmrgthe effects of changing the indicator. The valid values for <emphasis> 202e9fcaa8aSmrgflags</emphasis> 203e9fcaa8aSmrg and their effects are shown in Table 8.1. <!-- xref --> 204e9fcaa8aSmrg</para> 205e9fcaa8aSmrg 206eb411b4bSmrg<table frame='topbot'> 207e9fcaa8aSmrg<title>XkbIndicatorMapRec flags Field</title> 208eb411b4bSmrg<?dbfo keep-together="always" ?> 209eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'> 210eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/> 211eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 212eb411b4bSmrg<colspec colname='c3' colwidth='3.0*'/> 213e9fcaa8aSmrg<thead> 214eb411b4bSmrg<row rowsep='1'> 215e9fcaa8aSmrg <entry>Value</entry> 216e9fcaa8aSmrg <entry></entry> 217e9fcaa8aSmrg <entry>Effect</entry> 218e9fcaa8aSmrg </row> 219e9fcaa8aSmrg</thead> 220e9fcaa8aSmrg<tbody> 221eb411b4bSmrg <row> 222e9fcaa8aSmrg <entry>XkbIM_NoExplicit</entry> 223e9fcaa8aSmrg <entry>(1L<<7)</entry> 224e9fcaa8aSmrg <entry>Client applications cannot change the state of the indicator.</entry> 225e9fcaa8aSmrg </row> 226eb411b4bSmrg <row> 227e9fcaa8aSmrg <entry>XkbIM_NoAutomatic</entry> 228e9fcaa8aSmrg <entry>(1L<<6)</entry> 229e9fcaa8aSmrg <entry>Xkb does not automatically change the value of the indicator based 230e9fcaa8aSmrgupon a change in the keyboard state, regardless of the values for the other 231e9fcaa8aSmrgfields of the indicator map.</entry> 232e9fcaa8aSmrg </row> 233eb411b4bSmrg <row> 234e9fcaa8aSmrg <entry>XkbIM_LEDDrivesKB</entry> 235e9fcaa8aSmrg <entry>(1L<<5)</entry> 236e9fcaa8aSmrg <entry>A client application changing the state of the indicator causes the 237e9fcaa8aSmrgstate of the keyboard to change.</entry> 238e9fcaa8aSmrg </row> 239e9fcaa8aSmrg</tbody> 240e9fcaa8aSmrg</tgroup> 241e9fcaa8aSmrg</table> 242e9fcaa8aSmrg 243e9fcaa8aSmrg<para> 244e9fcaa8aSmrgNote that if <emphasis> 245e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 246e9fcaa8aSmrg is not set, by default the indicator follows the keyboard state. 247e9fcaa8aSmrg</para> 248e9fcaa8aSmrg 249e9fcaa8aSmrg 250e9fcaa8aSmrg<para> 251e9fcaa8aSmrgIf <emphasis> 252e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 253e9fcaa8aSmrg is set and <emphasis> 254e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 255e9fcaa8aSmrg is not, and if you call a function which updates the server’s image of the 256e9fcaa8aSmrgindicator map (such as <emphasis> 257e9fcaa8aSmrgXkbSetIndicatorMap</emphasis> 258e9fcaa8aSmrg or <emphasis> 259e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 260e9fcaa8aSmrg), Xkb changes the keyboard state and controls to reflect the other fields of 261e9fcaa8aSmrgthe indicator map, as described in the remainder of this section. If you 262e9fcaa8aSmrgattempt to explicitly change the value of an indicator for which <emphasis> 263e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 264e9fcaa8aSmrg is absent or for which <emphasis> 265e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 266e9fcaa8aSmrg is present, keyboard state or controls are unaffected. 267e9fcaa8aSmrg</para> 268e9fcaa8aSmrg 269e9fcaa8aSmrg 270e9fcaa8aSmrg<para> 271e9fcaa8aSmrgFor example, a keyboard designer may want to make the <emphasis> 272e9fcaa8aSmrgCapsLock</emphasis> 273e9fcaa8aSmrg LED controllable only by the server, but allow the <emphasis> 274e9fcaa8aSmrgScroll Lock</emphasis> 275e9fcaa8aSmrg LED to be controlled by client applications. To do so, the keyboard designer 276e9fcaa8aSmrgcould set the <emphasis> 277e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 278e9fcaa8aSmrg flag for the <emphasis> 279e9fcaa8aSmrgCapsLock</emphasis> 280e9fcaa8aSmrg<emphasis> 281e9fcaa8aSmrg </emphasis> 282e9fcaa8aSmrgLED, but not set it for the <emphasis> 283e9fcaa8aSmrgScroll Lock</emphasis> 284e9fcaa8aSmrg LED. Or the keyboard designer may wish to allow the <emphasis> 285e9fcaa8aSmrgCapsLock</emphasis> 286e9fcaa8aSmrg LED to be controlled by both the server and client applications and also have 287e9fcaa8aSmrgthe server to automatically change the <emphasis> 288e9fcaa8aSmrgCapsLock</emphasis> 289e9fcaa8aSmrg<emphasis> 290e9fcaa8aSmrg </emphasis> 291e9fcaa8aSmrgmodifier state whenever a client application changes the <emphasis> 292e9fcaa8aSmrgCapsLock</emphasis> 293e9fcaa8aSmrg LED. To do so, the keyboard designer would not set the <emphasis> 294e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 295e9fcaa8aSmrg flag, but would instead set the <emphasis> 296e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 297e9fcaa8aSmrg flag. 298e9fcaa8aSmrg</para> 299e9fcaa8aSmrg 300e9fcaa8aSmrg<para> 301e9fcaa8aSmrgThe remaining fields in the indicator map specify the conditions under which 302e9fcaa8aSmrgXkb automatically turns an indicator on or off (only if <emphasis> 303e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 304e9fcaa8aSmrg is not set). If these conditions match the keyboard state, Xkb turns the 305e9fcaa8aSmrgindicator on. If the conditions do not match, Xkb turns the indicator off. 306e9fcaa8aSmrg</para> 307e9fcaa8aSmrg 308e9fcaa8aSmrg</sect3> 309e9fcaa8aSmrg 310eb411b4bSmrg<sect3 id='XkbIndicatorMapRec_which_groups_and_groups_fields'> 311e9fcaa8aSmrg<title>XkbIndicatorMapRec which_groups and groups fields</title> 312e9fcaa8aSmrg 313e9fcaa8aSmrg<para> 314e9fcaa8aSmrgThe <emphasis> 315e9fcaa8aSmrgwhich_groups</emphasis> 316e9fcaa8aSmrg and the <emphasis> 317e9fcaa8aSmrggroups</emphasis> 318e9fcaa8aSmrg fields of an indicator map determine how the keyboard group state affects the 319e9fcaa8aSmrgcorresponding indicator. The <emphasis> 320e9fcaa8aSmrgwhich_groups</emphasis> 321e9fcaa8aSmrg field controls the interpretation of <emphasis> 322e9fcaa8aSmrggroups</emphasis> 323e9fcaa8aSmrg and may contain any one of the following values: 324e9fcaa8aSmrg</para> 325e9fcaa8aSmrg 326e9fcaa8aSmrg<para><programlisting> 327e9fcaa8aSmrg#define XkbIM_UseNone 0 328e9fcaa8aSmrg#define XkbIM_UseBase (1L << 0) 329e9fcaa8aSmrg#define XkbIM_UseLatched (1L << 1) 330e9fcaa8aSmrg#define XkbIM_UseLocked (1L << 2) 331e9fcaa8aSmrg#define XkbIM_UseEffective (1L << 3) 332e9fcaa8aSmrg#define XkbIM_UseAnyGroup XkbIM_UseLatched | XkbIM_UseLocked | 333e9fcaa8aSmrg XkbIM_UseEffective 334e9fcaa8aSmrg</programlisting></para> 335e9fcaa8aSmrg 336e9fcaa8aSmrg<para> 337e9fcaa8aSmrgThe <emphasis> 338e9fcaa8aSmrggroups </emphasis> 339e9fcaa8aSmrgfield specifies what keyboard groups an indicator watches and is the bitwise 340e9fcaa8aSmrginclusive OR of the following valid values: 341e9fcaa8aSmrg</para> 342e9fcaa8aSmrg 343e9fcaa8aSmrg<para><programlisting> 344e9fcaa8aSmrg#define XkbGroup1Mask (1<<0) 345e9fcaa8aSmrg#define XkbGroup2Mask (1<<1) 346e9fcaa8aSmrg#define XkbGroup3Mask (1<<2) 347e9fcaa8aSmrg#define XkbGroup4Mask (1<<3) 348e9fcaa8aSmrg#define XkbAnyGroupMask (1<<7) 349e9fcaa8aSmrg#define XkbAllGroupsMask (0xf) 350e9fcaa8aSmrg</programlisting></para> 351e9fcaa8aSmrg 352e9fcaa8aSmrg<para> 353e9fcaa8aSmrgIf <emphasis> 354e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 355e9fcaa8aSmrg is not set (the keyboard drives the indicator), the effect of <emphasis> 356e9fcaa8aSmrgwhich_groups</emphasis> 357e9fcaa8aSmrg and <emphasis> 358e9fcaa8aSmrggroups</emphasis> 359e9fcaa8aSmrg is shown in Table 8.2. <!-- xref --> 360e9fcaa8aSmrg</para> 361e9fcaa8aSmrg 362eb411b4bSmrg<table frame='topbot'> 363e9fcaa8aSmrg<title>XkbIndicatorMapRec which_groups and groups, Keyboard Drives 364e9fcaa8aSmrgIndicator</title> 365eb411b4bSmrg<?dbfo keep-together="always" ?> 366eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 367eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 368eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 369e9fcaa8aSmrg<thead> 370eb411b4bSmrg<row rowsep='1'> 371e9fcaa8aSmrg <entry>which_groups</entry> 372e9fcaa8aSmrg <entry>Effect</entry> 373e9fcaa8aSmrg </row> 374e9fcaa8aSmrg</thead> 375e9fcaa8aSmrg<tbody> 376eb411b4bSmrg <row> 377e9fcaa8aSmrg <entry>XkbIM_UseNone</entry> 378e9fcaa8aSmrg <entry> 379e9fcaa8aSmrgThe <emphasis> 380e9fcaa8aSmrggroups</emphasis> 381e9fcaa8aSmrg field and the current keyboard group state are ignored. 382e9fcaa8aSmrg </entry> 383e9fcaa8aSmrg </row> 384eb411b4bSmrg <row> 385e9fcaa8aSmrg <entry>XkbIM_UseBase</entry> 386e9fcaa8aSmrg <entry> 387e9fcaa8aSmrgIf <emphasis> 388e9fcaa8aSmrggroups</emphasis> 389e9fcaa8aSmrg is nonzero, the indicator is lit whenever the base keyboard group is nonzero. 390e9fcaa8aSmrgIf <emphasis> 391e9fcaa8aSmrggroups</emphasis> 392e9fcaa8aSmrg is zero, the indicator is lit whenever the base keyboard group is zero. 393e9fcaa8aSmrg </entry> 394e9fcaa8aSmrg </row> 395eb411b4bSmrg <row> 396e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 397e9fcaa8aSmrg <entry> 398e9fcaa8aSmrgIf <emphasis> 399e9fcaa8aSmrggroups</emphasis> 400e9fcaa8aSmrg is nonzero, the indicator is lit whenever the latched keyboard group is 401e9fcaa8aSmrgnonzero. If <emphasis> 402e9fcaa8aSmrggroups</emphasis> 403e9fcaa8aSmrg is zero, the indicator is lit whenever the latched keyboard group is zero. 404e9fcaa8aSmrg </entry> 405e9fcaa8aSmrg </row> 406eb411b4bSmrg <row> 407e9fcaa8aSmrg <entry>XkbIM_UseLocked</entry> 408e9fcaa8aSmrg <entry> 409e9fcaa8aSmrgThe <emphasis> 410e9fcaa8aSmrggroups</emphasis> 411e9fcaa8aSmrg field is interpreted as a mask. The indicator is lit when the current locked 412e9fcaa8aSmrgkeyboard group matches one of the bits that are set in <emphasis> 413e9fcaa8aSmrggroups</emphasis>. 414e9fcaa8aSmrg </entry> 415e9fcaa8aSmrg </row> 416eb411b4bSmrg <row> 417e9fcaa8aSmrg <entry>XkbIM_UseEffective</entry> 418e9fcaa8aSmrg <entry> 419e9fcaa8aSmrgThe <emphasis> 420e9fcaa8aSmrggroups</emphasis> 421e9fcaa8aSmrg field is interpreted as a mask. The indicator is lit when the current 422e9fcaa8aSmrgeffective keyboard group matches one of the bits that are set in <emphasis> 423e9fcaa8aSmrggroups</emphasis> 424e9fcaa8aSmrg. 425e9fcaa8aSmrg </entry> 426e9fcaa8aSmrg </row> 427e9fcaa8aSmrg</tbody> 428e9fcaa8aSmrg</tgroup> 429e9fcaa8aSmrg</table> 430e9fcaa8aSmrg 431e9fcaa8aSmrg<para> 432e9fcaa8aSmrgThe effect of <emphasis> 433e9fcaa8aSmrgwhich_groups</emphasis> 434e9fcaa8aSmrg and <emphasis> 435e9fcaa8aSmrggroups</emphasis> 436e9fcaa8aSmrg when you change an indicator for which <emphasis> 437e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 438e9fcaa8aSmrg is set (the indicator drives the keyboard) is shown in Table 8.3. The "New 439e9fcaa8aSmrgState" column refers to the new state to which you set the indicator. 440e9fcaa8aSmrg</para> 441e9fcaa8aSmrg 442eb411b4bSmrg<table frame='topbot'> 443e9fcaa8aSmrg<title>XkbIndicatorMapRec which_groups and groups, Indicator Drives 444e9fcaa8aSmrgKeyboard</title> 445eb411b4bSmrg<?dbfo keep-together="always" ?> 446eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'> 447eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/> 448eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 449eb411b4bSmrg<colspec colname='c3' colwidth='3.0*'/> 450e9fcaa8aSmrg<thead> 451eb411b4bSmrg<row rowsep='1'> 452e9fcaa8aSmrg <entry>which_groups</entry> 453e9fcaa8aSmrg <entry>New State</entry> 454e9fcaa8aSmrg <entry>Effect on Keyboard Group State</entry> 455e9fcaa8aSmrg </row> 456e9fcaa8aSmrg</thead> 457e9fcaa8aSmrg<tbody> 458eb411b4bSmrg <row> 459e9fcaa8aSmrg <entry>XkbIM_UseNone </entry> 460e9fcaa8aSmrg <entry>On or Off</entry> 461e9fcaa8aSmrg <entry>No effect</entry> 462e9fcaa8aSmrg </row> 463eb411b4bSmrg <row> 464e9fcaa8aSmrg <entry>XkbIM_UseBase</entry> 465e9fcaa8aSmrg <entry>On or Off</entry> 466e9fcaa8aSmrg <entry>No effect</entry> 467e9fcaa8aSmrg </row> 468eb411b4bSmrg <row> 469e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 470e9fcaa8aSmrg <entry>On</entry> 471e9fcaa8aSmrg <entry> 472e9fcaa8aSmrgThe <emphasis> 473e9fcaa8aSmrggroups</emphasis> 474e9fcaa8aSmrg field is treated as a group mask. The keyboard group latch is changed to the 475e9fcaa8aSmrglowest numbered group specified in <emphasis> 476e9fcaa8aSmrggroups</emphasis> 477e9fcaa8aSmrg; if <emphasis> 478e9fcaa8aSmrggroups</emphasis> 479e9fcaa8aSmrg is empty, the keyboard group latch is changed to zero. 480e9fcaa8aSmrg </entry> 481e9fcaa8aSmrg </row> 482eb411b4bSmrg <row> 483e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 484e9fcaa8aSmrg <entry>Off</entry> 485e9fcaa8aSmrg <entry> 486e9fcaa8aSmrgThe <emphasis> 487e9fcaa8aSmrggroups</emphasis> 488e9fcaa8aSmrg field is treated as a group mask. If the indicator is explicitly extinguished, 489e9fcaa8aSmrgkeyboard group latch is changed to the lowest numbered group not specified in 490e9fcaa8aSmrg<emphasis> 491e9fcaa8aSmrggroups</emphasis> 492e9fcaa8aSmrg; if <emphasis> 493e9fcaa8aSmrggroups</emphasis> 494e9fcaa8aSmrg is zero, the keyboard group latch is set to the index of the highest legal 495e9fcaa8aSmrgkeyboard group. 496e9fcaa8aSmrg </entry> 497e9fcaa8aSmrg </row> 498eb411b4bSmrg <row> 499e9fcaa8aSmrg <entry>XkbIM_UseLocked or XkbIM_UseEffective</entry> 500e9fcaa8aSmrg <entry>On</entry> 501e9fcaa8aSmrg <entry> 502e9fcaa8aSmrgIf the <emphasis> 503e9fcaa8aSmrggroups</emphasis> 504e9fcaa8aSmrg mask is empty, group is not changed; otherwise, the locked keyboard group is 505e9fcaa8aSmrgchanged to the lowest numbered group specified in <emphasis> 506e9fcaa8aSmrggroups</emphasis>. 507e9fcaa8aSmrg </entry> 508e9fcaa8aSmrg </row> 509eb411b4bSmrg <row> 510e9fcaa8aSmrg <entry>XkbIM_UseLocked or XkbIM_UseEffective</entry> 511e9fcaa8aSmrg <entry>Off</entry> 512e9fcaa8aSmrg <entry> 513e9fcaa8aSmrgLocked keyboard group is changed to the lowest numbered group that is not 514e9fcaa8aSmrgspecified in the <emphasis> 515e9fcaa8aSmrggroups</emphasis> 516e9fcaa8aSmrg mask, or to <emphasis> 517e9fcaa8aSmrgGroup1</emphasis> 518e9fcaa8aSmrg if the <emphasis> 519e9fcaa8aSmrggroups</emphasis> 520e9fcaa8aSmrg mask contains all keyboard groups. 521e9fcaa8aSmrg </entry> 522e9fcaa8aSmrg </row> 523e9fcaa8aSmrg</tbody> 524e9fcaa8aSmrg</tgroup> 525e9fcaa8aSmrg</table> 526e9fcaa8aSmrg 527e9fcaa8aSmrg</sect3> 528eb411b4bSmrg<sect3 id='XkbIndicatorMapRec_which_mods_and_mods_fields'> 529e9fcaa8aSmrg<title>XkbIndicatorMapRec which_mods and mods fields</title> 530e9fcaa8aSmrg 531e9fcaa8aSmrg<para> 532e9fcaa8aSmrgThe <emphasis> 533e9fcaa8aSmrgmods </emphasis> 534e9fcaa8aSmrgfield specifies what modifiers an indicator watches. The <emphasis> 535e9fcaa8aSmrgmods</emphasis> 536e9fcaa8aSmrg field is an Xkb modifier definition, <emphasis> 537e9fcaa8aSmrgXkbModsRec</emphasis> 538e9fcaa8aSmrg, as described in section 7.2, which can specify both real and virtual <!-- xref --> 539e9fcaa8aSmrgmodifiers. The <emphasis> 540e9fcaa8aSmrgmods</emphasis> 541e9fcaa8aSmrg field takes effect even if some or all of the virtual indicators specified in 542e9fcaa8aSmrg<emphasis> 543e9fcaa8aSmrgmods</emphasis> 544e9fcaa8aSmrg are unbound. To specify the mods field, in general, assign the modifiers of 545e9fcaa8aSmrginterest to <emphasis> 546e9fcaa8aSmrgmods.real_mods</emphasis> 547e9fcaa8aSmrg and the virtual modifiers of interest to <emphasis> 548e9fcaa8aSmrgmods.vmods</emphasis> 549e9fcaa8aSmrg. You can disregard the <emphasis> 550e9fcaa8aSmrgmods.mask</emphasis> 551e9fcaa8aSmrg field unless your application needs to interpret the indicator map directly 552e9fcaa8aSmrg(that is, to simulate automatic indicator behavior on its own). Relatively few 553e9fcaa8aSmrgapplications need to do so, but if you find it necessary, you can either read 554e9fcaa8aSmrgthe indicator map back from the server after you update it (the server 555e9fcaa8aSmrgautomatically updates the mask field whenever any of the real or virtual 556e9fcaa8aSmrgmodifiers are changed in the modifier definition) or you can use <emphasis> 557e9fcaa8aSmrgXkbVirtualModsToReal</emphasis> 558e9fcaa8aSmrg to determine the proper contents for the mask field, assuming that the 559e9fcaa8aSmrg<emphasis> 560e9fcaa8aSmrgXkbDescRec</emphasis> 561e9fcaa8aSmrg contains the virtual modifier definitions. 562e9fcaa8aSmrg</para> 563e9fcaa8aSmrg 564e9fcaa8aSmrg<para> 565e9fcaa8aSmrg<emphasis> 566e9fcaa8aSmrgwhich_mods</emphasis> 567e9fcaa8aSmrg specifies what criteria Xkb uses to determine a match with the corresponding 568e9fcaa8aSmrg<emphasis> 569e9fcaa8aSmrgmods</emphasis> 570e9fcaa8aSmrg field by specifying one or more components of the Xkb keyboard state. If 571e9fcaa8aSmrg<emphasis> 572e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 573e9fcaa8aSmrg is not set (the keyboard drives the indicator), the indicator is lit whenever 574e9fcaa8aSmrgany of the modifiers specified in the <emphasis> 575e9fcaa8aSmrgmask</emphasis> 576e9fcaa8aSmrg field of the<emphasis> 577e9fcaa8aSmrg mods</emphasis> 578e9fcaa8aSmrg modifier definition are also set in any of the current keyboard state 579e9fcaa8aSmrgcomponents specified by <emphasis> 580e9fcaa8aSmrgwhich_mods</emphasis> 581e9fcaa8aSmrg. Remember that the <emphasis> 582e9fcaa8aSmrgmask</emphasis> 583e9fcaa8aSmrg field is comprised of all of the real modifiers specified in the definition 584e9fcaa8aSmrgplus any real modifiers that are bound to the virtual modifiers specified in 585e9fcaa8aSmrgthe definition. (See Chapter 5 for more information on the keyboard state and <!-- xref --> 586e9fcaa8aSmrgChapter 7 for more information on virtual modifiers.) Use a bitwise inclusive 587e9fcaa8aSmrgOR of the following values to compose a value for <emphasis> 588e9fcaa8aSmrgwhich_mods</emphasis>: 589e9fcaa8aSmrg</para> 590e9fcaa8aSmrg 591e9fcaa8aSmrg<para><programlisting> 592e9fcaa8aSmrg#define XkbIM_UseNone 0 593e9fcaa8aSmrg#define XkbIM_UseBase (1L << 0) 594e9fcaa8aSmrg#define XkbIM_UseLatched (1L << 1) 595e9fcaa8aSmrg#define XkbIM_UseLocked (1L << 2) 596e9fcaa8aSmrg#define XkbIM_UseEffective (1L << 3) 597e9fcaa8aSmrg#define XkbIM_UseCompat (1L << 4) 598e9fcaa8aSmrg#define XkbIM_UseAnyMods XkbIM_UseBase | XkbIM_UseLatched | 599e9fcaa8aSmrg XkbIM_UseLocked | XkbIM_UseEffective | 600e9fcaa8aSmrg XkbIM_UseCompat 601e9fcaa8aSmrg</programlisting></para> 602e9fcaa8aSmrg 603e9fcaa8aSmrg<para> 604e9fcaa8aSmrgIf <emphasis> 605e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 606e9fcaa8aSmrg is not set (the keyboard drives the indicator), the effect of <emphasis> 607e9fcaa8aSmrgwhich_mods</emphasis> 608e9fcaa8aSmrg and <emphasis> 609e9fcaa8aSmrgmods</emphasis> 610e9fcaa8aSmrg is shown in Table 8.4 <!-- xref --> 611e9fcaa8aSmrg</para> 612e9fcaa8aSmrg 613eb411b4bSmrg<table frame='topbot'> 614e9fcaa8aSmrg<title>XkbIndicatorMapRec which_mods and mods, Keyboard Drives Indicator</title> 615eb411b4bSmrg<?dbfo keep-together="always" ?> 616eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 617eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 618eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 619e9fcaa8aSmrg<thead> 620eb411b4bSmrg<row rowsep='1'> 621e9fcaa8aSmrg <entry>which_mods</entry> 622e9fcaa8aSmrg <entry>Effect on Keyboard Modifiers</entry> 623e9fcaa8aSmrg </row> 624e9fcaa8aSmrg</thead> 625e9fcaa8aSmrg<tbody> 626eb411b4bSmrg <row> 627e9fcaa8aSmrg <entry>XkbIM_UseNone</entry> 628e9fcaa8aSmrg <entry>The mods field and the current keyboard modifier state are 629e9fcaa8aSmrgignored.</entry> 630e9fcaa8aSmrg </row> 631eb411b4bSmrg <row> 632e9fcaa8aSmrg <entry>XkbIM_UseBase</entry> 633e9fcaa8aSmrg <entry> 634e9fcaa8aSmrgThe indicator is lit when any of the modifiers specified in the <emphasis> 635e9fcaa8aSmrgmask</emphasis> 636e9fcaa8aSmrg field of <emphasis> 637e9fcaa8aSmrgmods</emphasis> 638e9fcaa8aSmrg are on in the keyboard base state. If both <emphasis> 639e9fcaa8aSmrgmods.real_mods</emphasis> 640e9fcaa8aSmrg and <emphasis> 641e9fcaa8aSmrgmods.vmods</emphasis> 642e9fcaa8aSmrg are zero, the indicator is lit when the base keyboard state contains no 643e9fcaa8aSmrgmodifiers. 644e9fcaa8aSmrg </entry> 645e9fcaa8aSmrg </row> 646eb411b4bSmrg <row> 647e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 648e9fcaa8aSmrg <entry> 649e9fcaa8aSmrgThe indicator is lit when any of the modifiers specified in the <emphasis> 650e9fcaa8aSmrgmask</emphasis> 651e9fcaa8aSmrg field of <emphasis> 652e9fcaa8aSmrgmods</emphasis> 653e9fcaa8aSmrg are latched. If both <emphasis> 654e9fcaa8aSmrgmods.real_mods</emphasis> 655e9fcaa8aSmrg and <emphasis> 656e9fcaa8aSmrgmods.vmods</emphasis> 657e9fcaa8aSmrg are zero, the indicator is lit when none of the modifier keys are latched. 658e9fcaa8aSmrg </entry> 659e9fcaa8aSmrg </row> 660eb411b4bSmrg <row> 661e9fcaa8aSmrg <entry>XkbIM_UseLocked</entry> 662e9fcaa8aSmrg <entry> 663e9fcaa8aSmrgThe indicator is lit when any of the modifiers specified in the <emphasis> 664e9fcaa8aSmrgmask</emphasis> 665e9fcaa8aSmrg field of <emphasis> 666e9fcaa8aSmrgmods</emphasis> 667e9fcaa8aSmrg are locked. If both <emphasis> 668e9fcaa8aSmrgmods.real_mods</emphasis> 669e9fcaa8aSmrg and <emphasis> 670e9fcaa8aSmrgmods.vmods</emphasis> 671e9fcaa8aSmrg are zero, the indicator is lit when none of the modifier keys are locked. 672e9fcaa8aSmrg </entry> 673e9fcaa8aSmrg </row> 674eb411b4bSmrg <row> 675e9fcaa8aSmrg <entry>XkbIM_UseEffective</entry> 676e9fcaa8aSmrg <entry> 677e9fcaa8aSmrgThe indicator is lit when any of the modifiers specified in the <emphasis> 678e9fcaa8aSmrgmask</emphasis> 679e9fcaa8aSmrg field of <emphasis> 680e9fcaa8aSmrgmods</emphasis> 681e9fcaa8aSmrg are in the effective keyboard state. If both <emphasis> 682e9fcaa8aSmrgmods.real_mods</emphasis> 683e9fcaa8aSmrg and <emphasis> 684e9fcaa8aSmrgmods.vmods</emphasis> 685e9fcaa8aSmrg are zero, the indicator is lit when the effective keyboard state contains no 686e9fcaa8aSmrgmodifiers. 687e9fcaa8aSmrg </entry> 688e9fcaa8aSmrg </row> 689eb411b4bSmrg <row> 690e9fcaa8aSmrg <entry>XkbIM_UseCompat</entry> 691e9fcaa8aSmrg <entry> 692e9fcaa8aSmrgThe indicator is lit when any of the modifiers specified in the <emphasis> 693e9fcaa8aSmrgmask</emphasis> 694e9fcaa8aSmrg field of <emphasis> 695e9fcaa8aSmrgmods</emphasis> 696e9fcaa8aSmrg are in the keyboard compatibility state. If both <emphasis> 697e9fcaa8aSmrgmods.real_mods</emphasis> 698e9fcaa8aSmrg and <emphasis> 699e9fcaa8aSmrgmods.vmods</emphasis> 700e9fcaa8aSmrg are zero, the indicator is lit when the keyboard compatibility state contains 701e9fcaa8aSmrgno modifiers. 702e9fcaa8aSmrg </entry> 703e9fcaa8aSmrg </row> 704e9fcaa8aSmrg</tbody> 705e9fcaa8aSmrg</tgroup> 706e9fcaa8aSmrg</table> 707e9fcaa8aSmrg 708e9fcaa8aSmrg<para> 709e9fcaa8aSmrgThe effect on the keyboard modifiers of <emphasis> 710e9fcaa8aSmrgwhich_mods</emphasis> 711e9fcaa8aSmrg and <emphasis> 712e9fcaa8aSmrgmods</emphasis> 713e9fcaa8aSmrg when you change an indicator for which <emphasis> 714e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 715e9fcaa8aSmrg is set (the indicator drives the keyboard) is shown in Table 8.5. The "New 716e9fcaa8aSmrgState" column refers to the new state to which you set the indicator. 717e9fcaa8aSmrg</para> <!-- xref --> 718e9fcaa8aSmrg 719eb411b4bSmrg<table frame='topbot'> 720e9fcaa8aSmrg<title>XkbIndicatorMapRec which_mods and mods, Indicator Drives Keyboard</title> 721eb411b4bSmrg<?dbfo keep-together="always" ?> 722eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'> 723eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/> 724eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 725eb411b4bSmrg<colspec colname='c3' colwidth='3.0*'/> 726e9fcaa8aSmrg<thead> 727eb411b4bSmrg<row rowsep='1'> 728e9fcaa8aSmrg <entry>which_mods</entry> 729e9fcaa8aSmrg <entry>New State</entry> 730e9fcaa8aSmrg <entry>Effect on Keyboard Modifiers</entry> 731e9fcaa8aSmrg </row> 732e9fcaa8aSmrg</thead> 733e9fcaa8aSmrg<tbody> 734eb411b4bSmrg <row> 735e9fcaa8aSmrg <entry>XkbIM_UseNone or XkbIM_UseBase</entry> 736e9fcaa8aSmrg <entry>On or Off</entry> 737e9fcaa8aSmrg <entry>No Effect</entry> 738e9fcaa8aSmrg </row> 739eb411b4bSmrg <row> 740e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 741e9fcaa8aSmrg <entry>On</entry> 742e9fcaa8aSmrg <entry> 743e9fcaa8aSmrgAny modifiers specified in the <emphasis> 744e9fcaa8aSmrgmask</emphasis> 745e9fcaa8aSmrg field of <emphasis> 746e9fcaa8aSmrgmods</emphasis> 747e9fcaa8aSmrg are added to the latched modifiers. 748e9fcaa8aSmrg </entry> 749e9fcaa8aSmrg </row> 750eb411b4bSmrg <row> 751e9fcaa8aSmrg <entry>XkbIM_UseLatched</entry> 752e9fcaa8aSmrg <entry>Off</entry> 753e9fcaa8aSmrg <entry> 754e9fcaa8aSmrgAny modifiers specified in the <emphasis> 755e9fcaa8aSmrgmask</emphasis> 756e9fcaa8aSmrg field of <emphasis> 757e9fcaa8aSmrgmods</emphasis> 758e9fcaa8aSmrg are removed from the latched modifiers. 759e9fcaa8aSmrg </entry> 760e9fcaa8aSmrg </row> 761eb411b4bSmrg <row> 762e9fcaa8aSmrg <entry>XkbIM_UseLocked, XkbIM_UseCompat, or XkbIM_UseEffective</entry> 763e9fcaa8aSmrg <entry>On</entry> 764e9fcaa8aSmrg <entry> 765e9fcaa8aSmrgAny modifiers specified in the <emphasis> 766e9fcaa8aSmrgmask</emphasis> 767e9fcaa8aSmrg field of <emphasis> 768e9fcaa8aSmrgmods</emphasis> 769e9fcaa8aSmrg are added to the locked modifiers. 770e9fcaa8aSmrg </entry> 771e9fcaa8aSmrg </row> 772eb411b4bSmrg <row> 773e9fcaa8aSmrg <entry>XkbIM_UseLocked</entry> 774e9fcaa8aSmrg <entry>Off</entry> 775e9fcaa8aSmrg <entry> 776e9fcaa8aSmrgAny modifiers specified in the <emphasis> 777e9fcaa8aSmrgmask</emphasis> 778e9fcaa8aSmrg field of <emphasis> 779e9fcaa8aSmrgmods</emphasis> 780e9fcaa8aSmrg are removed from the locked modifiers. 781e9fcaa8aSmrg </entry> 782e9fcaa8aSmrg </row> 783eb411b4bSmrg <row> 784e9fcaa8aSmrg <entry>XkbIM_UseCompat or XkbIM_UseEffective</entry> 785e9fcaa8aSmrg <entry>Off</entry> 786e9fcaa8aSmrg <entry> 787e9fcaa8aSmrgAny modifiers specified in the <emphasis> 788e9fcaa8aSmrgmask</emphasis> 789e9fcaa8aSmrg field of <emphasis> 790e9fcaa8aSmrgmods</emphasis> 791e9fcaa8aSmrg are removed from both the locked and latched modifiers. 792e9fcaa8aSmrg </entry> 793e9fcaa8aSmrg </row> 794e9fcaa8aSmrg</tbody> 795e9fcaa8aSmrg</tgroup> 796e9fcaa8aSmrg</table> 797e9fcaa8aSmrg 798e9fcaa8aSmrg</sect3> 799eb411b4bSmrg<sect3 id='XkbIndicatorMapRec_ctrls_field'> 800e9fcaa8aSmrg<title>XkbIndicatorMapRec ctrls field</title> 801e9fcaa8aSmrg 802e9fcaa8aSmrg<para> 803e9fcaa8aSmrgThe <emphasis> 804e9fcaa8aSmrgctrls</emphasis> 805e9fcaa8aSmrg field specifies what controls (see Chapter 10) the indicator watches and is 806e9fcaa8aSmrgcomposed using the bitwise inclusive OR of the following values: 807e9fcaa8aSmrg</para> <!-- xref --> 808e9fcaa8aSmrg 809e9fcaa8aSmrg<para><programlisting> 810e9fcaa8aSmrg#define XkbRepeatKeysMask (1L << 0) 811e9fcaa8aSmrg#define XkbSlowKeysMask (1L << 1) 812e9fcaa8aSmrg#define XkbBounceKeysMask (1L << 2) 813e9fcaa8aSmrg#define XkbStickyKeysMask (1L << 3) 814e9fcaa8aSmrg#define XkbMouseKeysMask (1L << 4) 815e9fcaa8aSmrg#define XkbMouseKeysAccelMask (1L << 5) 816e9fcaa8aSmrg#define XkbAccessXKeysMask (1L << 6) 817e9fcaa8aSmrg#define XkbAccessXTimeoutMask (1L << 7) 818e9fcaa8aSmrg#define XkbAccessXFeedbackMask (1L << 8) 819e9fcaa8aSmrg#define XkbAudibleBellMask (1L << 9) 820e9fcaa8aSmrg#define XkbOverlay1Mask (1L << 10) 821e9fcaa8aSmrg#define XkbOverlay2Mask (1L << 11) 822e9fcaa8aSmrg#define XkbAllBooleanCtrlsMask (0x00001FFF) 823e9fcaa8aSmrg</programlisting></para> 824e9fcaa8aSmrg 825e9fcaa8aSmrg<para> 826e9fcaa8aSmrgXkb lights the indicator whenever any of the boolean controls specified in 827e9fcaa8aSmrg<emphasis> 828e9fcaa8aSmrgctrls</emphasis> 829e9fcaa8aSmrg is enabled. 830e9fcaa8aSmrg</para> 831e9fcaa8aSmrg 832e9fcaa8aSmrg 833e9fcaa8aSmrg</sect3> 834e9fcaa8aSmrg</sect2> 835e9fcaa8aSmrg</sect1> 836eb411b4bSmrg<sect1 id='Getting_Information_About_Indicators'> 837e9fcaa8aSmrg<title>Getting Information About Indicators</title> 838e9fcaa8aSmrg 839e9fcaa8aSmrg<para> 840e9fcaa8aSmrgXkb allows applications to obtain information about indicators using two 841e9fcaa8aSmrgdifferent methods. The first method, which is similar to the core X 842e9fcaa8aSmrgimplementation, uses a mask to specify the indicators. The second method, which 843e9fcaa8aSmrgis more suitable for applications concerned with interoperability, uses 844e9fcaa8aSmrgindicator names. The correspondence between the indicator name and the bit 845e9fcaa8aSmrgposition in masks is as follows: one of the parameters returned from <emphasis> 846e9fcaa8aSmrgXkbGetNamedIndicators</emphasis> 847e9fcaa8aSmrg is an index that is the bit position to use in any function call that requires 848e9fcaa8aSmrga mask of indicator bits, as well as the indicator’s index into the <emphasis> 849e9fcaa8aSmrgXkbIndicatorRec</emphasis> 850e9fcaa8aSmrg array of indicator maps. 851e9fcaa8aSmrg</para> 852e9fcaa8aSmrg 853e9fcaa8aSmrg 854eb411b4bSmrg<sect2 id='Getting_Indicator_State'> 855e9fcaa8aSmrg<title>Getting Indicator State</title> 856e9fcaa8aSmrg 857e9fcaa8aSmrg<para> 858e9fcaa8aSmrgBecause the state of the indicators is relatively volatile, the keyboard 859e9fcaa8aSmrgdescription does not hold the current state of the indicators. To obtain the 860e9fcaa8aSmrgcurrent state of the keyboard indicators, use <emphasis> 861e9fcaa8aSmrgXkbGetIndicatorState</emphasis>. 862e9fcaa8aSmrg</para> 863e9fcaa8aSmrg 864e9fcaa8aSmrg<informaltable frame='none'> 865eb411b4bSmrg<?dbfo keep-together="always" ?> 866eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 867eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 868e9fcaa8aSmrg<tbody> 869eb411b4bSmrg <row> 870e9fcaa8aSmrg <entry role='functiondecl'> 871e9fcaa8aSmrgStatus <emphasis> 872e9fcaa8aSmrgXkbGetIndicatorState</emphasis> 873e9fcaa8aSmrg(<emphasis> 874e9fcaa8aSmrgdisplay</emphasis> 875e9fcaa8aSmrg, <emphasis> 876e9fcaa8aSmrgdevice_spec</emphasis> 877e9fcaa8aSmrg, <emphasis> 878e9fcaa8aSmrgstate_return</emphasis> 879e9fcaa8aSmrg) 880e9fcaa8aSmrg </entry> 881e9fcaa8aSmrg </row> 882eb411b4bSmrg <row> 883e9fcaa8aSmrg <entry role='functionargdecl'> 884e9fcaa8aSmrgDisplay * <emphasis> 885e9fcaa8aSmrgdisplay</emphasis> 886e9fcaa8aSmrg; /* connection to the X server */ 887e9fcaa8aSmrg </entry> 888e9fcaa8aSmrg </row> 889eb411b4bSmrg <row> 890e9fcaa8aSmrg <entry role='functionargdecl'> 891e9fcaa8aSmrgunsigned int <emphasis> 892e9fcaa8aSmrgdevice_spec</emphasis> 893e9fcaa8aSmrg; /* device ID, or <emphasis> 894e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 895e9fcaa8aSmrg */ 896e9fcaa8aSmrg </entry> 897e9fcaa8aSmrg </row> 898eb411b4bSmrg <row> 899e9fcaa8aSmrg <entry role='functionargdecl'> 900e9fcaa8aSmrgunsigned int * <emphasis> 901e9fcaa8aSmrgstate_return</emphasis> 902e9fcaa8aSmrg; /* backfilled with a mask of the indicator state */ 903e9fcaa8aSmrg </entry> 904e9fcaa8aSmrg</row> 905e9fcaa8aSmrg</tbody> 906e9fcaa8aSmrg</tgroup> 907e9fcaa8aSmrg</informaltable> 908e9fcaa8aSmrg 909e9fcaa8aSmrg<para> 910e9fcaa8aSmrg<emphasis> 911e9fcaa8aSmrgXkbGetIndicatorState</emphasis> 912e9fcaa8aSmrg queries the <emphasis> 913e9fcaa8aSmrgdisplay</emphasis> 914e9fcaa8aSmrg for the state of the indicators on the device specified by the <emphasis> 915e9fcaa8aSmrgdevice_spec</emphasis> 916e9fcaa8aSmrg. For each indicator that is "turned on" on the device, the associated bit is 917e9fcaa8aSmrgset in <emphasis> 918e9fcaa8aSmrgstate_return</emphasis> 919e9fcaa8aSmrg. If a compatible version of the Xkb extension is not available in the server, 920e9fcaa8aSmrg<emphasis> 921e9fcaa8aSmrgXkbGetIndicatorState</emphasis> 922e9fcaa8aSmrg returns a <emphasis> 923e9fcaa8aSmrgBadMatch</emphasis> 924e9fcaa8aSmrg error. Otherwise, it sends the request to the X server, places the state of 925e9fcaa8aSmrgthe indicators into <emphasis> 926e9fcaa8aSmrgstate_return,</emphasis> 927e9fcaa8aSmrg and returns <emphasis> 928e9fcaa8aSmrgSuccess</emphasis> 929e9fcaa8aSmrg. Thus the value reported by <emphasis> 930e9fcaa8aSmrgXkbGetIndicatorState</emphasis> 931e9fcaa8aSmrg is identical to the value reported by the core protocol. 932e9fcaa8aSmrg</para> 933e9fcaa8aSmrg 934e9fcaa8aSmrg 935e9fcaa8aSmrg</sect2> 936eb411b4bSmrg<sect2 id='Getting_Indicator_Information_by_Index'> 937e9fcaa8aSmrg<title>Getting Indicator Information by Index</title> 938e9fcaa8aSmrg 939e9fcaa8aSmrg<para> 940e9fcaa8aSmrgTo get the map for one or more indicators, using a mask to specify the 941e9fcaa8aSmrgindicators, use <emphasis> 942e9fcaa8aSmrgXkbGetIndicatorMap</emphasis>. 943e9fcaa8aSmrg</para> 944e9fcaa8aSmrg 945e9fcaa8aSmrg<informaltable frame='none'> 946eb411b4bSmrg<?dbfo keep-together="always" ?> 947eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 948eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 949e9fcaa8aSmrg<tbody> 950eb411b4bSmrg <row> 951e9fcaa8aSmrg <entry role='functiondecl'> 952e9fcaa8aSmrgStatus <emphasis> 953e9fcaa8aSmrgXkbGetIndicatorMap</emphasis> 954e9fcaa8aSmrg(<emphasis> 955e9fcaa8aSmrgdpy</emphasis> 956e9fcaa8aSmrg,<emphasis> 957e9fcaa8aSmrg which</emphasis> 958e9fcaa8aSmrg,<emphasis> 959e9fcaa8aSmrg desc</emphasis> 960e9fcaa8aSmrg) 961e9fcaa8aSmrg </entry> 962e9fcaa8aSmrg </row> 963eb411b4bSmrg <row> 964e9fcaa8aSmrg <entry role='functionargdecl'> 965e9fcaa8aSmrgDisplay * <emphasis> 966e9fcaa8aSmrgdpy</emphasis> 967e9fcaa8aSmrg; /* connection to the X server */ 968e9fcaa8aSmrg </entry> 969e9fcaa8aSmrg </row> 970eb411b4bSmrg <row> 971e9fcaa8aSmrg <entry role='functionargdecl'> 972e9fcaa8aSmrgunsigned int <emphasis> 973e9fcaa8aSmrgwhich</emphasis> 974e9fcaa8aSmrg; /* mask of indicators for which maps should be returned */ 975e9fcaa8aSmrg </entry> 976e9fcaa8aSmrg </row> 977eb411b4bSmrg <row> 978e9fcaa8aSmrg <entry role='functionargdecl'> 979e9fcaa8aSmrgXkbDescPtr <emphasis> 980e9fcaa8aSmrgdesc</emphasis> 981e9fcaa8aSmrg; /* keyboard description to be updated */ 982e9fcaa8aSmrg </entry> 983e9fcaa8aSmrg</row> 984e9fcaa8aSmrg</tbody> 985e9fcaa8aSmrg</tgroup> 986e9fcaa8aSmrg</informaltable> 987e9fcaa8aSmrg 988e9fcaa8aSmrg<para> 989e9fcaa8aSmrg<emphasis> 990e9fcaa8aSmrgXkbGetIndicatorMap</emphasis> 991e9fcaa8aSmrg obtains the maps from the server for only those indicators specified by the 992e9fcaa8aSmrg<emphasis> 993e9fcaa8aSmrgwhich</emphasis> 994e9fcaa8aSmrg mask and copies the values into the keyboard description specified by 995e9fcaa8aSmrg<emphasis> 996e9fcaa8aSmrgdesc</emphasis> 997e9fcaa8aSmrg. If the <emphasis> 998e9fcaa8aSmrgindicators</emphasis> 999e9fcaa8aSmrg field of the <emphasis> 1000e9fcaa8aSmrgdesc</emphasis> 1001e9fcaa8aSmrg parameter is <emphasis> 1002e9fcaa8aSmrgNULL</emphasis> 1003e9fcaa8aSmrg, <emphasis> 1004e9fcaa8aSmrgXkbGetIndicatorMap</emphasis> 1005e9fcaa8aSmrg allocates and initializes it. 1006e9fcaa8aSmrg</para> 1007e9fcaa8aSmrg 1008e9fcaa8aSmrg 1009e9fcaa8aSmrg<para> 1010e9fcaa8aSmrg<emphasis> 1011e9fcaa8aSmrgXkbGetIndicatorMap</emphasis> 1012e9fcaa8aSmrg can generate <emphasis> 1013e9fcaa8aSmrgBadAlloc</emphasis> 1014e9fcaa8aSmrg, <emphasis> 1015e9fcaa8aSmrgBadLength</emphasis> 1016e9fcaa8aSmrg, <emphasis> 1017e9fcaa8aSmrgBadMatch</emphasis> 1018e9fcaa8aSmrg, and <emphasis> 1019e9fcaa8aSmrgBadImplementation</emphasis> 1020e9fcaa8aSmrg errors. 1021e9fcaa8aSmrg</para> 1022e9fcaa8aSmrg 1023e9fcaa8aSmrg 1024e9fcaa8aSmrg<para> 1025e9fcaa8aSmrgTo free the indicator maps, use <emphasis> 1026e9fcaa8aSmrgXkbFreeIndicatorMaps</emphasis> 1027e9fcaa8aSmrg (see section 8.6). 1028e9fcaa8aSmrg</para> 1029e9fcaa8aSmrg 1030e9fcaa8aSmrg 1031e9fcaa8aSmrg</sect2> 1032eb411b4bSmrg<sect2 id='Getting_Indicator_Information_by_Name'> 1033e9fcaa8aSmrg<title>Getting Indicator Information by Name</title> 1034e9fcaa8aSmrg 1035e9fcaa8aSmrg<para> 1036e9fcaa8aSmrgXkb also allows applications to refer to indicators by name. Use <emphasis> 1037e9fcaa8aSmrgXkbGetNames</emphasis> 1038e9fcaa8aSmrg to get the indicator names (see Chapter 18). Using names eliminates the need 1039e9fcaa8aSmrgfor hard-coding bitmask values for particular keyboards. For example, instead 1040e9fcaa8aSmrgof using vendor-specific constants such as <emphasis> 1041e9fcaa8aSmrgWSKBLed_ScrollLock</emphasis> 1042e9fcaa8aSmrg mask on Digital workstations or <emphasis> 1043e9fcaa8aSmrgXLED_SCROLL_LOCK</emphasis> 1044e9fcaa8aSmrg on Sun workstations, you can instead use <emphasis> 1045e9fcaa8aSmrgXkbGetNamedIndicator</emphasis> 1046e9fcaa8aSmrg to look up information on the indicator named "Scroll Lock." 1047e9fcaa8aSmrg</para> 1048e9fcaa8aSmrg 1049e9fcaa8aSmrg<para> 1050e9fcaa8aSmrgUse <emphasis> 1051e9fcaa8aSmrgXkbGetNamedIndicator</emphasis> 1052e9fcaa8aSmrg to look up the indicator map and other information for an indicator by name. 1053e9fcaa8aSmrg</para> 1054e9fcaa8aSmrg 1055e9fcaa8aSmrg<informaltable frame='none'> 1056eb411b4bSmrg<?dbfo keep-together="always" ?> 1057eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1058eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1059e9fcaa8aSmrg<tbody> 1060eb411b4bSmrg <row> 1061e9fcaa8aSmrg <entry role='functiondecl'> 1062e9fcaa8aSmrgBool <emphasis> 1063e9fcaa8aSmrgXkbGetNamedIndicator</emphasis> 1064e9fcaa8aSmrg(<emphasis> 1065e9fcaa8aSmrgdpy</emphasis> 1066e9fcaa8aSmrg,<emphasis> 1067e9fcaa8aSmrg dev_spec</emphasis> 1068e9fcaa8aSmrg,<emphasis> 1069e9fcaa8aSmrg name</emphasis> 1070e9fcaa8aSmrg,<emphasis> 1071e9fcaa8aSmrg ndx_rtrn</emphasis> 1072e9fcaa8aSmrg,<emphasis> 1073e9fcaa8aSmrg state_rtrn</emphasis> 1074e9fcaa8aSmrg,<emphasis> 1075e9fcaa8aSmrg map_rtrn</emphasis> 1076e9fcaa8aSmrg, <emphasis> 1077e9fcaa8aSmrgreal_rtrn</emphasis> 1078e9fcaa8aSmrg) 1079e9fcaa8aSmrg </entry> 1080e9fcaa8aSmrg </row> 1081eb411b4bSmrg <row> 1082e9fcaa8aSmrg <entry role='functionargdecl'> 1083e9fcaa8aSmrgDisplay * <emphasis> 1084e9fcaa8aSmrgdpy</emphasis> 1085e9fcaa8aSmrg; /* connection to the X server */ 1086e9fcaa8aSmrg </entry> 1087e9fcaa8aSmrg </row> 1088eb411b4bSmrg <row> 1089e9fcaa8aSmrg <entry role='functionargdecl'> 1090e9fcaa8aSmrgunsigned int <emphasis> 1091e9fcaa8aSmrg device_spec</emphasis> 1092e9fcaa8aSmrg; /* keyboard device ID, or <emphasis> 1093e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 1094e9fcaa8aSmrg */ 1095e9fcaa8aSmrg </entry> 1096e9fcaa8aSmrg </row> 1097eb411b4bSmrg <row> 1098e9fcaa8aSmrg <entry role='functionargdecl'> 1099e9fcaa8aSmrgAtom <emphasis> 1100e9fcaa8aSmrg name</emphasis> 1101e9fcaa8aSmrg; /* name of the indicator to be retrieved */ 1102e9fcaa8aSmrg </entry> 1103e9fcaa8aSmrg </row> 1104eb411b4bSmrg <row> 1105e9fcaa8aSmrg <entry role='functionargdecl'> 1106e9fcaa8aSmrgint * <emphasis> 1107e9fcaa8aSmrgndx_rtrn</emphasis> 1108e9fcaa8aSmrg; /* backfilled with the index of the retrieved indicator */ 1109e9fcaa8aSmrg </entry> 1110e9fcaa8aSmrg </row> 1111eb411b4bSmrg <row> 1112e9fcaa8aSmrg <entry role='functionargdecl'> 1113e9fcaa8aSmrgBool * <emphasis> 1114e9fcaa8aSmrgstate_rtrn</emphasis> 1115e9fcaa8aSmrg; /* backfilled with the current state of the retrieved indicator */ 1116e9fcaa8aSmrg </entry> 1117e9fcaa8aSmrg </row> 1118eb411b4bSmrg <row> 1119e9fcaa8aSmrg <entry role='functionargdecl'> 1120e9fcaa8aSmrgXkbIndicatorMapPtr <emphasis> 1121e9fcaa8aSmrg map_rtrn</emphasis> 1122e9fcaa8aSmrg; /* backfilled with the mapping for the retrieved indicator */ 1123e9fcaa8aSmrg </entry> 1124e9fcaa8aSmrg </row> 1125eb411b4bSmrg <row> 1126e9fcaa8aSmrg <entry role='functionargdecl'> 1127e9fcaa8aSmrgBool * <emphasis> 1128e9fcaa8aSmrgreal_rtrn</emphasis> 1129e9fcaa8aSmrg; /* backfilled with <emphasis> 1130e9fcaa8aSmrgTrue</emphasis> 1131e9fcaa8aSmrg if the named indicator is real (physical) */ 1132e9fcaa8aSmrg </entry> 1133e9fcaa8aSmrg</row> 1134e9fcaa8aSmrg</tbody> 1135e9fcaa8aSmrg</tgroup> 1136e9fcaa8aSmrg</informaltable> 1137e9fcaa8aSmrg 1138e9fcaa8aSmrg<para> 1139e9fcaa8aSmrgIf the device specified by <emphasis> 1140e9fcaa8aSmrgdevice_spec</emphasis> 1141e9fcaa8aSmrg has an indicator named <emphasis> 1142e9fcaa8aSmrgname</emphasis> 1143e9fcaa8aSmrg,<emphasis> 1144e9fcaa8aSmrg XkbGetNamedIndicator</emphasis> 1145e9fcaa8aSmrg returns <emphasis> 1146e9fcaa8aSmrgTrue</emphasis> 1147e9fcaa8aSmrg and populates the rest of the parameters with information about the indicator. 1148e9fcaa8aSmrgOtherwise, <emphasis> 1149e9fcaa8aSmrgXkbGetNamedIndicator</emphasis> 1150e9fcaa8aSmrg returns <emphasis> 1151e9fcaa8aSmrgFalse</emphasis> 1152e9fcaa8aSmrg. 1153e9fcaa8aSmrg</para> 1154e9fcaa8aSmrg 1155e9fcaa8aSmrg 1156e9fcaa8aSmrg<para> 1157e9fcaa8aSmrgThe <emphasis> 1158e9fcaa8aSmrgndx_rtrn</emphasis> 1159e9fcaa8aSmrg field returns the zero-based index of the named indicator. This index is the 1160e9fcaa8aSmrgbit position to use in any function call that requires a mask of indicator 1161e9fcaa8aSmrgbits, as well as the indicator’s index into the <emphasis> 1162e9fcaa8aSmrgXkbIndicatorRec</emphasis> 1163e9fcaa8aSmrg array of indicator maps. <emphasis> 1164e9fcaa8aSmrgstate_rtrn</emphasis> 1165e9fcaa8aSmrg returns the current state of the named indicator (<emphasis> 1166e9fcaa8aSmrgTrue</emphasis> 1167e9fcaa8aSmrg = on, <emphasis> 1168e9fcaa8aSmrgFalse</emphasis> 1169e9fcaa8aSmrg = off). <emphasis> 1170e9fcaa8aSmrgmap_rtrn</emphasis> 1171e9fcaa8aSmrg returns the indicator map for the named indicator. In addition, if the 1172e9fcaa8aSmrgindicator is mapped to a physical LED, the <emphasis> 1173e9fcaa8aSmrgreal_rtrn</emphasis> 1174e9fcaa8aSmrg parameter is set to <emphasis> 1175e9fcaa8aSmrgTrue</emphasis> 1176e9fcaa8aSmrg. 1177e9fcaa8aSmrg</para> 1178e9fcaa8aSmrg 1179e9fcaa8aSmrg 1180e9fcaa8aSmrg<para> 1181e9fcaa8aSmrgEach of the "<emphasis> 1182e9fcaa8aSmrg_rtrn</emphasis> 1183e9fcaa8aSmrg" arguments is optional; you can pass <emphasis> 1184e9fcaa8aSmrgNULL</emphasis> 1185e9fcaa8aSmrg for any unneeded "<emphasis> 1186e9fcaa8aSmrg_rtrn</emphasis> 1187e9fcaa8aSmrg" arguments. 1188e9fcaa8aSmrg</para> 1189e9fcaa8aSmrg 1190e9fcaa8aSmrg 1191e9fcaa8aSmrg<para> 1192e9fcaa8aSmrg<emphasis> 1193e9fcaa8aSmrgXkbGetNamedIndicator</emphasis> 1194e9fcaa8aSmrg can generate <emphasis> 1195e9fcaa8aSmrgBadAtom</emphasis> 1196e9fcaa8aSmrg and <emphasis> 1197e9fcaa8aSmrgBadImplementation</emphasis> 1198e9fcaa8aSmrg errors. 1199e9fcaa8aSmrg</para> 1200e9fcaa8aSmrg 1201e9fcaa8aSmrg 1202e9fcaa8aSmrg</sect2> 1203e9fcaa8aSmrg</sect1> 1204eb411b4bSmrg<sect1 id='Changing_Indicator_Maps_and_State'> 1205e9fcaa8aSmrg<title>Changing Indicator Maps and State</title> 1206e9fcaa8aSmrg 1207e9fcaa8aSmrg<para> 1208e9fcaa8aSmrgJust as you can get the indicator map using a mask or using an indicator name, 1209e9fcaa8aSmrgso you can change it using a mask or a name. 1210e9fcaa8aSmrg</para> 1211e9fcaa8aSmrg 1212e9fcaa8aSmrg<note><para>You cannot change the <emphasis> 1213e9fcaa8aSmrgphys_indicators</emphasis> 1214e9fcaa8aSmrg field of the indicators structure. The only way to change the <emphasis> 1215e9fcaa8aSmrgphys_indicators</emphasis> 1216e9fcaa8aSmrg field is to change the keyboard map.</para></note> 1217e9fcaa8aSmrg 1218e9fcaa8aSmrg<para> 1219e9fcaa8aSmrgThere are two ways to make changes to indicator maps and state: either change a 1220e9fcaa8aSmrglocal copy of the indicator maps and use <emphasis> 1221e9fcaa8aSmrgXkbSetIndicatorMap</emphasis> 1222e9fcaa8aSmrg or <emphasis> 1223e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1224e9fcaa8aSmrg, or, to reduce network traffic, use an<emphasis> 1225e9fcaa8aSmrg XkbIndicatorChangesRec</emphasis> 1226e9fcaa8aSmrg structure and use <emphasis> 1227e9fcaa8aSmrgXkbChangeIndicators</emphasis>. 1228e9fcaa8aSmrg</para> 1229e9fcaa8aSmrg 1230e9fcaa8aSmrg 1231eb411b4bSmrg<sect2 id='Effects_of_Explicit_Changes_on_Indicators'> 1232e9fcaa8aSmrg<title>Effects of Explicit Changes on Indicators</title> 1233e9fcaa8aSmrg 1234e9fcaa8aSmrg<para> 1235e9fcaa8aSmrgThis section discusses the effects of explicitly changing indicators depending 1236e9fcaa8aSmrgupon different settings in the indicator map. See Tables 8.3 and Table 8.5 for 1237e9fcaa8aSmrginformation on the effects of the indicator map fields when explicit changes 1238e9fcaa8aSmrgare made. 1239e9fcaa8aSmrg</para> 1240e9fcaa8aSmrg 1241e9fcaa8aSmrg 1242e9fcaa8aSmrg<para> 1243e9fcaa8aSmrgIf <emphasis> 1244e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 1245e9fcaa8aSmrg is set and <emphasis> 1246e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 1247e9fcaa8aSmrg is not, and if you call a function that updates the server’s image of the 1248e9fcaa8aSmrgindicator map (such as <emphasis> 1249e9fcaa8aSmrgXkbSetIndicatorMap</emphasis> 1250e9fcaa8aSmrg or <emphasis> 1251e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1252e9fcaa8aSmrg), Xkb changes the keyboard state and controls to reflect the other fields of 1253e9fcaa8aSmrgthe indicator map. If you attempt to explicitly change the value of an 1254e9fcaa8aSmrgindicator for which <emphasis> 1255e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 1256e9fcaa8aSmrg is absent or for which <emphasis> 1257e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 1258e9fcaa8aSmrg is present, keyboard state or controls are unaffected. 1259e9fcaa8aSmrg</para> 1260e9fcaa8aSmrg 1261e9fcaa8aSmrg 1262e9fcaa8aSmrg<para> 1263e9fcaa8aSmrgIf neither <emphasis> 1264e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 1265e9fcaa8aSmrg nor <emphasis> 1266e9fcaa8aSmrgXkbIM_NoExplicit</emphasis> 1267e9fcaa8aSmrg is set in an indicator map, Xkb honors any request to change the state of the 1268e9fcaa8aSmrgindicator, but the new state might be immediately superseded by automatic 1269e9fcaa8aSmrgchanges to the indicator state if the keyboard state or controls change. 1270e9fcaa8aSmrg</para> 1271e9fcaa8aSmrg 1272e9fcaa8aSmrg 1273e9fcaa8aSmrg<para> 1274e9fcaa8aSmrgThe effects of changing an indicator that drives the keyboard are cumulative; 1275e9fcaa8aSmrgit is possible for a single change to affect keyboard group, modifiers, and 1276e9fcaa8aSmrgcontrols simultaneously. 1277e9fcaa8aSmrg</para> 1278e9fcaa8aSmrg 1279e9fcaa8aSmrg 1280e9fcaa8aSmrg<para> 1281e9fcaa8aSmrgIf you change an indicator for which both the <emphasis> 1282e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 1283e9fcaa8aSmrg and <emphasis> 1284e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 1285e9fcaa8aSmrg flags are specified, Xkb applies the keyboard changes specified in the other 1286e9fcaa8aSmrgindicator map fields and changes the indicator to reflect the state that was 1287e9fcaa8aSmrgexplicitly requested. The indicator remains in the new state until it is 1288e9fcaa8aSmrgexplicitly changed again. 1289e9fcaa8aSmrg</para> 1290e9fcaa8aSmrg 1291e9fcaa8aSmrg 1292e9fcaa8aSmrg<para> 1293e9fcaa8aSmrgIf the <emphasis> 1294e9fcaa8aSmrgXkbIM_NoAutomatic</emphasis> 1295e9fcaa8aSmrg flag is not set and <emphasis> 1296e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 1297e9fcaa8aSmrg is set, Xkb applies the changes specified in the other indicator map fields 1298e9fcaa8aSmrgand sets the state of the indicator to the values specified by the indicator 1299e9fcaa8aSmrgmap. Note that it is possible in this case for the indicator to end up in a 1300e9fcaa8aSmrgdifferent state than the one that was explicitly requested. For example, Xkb 1301e9fcaa8aSmrgdoes not extinguish an indicator with <emphasis> 1302e9fcaa8aSmrgwhich_mods</emphasis> 1303e9fcaa8aSmrg of <emphasis> 1304e9fcaa8aSmrgXkbIM_UseBase</emphasis> 1305e9fcaa8aSmrg and <emphasis> 1306e9fcaa8aSmrgmods</emphasis> 1307e9fcaa8aSmrg of <emphasis> 1308e9fcaa8aSmrgShift</emphasis> 1309e9fcaa8aSmrg if, at the time Xkb processes the request to extinguish the indicator, one of 1310e9fcaa8aSmrgthe <emphasis> 1311e9fcaa8aSmrgShift</emphasis> 1312e9fcaa8aSmrg keys is physically depressed. 1313e9fcaa8aSmrg</para> 1314e9fcaa8aSmrg 1315e9fcaa8aSmrg 1316e9fcaa8aSmrg<para> 1317e9fcaa8aSmrgIf you explicitly light an indicator for which <emphasis> 1318e9fcaa8aSmrgXkbIM_LEDDrivesKB</emphasis> 1319e9fcaa8aSmrg is set, Xkb enables all of the boolean controls specified in the <emphasis> 1320e9fcaa8aSmrgctrls</emphasis> 1321e9fcaa8aSmrg field of its indicator map. Explicitly extinguishing such an indicator causes 1322e9fcaa8aSmrgXkb to disable all of the boolean controls specified in <emphasis> 1323e9fcaa8aSmrgctrls</emphasis> 1324e9fcaa8aSmrg. 1325e9fcaa8aSmrg</para> 1326e9fcaa8aSmrg 1327e9fcaa8aSmrg 1328e9fcaa8aSmrg</sect2> 1329eb411b4bSmrg<sect2 id='Changing_Indicator_Maps_by_Index'> 1330e9fcaa8aSmrg<title>Changing Indicator Maps by Index</title> 1331e9fcaa8aSmrg 1332e9fcaa8aSmrg<para> 1333e9fcaa8aSmrgTo update the maps for one or more indicators, first modify a local copy of the 1334e9fcaa8aSmrgkeyboard description, then use <emphasis> 1335e9fcaa8aSmrgXkbSetIndicatorMap</emphasis> 1336e9fcaa8aSmrg to download the changes to the server: 1337e9fcaa8aSmrg</para> 1338e9fcaa8aSmrg 1339e9fcaa8aSmrg<informaltable frame='none'> 1340eb411b4bSmrg<?dbfo keep-together="always" ?> 1341eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1342eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1343e9fcaa8aSmrg<tbody> 1344eb411b4bSmrg <row> 1345e9fcaa8aSmrg <entry role='functiondecl'> 1346e9fcaa8aSmrgBool<emphasis> 1347e9fcaa8aSmrg XkbSetIndicatorMap</emphasis> 1348e9fcaa8aSmrg(<emphasis> 1349e9fcaa8aSmrgdpy</emphasis> 1350e9fcaa8aSmrg,<emphasis> 1351e9fcaa8aSmrg which</emphasis> 1352e9fcaa8aSmrg,<emphasis> 1353e9fcaa8aSmrg desc</emphasis> 1354e9fcaa8aSmrg) 1355e9fcaa8aSmrg </entry> 1356e9fcaa8aSmrg </row> 1357eb411b4bSmrg <row> 1358e9fcaa8aSmrg <entry role='functionargdecl'> 1359e9fcaa8aSmrgDisplay * <emphasis> 1360e9fcaa8aSmrgdpy</emphasis> 1361e9fcaa8aSmrg; /* connection to the X server */ 1362e9fcaa8aSmrg </entry> 1363e9fcaa8aSmrg </row> 1364eb411b4bSmrg <row> 1365e9fcaa8aSmrg <entry role='functionargdecl'> 1366e9fcaa8aSmrgunsigned int <emphasis> 1367e9fcaa8aSmrgwhich</emphasis> 1368e9fcaa8aSmrg; /* mask of indicators to change */ 1369e9fcaa8aSmrg </entry> 1370e9fcaa8aSmrg </row> 1371eb411b4bSmrg <row> 1372e9fcaa8aSmrg <entry role='functionargdecl'> 1373e9fcaa8aSmrgXkbDescPtr <emphasis> 1374e9fcaa8aSmrgdesc</emphasis> 1375e9fcaa8aSmrg; /* keyboard description from which the maps are taken */ 1376e9fcaa8aSmrg </entry> 1377e9fcaa8aSmrg</row> 1378e9fcaa8aSmrg</tbody> 1379e9fcaa8aSmrg</tgroup> 1380e9fcaa8aSmrg</informaltable> 1381e9fcaa8aSmrg 1382e9fcaa8aSmrg<para> 1383e9fcaa8aSmrgFor each<emphasis> 1384e9fcaa8aSmrg </emphasis> 1385e9fcaa8aSmrgbit set in the <emphasis> 1386e9fcaa8aSmrgwhich </emphasis> 1387e9fcaa8aSmrgparameter,<emphasis> 1388e9fcaa8aSmrg XkbSetIndicatorMap</emphasis> 1389e9fcaa8aSmrg sends the corresponding indicator map from the <emphasis> 1390e9fcaa8aSmrgdesc</emphasis> 1391e9fcaa8aSmrg parameter to the server. 1392e9fcaa8aSmrg</para> 1393e9fcaa8aSmrg 1394e9fcaa8aSmrg 1395e9fcaa8aSmrg</sect2> 1396eb411b4bSmrg<sect2 id='Changing_Indicator_Maps_by_Name'> 1397e9fcaa8aSmrg<title>Changing Indicator Maps by Name</title> 1398e9fcaa8aSmrg 1399e9fcaa8aSmrg<para> 1400e9fcaa8aSmrg<emphasis> 1401e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1402e9fcaa8aSmrg can do several related things: 1403e9fcaa8aSmrg</para> 1404e9fcaa8aSmrg 1405e9fcaa8aSmrg<itemizedlist> 1406e9fcaa8aSmrg<listitem> 1407e9fcaa8aSmrg <para> 1408e9fcaa8aSmrgName an indicator if it is not already named 1409e9fcaa8aSmrg </para> 1410e9fcaa8aSmrg</listitem> 1411e9fcaa8aSmrg<listitem> 1412e9fcaa8aSmrg <para> 1413e9fcaa8aSmrgToggle the state of the indicator 1414e9fcaa8aSmrg </para> 1415e9fcaa8aSmrg</listitem> 1416e9fcaa8aSmrg<listitem> 1417e9fcaa8aSmrg <para> 1418e9fcaa8aSmrgSet the indicator to a specified state 1419e9fcaa8aSmrg </para> 1420e9fcaa8aSmrg</listitem> 1421e9fcaa8aSmrg<listitem> 1422e9fcaa8aSmrg <para> 1423e9fcaa8aSmrgSet the indicator map for the indicator 1424e9fcaa8aSmrg </para> 1425e9fcaa8aSmrg</listitem> 1426e9fcaa8aSmrg</itemizedlist> 1427e9fcaa8aSmrg 1428e9fcaa8aSmrg<informaltable frame='none'> 1429eb411b4bSmrg<?dbfo keep-together="always" ?> 1430eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1431eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1432e9fcaa8aSmrg<tbody> 1433eb411b4bSmrg <row> 1434e9fcaa8aSmrg <entry role='functiondecl'> 1435e9fcaa8aSmrgBool<emphasis> 1436e9fcaa8aSmrg XkbSetNamedIndicator</emphasis> 1437e9fcaa8aSmrg(<emphasis> 1438e9fcaa8aSmrgdpy</emphasis> 1439e9fcaa8aSmrg,<emphasis> 1440e9fcaa8aSmrg device_spec</emphasis> 1441e9fcaa8aSmrg,<emphasis> 1442e9fcaa8aSmrg name</emphasis> 1443e9fcaa8aSmrg,<emphasis> 1444e9fcaa8aSmrg change_state, state</emphasis> 1445e9fcaa8aSmrg,<emphasis> 1446e9fcaa8aSmrg create_new</emphasis> 1447e9fcaa8aSmrg,<emphasis> 1448e9fcaa8aSmrg map</emphasis> 1449e9fcaa8aSmrg) 1450e9fcaa8aSmrg </entry> 1451e9fcaa8aSmrg </row> 1452eb411b4bSmrg <row> 1453e9fcaa8aSmrg <entry role='functionargdecl'> 1454e9fcaa8aSmrgDisplay * <emphasis> 1455e9fcaa8aSmrg dpy</emphasis> 1456e9fcaa8aSmrg; /* connection to the X server */ 1457e9fcaa8aSmrg </entry> 1458e9fcaa8aSmrg </row> 1459eb411b4bSmrg <row> 1460e9fcaa8aSmrg <entry role='functionargdecl'> 1461e9fcaa8aSmrgunsigned int <emphasis> 1462e9fcaa8aSmrg device_spec</emphasis> 1463e9fcaa8aSmrg; /* device ID, or <emphasis> 1464e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 1465e9fcaa8aSmrg */ 1466e9fcaa8aSmrg </entry> 1467e9fcaa8aSmrg </row> 1468eb411b4bSmrg <row> 1469e9fcaa8aSmrg <entry role='functionargdecl'> 1470e9fcaa8aSmrgAtom <emphasis> 1471e9fcaa8aSmrg name</emphasis> 1472e9fcaa8aSmrg; /* name of the indicator to change */ 1473e9fcaa8aSmrg </entry> 1474e9fcaa8aSmrg </row> 1475eb411b4bSmrg <row> 1476e9fcaa8aSmrg <entry role='functionargdecl'> 1477e9fcaa8aSmrgBool <emphasis> 1478e9fcaa8aSmrg change_state</emphasis> 1479e9fcaa8aSmrg; /* whether to change the indicator state or not */ 1480e9fcaa8aSmrg </entry> 1481e9fcaa8aSmrg </row> 1482eb411b4bSmrg <row> 1483e9fcaa8aSmrg <entry role='functionargdecl'> 1484e9fcaa8aSmrgBool <emphasis> 1485e9fcaa8aSmrg state</emphasis> 1486e9fcaa8aSmrg; /* desired new state for the indicator */ 1487e9fcaa8aSmrg </entry> 1488e9fcaa8aSmrg </row> 1489eb411b4bSmrg <row> 1490e9fcaa8aSmrg <entry role='functionargdecl'> 1491e9fcaa8aSmrgBool <emphasis> 1492e9fcaa8aSmrgcreate_new</emphasis> 1493e9fcaa8aSmrg; /* whether a new indicator with the specified name should be 1494e9fcaa8aSmrgcreated when necessary */ 1495e9fcaa8aSmrg </entry> 1496e9fcaa8aSmrg </row> 1497eb411b4bSmrg <row> 1498e9fcaa8aSmrg <entry role='functionargdecl'> 1499e9fcaa8aSmrgXkbIndicatorMapPtr <emphasis> 1500e9fcaa8aSmrgmap</emphasis> 1501e9fcaa8aSmrg; /* new map for the indicator */ 1502e9fcaa8aSmrg </entry> 1503e9fcaa8aSmrg</row> 1504e9fcaa8aSmrg</tbody> 1505e9fcaa8aSmrg</tgroup> 1506e9fcaa8aSmrg</informaltable> 1507e9fcaa8aSmrg 1508e9fcaa8aSmrg<para> 1509e9fcaa8aSmrgIf a compatible version of the Xkb extension is not available in the server, 1510e9fcaa8aSmrg<emphasis> 1511e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1512e9fcaa8aSmrg returns <emphasis> 1513e9fcaa8aSmrgFalse</emphasis> 1514e9fcaa8aSmrg. Otherwise, it sends a request to the X server to change the indicator 1515e9fcaa8aSmrgspecified by <emphasis> 1516e9fcaa8aSmrgname</emphasis> 1517e9fcaa8aSmrg and returns <emphasis> 1518e9fcaa8aSmrgTrue</emphasis>. 1519e9fcaa8aSmrg</para> 1520e9fcaa8aSmrg 1521e9fcaa8aSmrg 1522e9fcaa8aSmrg<para> 1523e9fcaa8aSmrgIf <emphasis> 1524e9fcaa8aSmrgchange_state</emphasis> 1525e9fcaa8aSmrg is <emphasis> 1526e9fcaa8aSmrgTrue</emphasis> 1527e9fcaa8aSmrg, and the optional parameter, <emphasis> 1528e9fcaa8aSmrgstate</emphasis> 1529e9fcaa8aSmrg, is not <emphasis> 1530e9fcaa8aSmrgNULL</emphasis> 1531e9fcaa8aSmrg, <emphasis> 1532e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1533e9fcaa8aSmrg tells the server to change the state of the named indicator to the value 1534e9fcaa8aSmrgspecified by <emphasis> 1535e9fcaa8aSmrgstate</emphasis>. 1536e9fcaa8aSmrg</para> 1537e9fcaa8aSmrg 1538e9fcaa8aSmrg 1539e9fcaa8aSmrg<para> 1540e9fcaa8aSmrgIf an indicator with the name specified by <emphasis> 1541e9fcaa8aSmrgname</emphasis> 1542e9fcaa8aSmrg does not already exist, the <emphasis> 1543e9fcaa8aSmrgcreate_new</emphasis> 1544e9fcaa8aSmrg parameter tells the server whether it should create a new named indicator. If 1545e9fcaa8aSmrg<emphasis> 1546e9fcaa8aSmrgcreate_new</emphasis> 1547e9fcaa8aSmrg is <emphasis> 1548e9fcaa8aSmrgTrue</emphasis> 1549e9fcaa8aSmrg, the server finds the first indicator that doesn’t have a name and gives it 1550e9fcaa8aSmrgthe name specified by <emphasis> 1551e9fcaa8aSmrgname</emphasis>. 1552e9fcaa8aSmrg</para> 1553e9fcaa8aSmrg 1554e9fcaa8aSmrg 1555e9fcaa8aSmrg<para> 1556e9fcaa8aSmrgIf the optional parameter, <emphasis> 1557e9fcaa8aSmrgmap</emphasis> 1558e9fcaa8aSmrg, is not <emphasis> 1559e9fcaa8aSmrgNULL</emphasis> 1560e9fcaa8aSmrg, <emphasis> 1561e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1562e9fcaa8aSmrg tells the server to change the indicator’s map to the values specified 1563e9fcaa8aSmrgin <emphasis>map</emphasis>. 1564e9fcaa8aSmrg</para> 1565e9fcaa8aSmrg 1566e9fcaa8aSmrg<para> 1567e9fcaa8aSmrg<emphasis> 1568e9fcaa8aSmrgXkbSetNamedIndicator</emphasis> 1569e9fcaa8aSmrg can generate <emphasis> 1570e9fcaa8aSmrgBadAtom</emphasis> 1571e9fcaa8aSmrg and <emphasis> 1572e9fcaa8aSmrgBadImplementation</emphasis> 1573e9fcaa8aSmrg errors. In addition, it can also generate <emphasis> 1574e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1575e9fcaa8aSmrg (see section 8.5), <emphasis> <!-- xref --> 1576e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1577e9fcaa8aSmrg, and <emphasis> 1578e9fcaa8aSmrgXkbNamesNotify</emphasis> 1579e9fcaa8aSmrg events (see section 18.5). <!-- xref --> 1580e9fcaa8aSmrg</para> 1581e9fcaa8aSmrg 1582e9fcaa8aSmrg 1583e9fcaa8aSmrg</sect2> 1584eb411b4bSmrg<sect2 id='The_XkbIndicatorChangesRec_Structure'> 1585e9fcaa8aSmrg<title>The XkbIndicatorChangesRec Structure</title> 1586e9fcaa8aSmrg 1587e9fcaa8aSmrg<para> 1588e9fcaa8aSmrgThe <emphasis> 1589e9fcaa8aSmrgXkbIndicatorChangesRec</emphasis> 1590e9fcaa8aSmrg identifies small modifications to the indicator map. Use it with the function 1591e9fcaa8aSmrg<emphasis> 1592e9fcaa8aSmrgXkbChangeIndicators</emphasis> 1593e9fcaa8aSmrg to reduce the amount of traffic sent to the server. 1594e9fcaa8aSmrg</para> 1595e9fcaa8aSmrg 1596e9fcaa8aSmrg<para><programlisting> 1597e9fcaa8aSmrgtypedef struct _XkbIndicatorChanges { 1598e9fcaa8aSmrg unsigned int state_changes; 1599e9fcaa8aSmrg unsigned int map_changes; 1600e9fcaa8aSmrg}<emphasis> 1601e9fcaa8aSmrgXkbIndicatorChangesRec</emphasis>,*XkbIndicatorChangesPtr; 1602e9fcaa8aSmrg</programlisting></para> 1603e9fcaa8aSmrg 1604e9fcaa8aSmrg<para> 1605e9fcaa8aSmrgThe <emphasis> 1606e9fcaa8aSmrgstate_changes</emphasis> 1607e9fcaa8aSmrg field is a mask that specifies the indicators that have changed state, and 1608e9fcaa8aSmrg<emphasis> 1609e9fcaa8aSmrgmap_changes</emphasis> 1610e9fcaa8aSmrg is a mask that specifies the indicators whose maps have changed. 1611e9fcaa8aSmrg</para> 1612e9fcaa8aSmrg 1613e9fcaa8aSmrg 1614e9fcaa8aSmrg<para> 1615e9fcaa8aSmrgTo change indicator maps or state without passing the entire keyboard 1616e9fcaa8aSmrgdescription, use <emphasis> 1617e9fcaa8aSmrgXkbChangeIndicators</emphasis> 1618e9fcaa8aSmrg. 1619e9fcaa8aSmrg</para> 1620e9fcaa8aSmrg 1621e9fcaa8aSmrg<informaltable frame='none'> 1622eb411b4bSmrg<?dbfo keep-together="always" ?> 1623eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1624eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1625e9fcaa8aSmrg<tbody> 1626eb411b4bSmrg <row> 1627e9fcaa8aSmrg <entry role='functiondecl'> 1628e9fcaa8aSmrgBool <emphasis> 1629e9fcaa8aSmrgXkbChangeIndicators</emphasis> 1630e9fcaa8aSmrg(<emphasis> 1631e9fcaa8aSmrgdpy, xkb, changes, state</emphasis> 1632e9fcaa8aSmrg) 1633e9fcaa8aSmrg </entry> 1634e9fcaa8aSmrg </row> 1635eb411b4bSmrg <row> 1636e9fcaa8aSmrg <entry role='functionargdecl'> 1637e9fcaa8aSmrgDisplay * <emphasis> 1638e9fcaa8aSmrgdpy</emphasis> 1639e9fcaa8aSmrg; /* connection to the X server */ 1640e9fcaa8aSmrg </entry> 1641e9fcaa8aSmrg </row> 1642eb411b4bSmrg <row> 1643e9fcaa8aSmrg <entry role='functionargdecl'> 1644e9fcaa8aSmrgXkbDescPtr <emphasis> 1645e9fcaa8aSmrgxkb</emphasis> 1646e9fcaa8aSmrg; /* keyboard description from which names are to be 1647e9fcaa8aSmrg </entry> 1648e9fcaa8aSmrg </row> 1649eb411b4bSmrg <row> 1650e9fcaa8aSmrg <entry role='functionargdecl'> 1651e9fcaa8aSmrg taken. */ 1652e9fcaa8aSmrg </entry> 1653e9fcaa8aSmrg </row> 1654eb411b4bSmrg <row> 1655e9fcaa8aSmrg <entry role='functionargdecl'> 1656e9fcaa8aSmrgXkbIndicatorChangesPtr <emphasis> 1657e9fcaa8aSmrgchanges</emphasis> 1658e9fcaa8aSmrg; /* indicators to be updated on the server */ 1659e9fcaa8aSmrg </entry> 1660e9fcaa8aSmrg </row> 1661eb411b4bSmrg <row> 1662e9fcaa8aSmrg <entry role='functionargdecl'> 1663e9fcaa8aSmrgunsigned int <emphasis> 1664e9fcaa8aSmrgstate</emphasis> 1665e9fcaa8aSmrg; /* new state of indicators listed in 1666e9fcaa8aSmrg </entry> 1667e9fcaa8aSmrg </row> 1668eb411b4bSmrg <row> 1669e9fcaa8aSmrg <entry role='functionargdecl'> 1670e9fcaa8aSmrg<emphasis> 1671e9fcaa8aSmrg changes</emphasis> 1672e9fcaa8aSmrg-><emphasis> 1673e9fcaa8aSmrgstate_changes</emphasis> 1674e9fcaa8aSmrg */ 1675e9fcaa8aSmrg </entry> 1676e9fcaa8aSmrg</row> 1677e9fcaa8aSmrg</tbody> 1678e9fcaa8aSmrg</tgroup> 1679e9fcaa8aSmrg</informaltable> 1680e9fcaa8aSmrg 1681e9fcaa8aSmrg<para> 1682e9fcaa8aSmrg<emphasis> 1683e9fcaa8aSmrgXkbChangeIndicators</emphasis> 1684e9fcaa8aSmrg copies any maps specified by <emphasis> 1685e9fcaa8aSmrgchanges</emphasis> 1686e9fcaa8aSmrg from the keyboard description, <emphasis> 1687e9fcaa8aSmrgxkb</emphasis> 1688e9fcaa8aSmrg, to the server specified by <emphasis> 1689e9fcaa8aSmrgdpy</emphasis> 1690e9fcaa8aSmrg. If any bits are set in the <emphasis> 1691e9fcaa8aSmrgstate_changes</emphasis> 1692e9fcaa8aSmrg field of <emphasis> 1693e9fcaa8aSmrgchanges</emphasis> 1694e9fcaa8aSmrg, <emphasis> 1695e9fcaa8aSmrgXkbChangeIndicators</emphasis> 1696e9fcaa8aSmrg also sets the state of those indicators to the values specified in the 1697e9fcaa8aSmrg<emphasis> 1698e9fcaa8aSmrgstate</emphasis> 1699e9fcaa8aSmrg mask. A 1 bit in <emphasis> 1700e9fcaa8aSmrgstate</emphasis> 1701e9fcaa8aSmrg turns the corresponding indicator on, a 0 bit turns it off. 1702e9fcaa8aSmrg</para> 1703e9fcaa8aSmrg 1704e9fcaa8aSmrg 1705e9fcaa8aSmrg<para> 1706e9fcaa8aSmrg<emphasis> 1707e9fcaa8aSmrgXkbChangeIndicator</emphasis> 1708e9fcaa8aSmrgs can generate <emphasis> 1709e9fcaa8aSmrgBadAtom</emphasis> 1710e9fcaa8aSmrg and <emphasis> 1711e9fcaa8aSmrgBadImplementation</emphasis> 1712e9fcaa8aSmrg errors. In addition, it can also generate <emphasis> 1713e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1714e9fcaa8aSmrg and <emphasis> 1715e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1716e9fcaa8aSmrg events (see section 8.5). <!-- xref --> 1717e9fcaa8aSmrg</para> 1718e9fcaa8aSmrg 1719e9fcaa8aSmrg 1720e9fcaa8aSmrg</sect2> 1721e9fcaa8aSmrg</sect1> 1722eb411b4bSmrg<sect1 id='Tracking_Changes_to_Indicator_State_or_Map'> 1723e9fcaa8aSmrg<title>Tracking Changes to Indicator State or Map</title> 1724e9fcaa8aSmrg 1725e9fcaa8aSmrg<para> 1726e9fcaa8aSmrgWhenever an indicator changes state, the server sends <emphasis> 1727e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1728e9fcaa8aSmrg events to all interested clients. Similarly, whenever an indicator’s map 1729e9fcaa8aSmrgchanges, the server sends <emphasis> 1730e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1731e9fcaa8aSmrg events to all interested clients. 1732e9fcaa8aSmrg</para> 1733e9fcaa8aSmrg 1734e9fcaa8aSmrg 1735e9fcaa8aSmrg<para> 1736e9fcaa8aSmrgTo receive <emphasis> 1737e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1738e9fcaa8aSmrg events, use <emphasis> 1739e9fcaa8aSmrgXkbSelectEvents</emphasis> 1740e9fcaa8aSmrg (see section 4.3) with both the <emphasis> <!-- xref --> 1741e9fcaa8aSmrgbits_to_change </emphasis> 1742e9fcaa8aSmrgand<emphasis> 1743e9fcaa8aSmrg values_for_bits</emphasis> 1744e9fcaa8aSmrg parameters containing <emphasis> 1745e9fcaa8aSmrgXkbIndicatorStateNotifyMask</emphasis> 1746e9fcaa8aSmrg. To receive <emphasis> 1747e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1748e9fcaa8aSmrg events, use <emphasis> 1749e9fcaa8aSmrgXkbSelectEvents</emphasis> 1750e9fcaa8aSmrg with <emphasis> 1751e9fcaa8aSmrgXkbIndicatorMapNotifyMask</emphasis> 1752e9fcaa8aSmrg. 1753e9fcaa8aSmrg</para> 1754e9fcaa8aSmrg 1755e9fcaa8aSmrg 1756e9fcaa8aSmrg<para> 1757e9fcaa8aSmrgTo receive events for only specific indicators, use <emphasis> 1758e9fcaa8aSmrgXkbSelectEventDetails</emphasis> 1759e9fcaa8aSmrg. Set the <emphasis> 1760e9fcaa8aSmrgevent_type</emphasis> 1761e9fcaa8aSmrg parameter<emphasis> 1762e9fcaa8aSmrg to XkbIndicatorStateNotify</emphasis> 1763e9fcaa8aSmrg or <emphasis> 1764e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1765e9fcaa8aSmrg, and set both the <emphasis> 1766e9fcaa8aSmrgbits_to_change </emphasis> 1767e9fcaa8aSmrgand<emphasis> 1768e9fcaa8aSmrg values_for_bits</emphasis> 1769e9fcaa8aSmrg detail parameters to a mask where each bit specifies one indicator, turning on 1770e9fcaa8aSmrgthose bits that specify the indicators for which you want to receive events. 1771e9fcaa8aSmrg</para> 1772e9fcaa8aSmrg 1773e9fcaa8aSmrg 1774e9fcaa8aSmrg<para> 1775e9fcaa8aSmrgBoth types of indicator events use the same structure: 1776e9fcaa8aSmrg</para> 1777e9fcaa8aSmrg 1778e9fcaa8aSmrg<para><programlisting> 1779e9fcaa8aSmrgtypedef struct _XkbIndicatorNotify { 1780e9fcaa8aSmrg int type; /* Xkb extension base event code */ 1781e9fcaa8aSmrg unsigned long serial; /* X server serial number for event */ 1782e9fcaa8aSmrg Bool send_event; /* <emphasis> True</emphasis> => synthetically generated */ 1783e9fcaa8aSmrg Display * display; /* server connection where event generated */ 1784e9fcaa8aSmrg Time time; /* server time when event generated */ 1785e9fcaa8aSmrg int xkb_type; /* specifies state or map notify */ 1786e9fcaa8aSmrg int device; /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */ 1787e9fcaa8aSmrg unsigned int changed; /* mask of indicators with new state or map */ 1788e9fcaa8aSmrg unsigned int state; /* current state of all indicators */ 1789e9fcaa8aSmrg} <emphasis>XkbIndicatorNotifyEvent</emphasis>; 1790e9fcaa8aSmrg</programlisting></para> 1791e9fcaa8aSmrg 1792e9fcaa8aSmrg<para> 1793e9fcaa8aSmrg<emphasis> 1794e9fcaa8aSmrgxkb_type</emphasis> 1795e9fcaa8aSmrg is either <emphasis> 1796e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1797e9fcaa8aSmrg or <emphasis> 1798e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1799e9fcaa8aSmrg, depending on whether the event is a <emphasis> 1800e9fcaa8aSmrgkbIndicatorStateNotify</emphasis> 1801e9fcaa8aSmrg event or <emphasis> 1802e9fcaa8aSmrgkbIndicatorMapNotify</emphasis> 1803e9fcaa8aSmrg event. 1804e9fcaa8aSmrg</para> 1805e9fcaa8aSmrg 1806e9fcaa8aSmrg<para> 1807e9fcaa8aSmrgThe <emphasis> 1808e9fcaa8aSmrgchanged</emphasis> 1809e9fcaa8aSmrg parameter is a mask that is the bitwise inclusive OR of the indicators that 1810e9fcaa8aSmrghave changed. If the event is of type <emphasis> 1811e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1812e9fcaa8aSmrg, <emphasis> 1813e9fcaa8aSmrgchanged</emphasis> 1814e9fcaa8aSmrg reports the maps that changed. If the event is of type <emphasis> 1815e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1816e9fcaa8aSmrg, <emphasis> 1817e9fcaa8aSmrgchanged</emphasis> 1818e9fcaa8aSmrg reports the indicators that have changed state. <emphasis> 1819e9fcaa8aSmrgstate</emphasis> 1820e9fcaa8aSmrg is a mask that specifies the current state of all indicators, whether they 1821e9fcaa8aSmrghave changed or not, for both <emphasis> 1822e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1823e9fcaa8aSmrg and <emphasis>IndicatorMapNotify</emphasis> events. 1824e9fcaa8aSmrg</para> 1825e9fcaa8aSmrg 1826e9fcaa8aSmrg<para> 1827e9fcaa8aSmrgWhen your client application receives either a <emphasis> 1828e9fcaa8aSmrgXkbIndicatorStateNotify</emphasis> 1829e9fcaa8aSmrg event or <emphasis> 1830e9fcaa8aSmrgXkbIndicatorMapNotify</emphasis> 1831e9fcaa8aSmrg event, you can note the changes in a changes structure by calling <emphasis> 1832e9fcaa8aSmrgXkbNoteIndicatorChanges</emphasis>. 1833e9fcaa8aSmrg</para> 1834e9fcaa8aSmrg 1835e9fcaa8aSmrg<informaltable frame='none'> 1836eb411b4bSmrg<?dbfo keep-together="always" ?> 1837eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1838eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1839e9fcaa8aSmrg<tbody> 1840eb411b4bSmrg <row> 1841e9fcaa8aSmrg <entry role='functiondecl'> 1842e9fcaa8aSmrgvoid <emphasis> 1843e9fcaa8aSmrgXkbNoteIndicatorChanges</emphasis> 1844e9fcaa8aSmrg(<emphasis> 1845e9fcaa8aSmrgold</emphasis> 1846e9fcaa8aSmrg,<emphasis> 1847e9fcaa8aSmrg new</emphasis> 1848e9fcaa8aSmrg,<emphasis> 1849e9fcaa8aSmrg wanted</emphasis> 1850e9fcaa8aSmrg) 1851e9fcaa8aSmrg </entry> 1852e9fcaa8aSmrg </row> 1853eb411b4bSmrg <row> 1854e9fcaa8aSmrg <entry role='functionargdecl'> 1855e9fcaa8aSmrgXkbIndicatorChangesPtr <emphasis> 1856e9fcaa8aSmrg old</emphasis> 1857e9fcaa8aSmrg; /* XkbIndicatorChanges structure to be updated */ 1858e9fcaa8aSmrg </entry> 1859e9fcaa8aSmrg </row> 1860eb411b4bSmrg <row> 1861e9fcaa8aSmrg <entry role='functionargdecl'> 1862e9fcaa8aSmrgXkbIndicatorNotifyEvent * <emphasis> 1863e9fcaa8aSmrgnew</emphasis> 1864e9fcaa8aSmrg; /* event from which changes are to be copied */ 1865e9fcaa8aSmrg </entry> 1866e9fcaa8aSmrg </row> 1867eb411b4bSmrg <row> 1868e9fcaa8aSmrg <entry role='functionargdecl'> 1869e9fcaa8aSmrgunsigned int <emphasis> 1870e9fcaa8aSmrg wanted</emphasis> 1871e9fcaa8aSmrg; /* which changes are to be noted */ 1872e9fcaa8aSmrg </entry> 1873e9fcaa8aSmrg</row> 1874e9fcaa8aSmrg</tbody> 1875e9fcaa8aSmrg</tgroup> 1876e9fcaa8aSmrg</informaltable> 1877e9fcaa8aSmrg 1878e9fcaa8aSmrg<para> 1879e9fcaa8aSmrgThe <emphasis> 1880e9fcaa8aSmrgwanted</emphasis> 1881e9fcaa8aSmrg parameter is the bitwise inclusive OR of <emphasis> 1882e9fcaa8aSmrgXkbIndicatorMapMask</emphasis> 1883e9fcaa8aSmrg and <emphasis> 1884e9fcaa8aSmrgXkbIndicatorStateMask</emphasis> 1885e9fcaa8aSmrg. <emphasis> 1886e9fcaa8aSmrgXkbNoteIndicatorChanges</emphasis> 1887e9fcaa8aSmrg copies any changes reported in <emphasis> 1888e9fcaa8aSmrgnew</emphasis> 1889e9fcaa8aSmrg and specified in <emphasis> 1890e9fcaa8aSmrgwanted</emphasis> 1891e9fcaa8aSmrg into the changes record specified by <emphasis> 1892e9fcaa8aSmrgold</emphasis>. 1893e9fcaa8aSmrg</para> 1894e9fcaa8aSmrg 1895e9fcaa8aSmrg 1896e9fcaa8aSmrg<para> 1897e9fcaa8aSmrgTo update a local copy of the keyboard description with the actual values, pass 1898e9fcaa8aSmrgthe results of one or more calls to <emphasis> 1899e9fcaa8aSmrgXkbNoteIndicatorChanges</emphasis> 1900e9fcaa8aSmrg to <emphasis> 1901e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis>: 1902e9fcaa8aSmrg</para> 1903e9fcaa8aSmrg 1904e9fcaa8aSmrg 1905e9fcaa8aSmrg<informaltable frame='none'> 1906eb411b4bSmrg<?dbfo keep-together="always" ?> 1907eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 1908eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 1909e9fcaa8aSmrg<tbody> 1910eb411b4bSmrg <row> 1911e9fcaa8aSmrg <entry role='functiondecl'> 1912e9fcaa8aSmrgStatus <emphasis> 1913e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis> 1914e9fcaa8aSmrg(<emphasis> 1915e9fcaa8aSmrgdpy</emphasis> 1916e9fcaa8aSmrg,<emphasis> 1917e9fcaa8aSmrg xkb</emphasis> 1918e9fcaa8aSmrg,<emphasis> 1919e9fcaa8aSmrg changes</emphasis> 1920e9fcaa8aSmrg,<emphasis> 1921e9fcaa8aSmrg state</emphasis> 1922e9fcaa8aSmrg) 1923e9fcaa8aSmrg </entry> 1924e9fcaa8aSmrg </row> 1925eb411b4bSmrg <row> 1926e9fcaa8aSmrg <entry role='functionargdecl'> 1927e9fcaa8aSmrgDisplay * <emphasis> 1928e9fcaa8aSmrgdpy</emphasis> 1929e9fcaa8aSmrg; /* connection to the X server */ 1930e9fcaa8aSmrg </entry> 1931e9fcaa8aSmrg </row> 1932eb411b4bSmrg <row> 1933e9fcaa8aSmrg <entry role='functionargdecl'> 1934e9fcaa8aSmrgXkbDescPtr <emphasis> 1935e9fcaa8aSmrgxkb</emphasis> 1936e9fcaa8aSmrg; /* keyboard description to hold the new values */ 1937e9fcaa8aSmrg </entry> 1938e9fcaa8aSmrg </row> 1939eb411b4bSmrg <row> 1940e9fcaa8aSmrg <entry role='functionargdecl'> 1941e9fcaa8aSmrgXkbIndicatorChangesPtr <emphasis> 1942e9fcaa8aSmrgchanges</emphasis> 1943e9fcaa8aSmrg; /* indicator maps/state to be obtained from the server */ 1944e9fcaa8aSmrg </entry> 1945e9fcaa8aSmrg </row> 1946eb411b4bSmrg <row> 1947e9fcaa8aSmrg <entry role='functionargdecl'> 1948e9fcaa8aSmrgunsigned int * <emphasis> 1949e9fcaa8aSmrgstate</emphasis> 1950e9fcaa8aSmrg; /* backfilled with the state of the indicators */ 1951e9fcaa8aSmrg </entry> 1952e9fcaa8aSmrg</row> 1953e9fcaa8aSmrg</tbody> 1954e9fcaa8aSmrg</tgroup> 1955e9fcaa8aSmrg</informaltable> 1956e9fcaa8aSmrg 1957e9fcaa8aSmrg<para> 1958e9fcaa8aSmrg<emphasis> 1959e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis> 1960e9fcaa8aSmrg examines the <emphasis> 1961e9fcaa8aSmrgchanges</emphasis> 1962e9fcaa8aSmrg parameter, pulls over the necessary information from the server, and copies 1963e9fcaa8aSmrgthe results into the <emphasis> 1964e9fcaa8aSmrgxkb</emphasis> 1965e9fcaa8aSmrg keyboard description. If any bits are set in the <emphasis> 1966e9fcaa8aSmrgstate_changes</emphasis> 1967e9fcaa8aSmrg field of <emphasis> 1968e9fcaa8aSmrgchanges</emphasis> 1969e9fcaa8aSmrg, <emphasis> 1970e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis> 1971e9fcaa8aSmrg also places the state of those indicators in <emphasis> 1972e9fcaa8aSmrgstate</emphasis> 1973e9fcaa8aSmrg. If the <emphasis> 1974e9fcaa8aSmrgindicators</emphasis> 1975e9fcaa8aSmrg field of <emphasis> 1976e9fcaa8aSmrgxkb</emphasis> 1977e9fcaa8aSmrg is <emphasis> 1978e9fcaa8aSmrgNULL</emphasis> 1979e9fcaa8aSmrg, <emphasis> 1980e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis> 1981e9fcaa8aSmrg allocates and initializes it. To free the <emphasis> 1982e9fcaa8aSmrgindicators</emphasis> 1983e9fcaa8aSmrg field, use <emphasis> 1984e9fcaa8aSmrgXkbFreeIndicators</emphasis> 1985e9fcaa8aSmrg (see section 8.6). <!-- xref --> 1986e9fcaa8aSmrg</para> 1987e9fcaa8aSmrg 1988e9fcaa8aSmrg 1989e9fcaa8aSmrg<para> 1990e9fcaa8aSmrg<emphasis> 1991e9fcaa8aSmrgXkbGetIndicatorChanges</emphasis> 1992e9fcaa8aSmrg can generate <emphasis> 1993e9fcaa8aSmrgBadAlloc</emphasis> 1994e9fcaa8aSmrg, <emphasis> 1995e9fcaa8aSmrgBadImplementation,</emphasis> 1996e9fcaa8aSmrg and <emphasis> 1997e9fcaa8aSmrgBadMatch</emphasis> 1998e9fcaa8aSmrg errors. 1999e9fcaa8aSmrg</para> 2000e9fcaa8aSmrg 2001e9fcaa8aSmrg 2002e9fcaa8aSmrg</sect1> 2003eb411b4bSmrg<sect1 id='Allocating_and_Freeing_Indicator_Maps'> 2004e9fcaa8aSmrg<title>Allocating and Freeing Indicator Maps</title> 2005e9fcaa8aSmrg 2006e9fcaa8aSmrg<para> 2007e9fcaa8aSmrgMost applications do not need to directly allocate the <emphasis> 2008e9fcaa8aSmrgindicators</emphasis> 2009e9fcaa8aSmrg member of the keyboard description record (the keyboard description record is 2010e9fcaa8aSmrgdescribed in Chapter 6). If the need arises, however, use <emphasis> 2011e9fcaa8aSmrgXkbAllocIndicatorMaps.</emphasis> 2012e9fcaa8aSmrg</para> 2013e9fcaa8aSmrg 2014e9fcaa8aSmrg<informaltable frame='none'> 2015eb411b4bSmrg<?dbfo keep-together="always" ?> 2016eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 2017eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 2018e9fcaa8aSmrg<tbody> 2019eb411b4bSmrg <row> 2020e9fcaa8aSmrg <entry role='functiondecl'> 2021e9fcaa8aSmrgStatus <emphasis> 2022e9fcaa8aSmrgXkbAllocIndicatorMaps</emphasis> 2023e9fcaa8aSmrg(<emphasis> 2024e9fcaa8aSmrgxkb</emphasis> 2025e9fcaa8aSmrg) 2026e9fcaa8aSmrg </entry> 2027e9fcaa8aSmrg </row> 2028eb411b4bSmrg <row> 2029e9fcaa8aSmrg <entry role='functionargdecl'> 2030e9fcaa8aSmrgXkbDescPtr <emphasis> 2031e9fcaa8aSmrgxkb</emphasis> 2032e9fcaa8aSmrg; /* keyboard description structure */ 2033e9fcaa8aSmrg </entry> 2034e9fcaa8aSmrg</row> 2035e9fcaa8aSmrg</tbody> 2036e9fcaa8aSmrg</tgroup> 2037e9fcaa8aSmrg</informaltable> 2038e9fcaa8aSmrg 2039e9fcaa8aSmrg<para> 2040e9fcaa8aSmrgThe <emphasis> 2041e9fcaa8aSmrgxkb</emphasis> 2042e9fcaa8aSmrg parameter must point to a valid keyboard description. If it doesn’t, 2043e9fcaa8aSmrg<emphasis> 2044e9fcaa8aSmrgXkbAllocIndicatorMaps</emphasis> 2045e9fcaa8aSmrg returns a <emphasis> 2046e9fcaa8aSmrgBadMatch</emphasis> 2047e9fcaa8aSmrg error. Otherwise, <emphasis> 2048e9fcaa8aSmrgXkbAllocIndicatorMaps</emphasis> 2049e9fcaa8aSmrg allocates and initializes the <emphasis> 2050e9fcaa8aSmrgindicators</emphasis> 2051e9fcaa8aSmrg member of the keyboard description record and returns <emphasis> 2052e9fcaa8aSmrgSuccess</emphasis> 2053e9fcaa8aSmrg. If <emphasis> 2054e9fcaa8aSmrgXkbAllocIndicatorMaps</emphasis> 2055e9fcaa8aSmrg was unable to allocate the indicators record, it reports a Bad<emphasis> 2056e9fcaa8aSmrgAlloc</emphasis> 2057e9fcaa8aSmrg error. 2058e9fcaa8aSmrg</para> 2059e9fcaa8aSmrg 2060e9fcaa8aSmrg<para> 2061e9fcaa8aSmrgTo free memory used by the <emphasis> 2062e9fcaa8aSmrgindicators</emphasis> 2063e9fcaa8aSmrg member of an <emphasis> 2064e9fcaa8aSmrgXkbDescRec</emphasis> 2065e9fcaa8aSmrg structure, use <emphasis> 2066e9fcaa8aSmrgXkbFreeIndicatorMaps.</emphasis> 2067e9fcaa8aSmrg</para> 2068e9fcaa8aSmrg 2069e9fcaa8aSmrg<informaltable frame='none'> 2070eb411b4bSmrg<?dbfo keep-together="always" ?> 2071eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 2072eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 2073e9fcaa8aSmrg<tbody> 2074eb411b4bSmrg <row> 2075e9fcaa8aSmrg <entry role='functiondecl'> 2076e9fcaa8aSmrgvoid <emphasis> 2077e9fcaa8aSmrgXkbFreeIndicatorMaps</emphasis> 2078e9fcaa8aSmrg(<emphasis> 2079e9fcaa8aSmrgxkb</emphasis> 2080e9fcaa8aSmrg) 2081e9fcaa8aSmrg </entry> 2082e9fcaa8aSmrg </row> 2083eb411b4bSmrg <row> 2084e9fcaa8aSmrg <entry role='functionargdecl'> 2085e9fcaa8aSmrgXkbDescPtr <emphasis> 2086e9fcaa8aSmrgxkb</emphasis> 2087e9fcaa8aSmrg; /* keyboard description structure */ 2088e9fcaa8aSmrg </entry> 2089e9fcaa8aSmrg</row> 2090e9fcaa8aSmrg</tbody> 2091e9fcaa8aSmrg</tgroup> 2092e9fcaa8aSmrg</informaltable> 2093e9fcaa8aSmrg 2094e9fcaa8aSmrg<para> 2095e9fcaa8aSmrgIf the <emphasis>indicators</emphasis> 2096e9fcaa8aSmrg member of the keyboard description record 2097e9fcaa8aSmrgpointed to by <emphasis>xkb</emphasis> 2098e9fcaa8aSmrgis not <emphasis>NULL</emphasis> 2099e9fcaa8aSmrg, <emphasis>XkbFreeIndicatorMaps</emphasis> 2100e9fcaa8aSmrgfrees the memory associated with 2101e9fcaa8aSmrgthe <emphasis>indicators</emphasis> 2102e9fcaa8aSmrgmember of <emphasis>xkb</emphasis>. 2103e9fcaa8aSmrg</para> 2104e9fcaa8aSmrg 2105e9fcaa8aSmrg</sect1> 2106e9fcaa8aSmrg</chapter> 2107