Provided by: xkeycaps_2.47-9_amd64 bug

NAME

       xkeycaps - graphically display and edit the X keyboard mapping

SYNOPSIS

       xkeycaps [-toolkitoption ...] [-option ...]

DESCRIPTION

       The  xkeycaps  program  displays  a  keyboard.   Moving  the  mouse  over a key describes the keysyms and
       modifiers that that key generates.  Clicking left on a key simulates a KeyPress event.  Clicking right on
       a key brings up a menu of operations, including a command to change the keysyms that the  key  generates.
       This program is, in part, a graphical front-end to xmodmap(1).

OPTIONS

       xkeycaps accepts all of the standard toolkit options, and also accepts the following options:

       -keyboard keyboard-name or -kbd keyboard-name
           Specifies the type of keyboard to display.  There are many different computer keyboards in the world,
           and  xkeycaps must know which one you are using in order to function correctly.  Case does not matter
           when specifying a keyboard name.

           If you're running on the console display of a Sun or HP, then xkeycaps will interrogate the  attached
           keyboard  hardware directly to determine what keyboard you're using.  But if you're running remotely,
           or on another type of machine, then you must specify a keyboard somehow.

       -help
           Lists the recognized values for the -keyboard option.

       -gutterwidth number or -gw number
           Specifies the number of pixels of space to leave between each key.

       -font fontname
           Specifies the font to use to display the keycaps.

       The following standard X Toolkit command line arguments are commonly used with xkeycaps:

       -display host:dpy
           This option specifies the X server to contact.

       -geometry geometry
           This option specifies the preferred size and position of the window.

       -bg color
           This option specifies the color to use for the background of the window.  The default is light gray.

       -fg color
           This option specifies the color to use for the foreground of the window.  The default is black.

       -bw number
           This option specifies the width in pixels of the border surrounding the window.

       -xrm resourcestring
           This option specifies a resource string to be used.  This is especially useful for setting  resources
           that do not have separate command line options.

DISPLAY

       The  bottom  part  of  the window is a drawing of a keyboard.  In the top left of each key is printed the
       string which actually appears on the surface of the  key.   In  the  bottom  right  of  the  key  is  the
       (hexadecimal) keycode that this key generates.

       At  the  top  of  the  screen  are  several lines of text describing the key under the mouse (or the most
       recently typed key.)  These lines are:

       KeyCode:    This displays the text printed on the physical key, and the keycode generated by that key  in
                   hex, decimal, and octal.

       KeySym:     This displays the set of KeySyms that this key currently generates.

       ASCII:      This displays the ASCII equivalent of this key, taking into account the current modifier keys
                   which are down.

       Modifiers:  this  displays  the modifier bits which this key generates.  If a key generates modifiers, it
                   is a chord-key like Shift or Control.

       AutoRepeat: Whether the X server claims  that  this  key  autorepeats.   I  say  ``claims''  because  the
                   OpenWindows  X  server  is  the  only  one  I  have encountered for which this information is
                   accurate.  The per-key autorepeat flag seems to be almost-universally ignored.

COMMANDS

       There are several buttons in the upper left corner of the window.  They are:

       Quit
           Exits the program.

       Select Keyboard
           Pops up a dialog box from which you can change which keyboard is displayed.  The  left  column  lists
           the  known  types  of  keyboards,  and  the  right column lists the known layouts (mappings) of those
           keyboards.

       Type At Window
           After selecting this, you are asked to click on some other window.  After  doing  this,  clicking  on
           keys on the keyboard display will simulate key events on the window you selected.  Selecting the root
           window or the xkeycaps window turns this off.

           If you are using a window manager (for example, twm(1)) in which you can lock the keyboard focus on a
           window  and still click on other windows without having the focus change, then you can accomplish the
           same thing merely by focusing on another window and clicking on the keys in the xkeycaps window.

       Restore Default Map
           This command restores the keyboard  to  its  default  state.   If  you  execute  this  command  while
           displaying  a keyboard which is not the type of keyboard you are really using, your keymap will be in
           a nonsensical state.  There is no way for xkeycaps to tell what keyboard  you  are  using  except  by
           taking your word for it, so don't lie.

       Write Output
           This  command  writes an xmodmap input file representing the current state of the keyboard (including
           all of your changes) to a file in your home directory.  Note that this command DOES NOT write out the
           default keymap for this keyboard type unless you have clicked on Restore Default Map before.

           The file will be called .xmodmap-hostname, where hostname is the name of the machine  you're  running
           on.  It will warn you if the file already exists.

           It  prompts  you  with  a  dialog box: you can either write an xmodmap file representing the state of
           every key, or you can write a smaller file which describes only the changes.

           The idea is that in the appropriate startup script, you would add a line like
           xmodmap  /.xmodmap-`uname -n`
           in the appropriate init file, so that those keyboard modifications are made each  time  you  log  in.
           (If  you're  not  sure  where this command should go, ask your system administrator, as that tends to
           vary from site to site.)

       Clicking left on a key simulates a KeyPress event.  Releasing the button simulates  a  KeyRelease  event.
       If  you  click  left on a key and move the mouse while the button is down, KeyPress and KeyRelease events
       will be simulated on every key you move the mouse over.  Think of the mouse as your finger: if  you  drag
       the mouse over several keys, they will go down and up in turn.

       Clicking  left on a key which is associated with modifier bits (such as Shift or Control) causes that key
       to ``lock'' down.  Clicking left again releases the key.  In this way, you can generate  key-chords  with
       the  mouse:  to generate Control-C, click left on the Control key, and then click on the C key.  Click on
       Control again to turn the control modifier off.

       Typing a key on the real keyboard simulates a  KeyPress/KeyRelease  event  pair  in  the  same  way  that
       clicking on a key does.

       You can also combine mouse and keyboard input: for example, if you use the mouse to select the Shift key,
       and type a character, the event that is simulated will have the Shift modifier set.  And if you hold down
       the  real  Control  key,  and  click  on  the  C  key in the window, a Control-C event will be generated.
       (Assuming, that is, that  your  window  manager  does  not  intercept  control-left-button  for  its  own
       purposes.)

       Clicking right on a key pops up a menu of commands for the given key.  They are:

       Exchange Keys
           After selecting this menu item, you are asked to click on another key.  That key and the key on which
           you brought up the menu will be exchanged.  This changes the keyboard mapping immediately.

       Duplicate Key
           After  selecting this menu item, you are asked to click on another key.  That key will be made a copy
           of the key on which you brought up the menu.  That is, the two keys will generate  the  same  set  of
           keysyms and modifiers.  This changes the keyboard mapping immediately.

       Disable Key
           The  key on which you brought up the menu will be made to generate no keysyms and no modifiers.  This
           changes the keyboard mapping immediately.

       Restore Key To Default
           The key on which you brought up the menu will be restored to its default state; no other key will  be
           altered.  This actually changes the current keyboard mapping.

       Edit KeySyms of Key
           This  pops  up  the  "Edit  Key"  window,  which  allows  you to arbitrarily change which keysyms and
           modifiers this key generates.

           On the left side of the window is the list of the keysyms that this key currently generates.  (A  key
           may  generate up to eight keysyms; the interpretation of these keysyms is described in the X protocol
           document, and is summarized later in the KEYSYMS AND KEYCODES section of this man page.)

           The second column is a multiple-choice list of the eight modifier bits that this  key  may  generate.
           For  example,  if  you  want  a  key  to  behave  as a ``control'' key, you should select the Control
           modifier.

           The third and fourth column (the scrolling lists) are for changing the  keysym  associated  with  the
           key.   When  you select a keysym-position from the first column, the character set and keysym will be
           displayed in the scrolling lists.  Clicking on a keysym in the ``KeySym'' column  will  install  that
           keysym in the highlighted slot in the first column.

           To  select  a  keysym  from  a different character set, click on the character set name in the second
           column.  (The Latin1 and Keyboard character sets are the most commonly used.)

           At the bottom of the window are three buttons: Undo, Abort, and Ok.  Clicking  on  Undo  reverts  the
           Edit  Key  window  to  the  current  state  of the key in question.  Abort closes the Edit Key window
           without making any changes.  Ok closes the Edit Key window and installs  your  changes  (the  current
           keyboard mapping is modified.)

KEYSYMS AND KEYCODES

       To effectively edit your keyboard mapping, there are some terms you need to be familiar with:

       KeyCode   This is a raw scan-code that is read from the keyboard; each physical key on the keyboard has a
                 different number associated with it; this mapping cannot be changed (but that's ok.)

                 Generally,  every  keyboard has its own set of KeyCodes, which is why you will probably need to
                 have a different keymap for every system you use.

       KeySym    This is a symbol which can be generated by a single press of  one  key  on  the  keyboard:  for
                 example,  all  letters,  numbers,  and punctuation are keysyms, and so are more abstract things
                 like ``shift'' and ``control''.

                 Each KeyCode (that is, key on the keyboard) is associated with certain  KeySyms.   The  KeySyms
                 are what give the keys their semantics (and makes the A key generate an A), not the KeyCodes.

                 Usually  keys are associated with one or two keysyms, which correspond to the symbols generated
                 when the key is pressed, and when it is pressed while the shift key is held down.  There  is  a
                 special  case,  which is that if the key contains only one KeySym, and it is a letter, then the
                 Shift key does the obvious thing that one does to letters.

       KeyCap    Not to be confused with KeySyms, this refers to the text which is printed on the physical keys:
                 it is immutable (unless you repaint your keyboard...)

       Chord     This term refers to a set of two or more keys held down simultaneously (by analogy  with  piano
                 keyboards.)   All but one of the keys will generally be Modifier Keys.  Sometimes Constellation
                 is used to mean the same thing.

       Modifier Key
                 This is a key like shift or control, which is used to alter the interpretation  of  other  keys
                 which are held down at the same time.  Generally, pressing a modifier key without also pressing
                 a non-modifier key does nothing.

                 A  key is a modifier key if it has a Modifier KeySym on it.  (More specifically, if the KeyCode
                 of that key is associated with a Modifier KeySym.)

       Modifier KeySym
                 A KeySym is a modifier keysym if it has a Modifier Bit associated with it.  But, the rules  are
                 a little more complicated than that.  It's easier to describe by example:

                 For  a  key  to  behave as one expects a shift key to behave, the keycode should have the Shift
                 modifier bit set; and the key should generate one of  the  keysyms  Shift_L  and  Shift_R.   If
                 either of these is not true, the key will not behave as a shift key.

                 Analogously,  a  control  key  must  have  the Control modifier set, and use one of the keysyms
                 Control_L or Control_R.

                 This implies that if you wanted to swap your shift and control keys, it would not be enough  to
                 simply  swap  their  modifier  bits: you must swap their keysyms as well.  If you only swap the
                 modifier bits, it might appear to work at first, but other things would malfunction.

                 Keys like Meta (and Super, Hyper, etc.) are a bit more complicated (see below.)

       Modifier Bit
                 Modifier bits are  attributes  which  certain  keysyms  can  have.   Some  modifier  bits  have
                 predefined  semantics:  Shift,  Lock,  and  Control.  The remaining modifier bits (Mod1 through
                 Mod5) have semantics which are defined by the keys with which they are associated.

                 That is, the Control modifier means Control if it is attached to Control_L or Control_R, and is
                 illegal elsewhere.

                 But Mod1 means Meta if it is attached to Meta_L or Meta_R; but it would mean  Alt  if  it  were
                 attached  to  Alt_L  or  Alt_R;  or  Hyper  with Hyper_L or Hyper_R; and so on.  (It could not,
                 however, be attached to Control_L, since the Control modifier  has  already  spoken  for  those
                 keysyms.)

                 If you're thinking that this is all senselessly complicated... you're right.

X PROTOCOL DOCUMENT ON KEYMAPS

       The  following is a more precise technical explanation of how keymapping works.  This description is from
       the X Protocol document, and is reprinted here for your convenience:

           A list of KeySyms is associated with each KeyCode.  If that list (ignoring trailing NoSymbol entries)
           is a single KeySym ``K'', then the list is treated as if it were the list ``K NoSymbol K  NoSymbol''.
           If  the  list  (ignoring  trailing NoSymbol entries) is a pair of KeySyms ``K1 K2'', then the list is
           treated as if it were the list ``K1 K2 K1 K2''.  If the list (ignoring trailing NoSymbol entries)  is
           a  triple  of  KeySyms  ``K1  K2  K3'',  then  the  list is treated as if it were the list ``K1 K2 K3
           NoSymbol''.

           The first four elements of the list are split into two groups of KeySyms.  Group 1 contains the first
           and second KeySyms, Group 2 contains third and fourth KeySyms.  Within  each  group,  if  the  second
           element  of the group is NoSymbol, then the group should be treated as if the second element were the
           same as the first element, except when the first element is an alphabetic KeySym ``K'' for which both
           lowercase and uppercase forms are defined.  In that case, the group should be treated as if the first
           element were the lowercase form of ``K'' and the second element were the uppercase form of ``K''.

           The standard rules for obtaining a KeySym from a KeyPress event make use of  only  the  Group  1  and
           Group  2  KeySyms;  no interpretation of other KeySyms in the list is given here.  (That is, the last
           four KeySyms are unused.)

           Which group to use is determined by modifier state.  Switching between groups is  controlled  by  the
           KeySym named Mode_switch.

           By  attaching that KeySym to some KeyCode and attaching that KeyCode to any one of the modifiers Mod1
           through Mod5.  This modifier is called the ``group modifier''.  For any KeyCode, Group 1 is used when
           the group modifier is off, and Group 2 is used when the group modifier is on.

           Within a group, which KeySym to use is also determined by modifier state.  The first KeySym  is  used
           when  the Shift and Lock modifiers are off.  The second KeySym is used when the Shift modifier is on,
           or when the Lock modifier is on and the second KeySym is  uppercase  alphabetic,  or  when  the  Lock
           modifier  is  on  and  is  interpreted  as ShiftLock.  Otherwise, when the Lock modifier is on and is
           interpreted as CapsLock, the state of the Shift modifier is applied first to select a KeySym, but  if
           that KeySym is lowercase alphabetic, then the corresponding uppercase KeySym is used instead.

ICCCM ON THE MODIFIER MAPPING

       The  following  is  a  more  precise  technical  explanation  of how modifier keys are interpreted.  This
       description is from the Inter-Client Communications Conventions Manual, and is reprinted  here  for  your
       convenience:

           X11 supports 8 modifier bits,  of which 3 are pre-assigned to Shift, Lock and Control.  Each modifier
           bit  is controlled by the state of a set of keys, and these sets are specified in a table accessed by
           GetModifierMapping() and SetModifierMapping().

           A client needing to use one of the pre-assigned modifiers should assume that the modifier  table  has
           been  set  up  correctly to control these modifiers.  The Lock modifier should be interpreted as Caps
           Lock or Shift Lock according  as  the  keycodes  in  its  controlling  set  include  XK_Caps_Lock  or
           XK_Shift_Lock.

           Clients should determine the meaning of a modifier bit from the keysyms being used to control it.

           A client needing to use an extra modifier,  for example Meta,  should:

             Scan  the  existing modifier mappings.  If it finds a modifier that contains a keycode whose set of
             keysyms includes XK_Meta_L or XK_Meta_R, it should use that modifier bit.

             If there is no existing modifier controlled by XK_Meta_L or XK_Meta_R, it should select  an  unused
             modifier bit (one with an empty controlling set) and:

               If  there  is a keycode with XL_Meta_L in its set of keysyms, add that keycode to the set for the
               chosen modifier, then

               if there is a keycode with XL_Meta_R in its set of keysyms, add that keycode to the set  for  the
               chosen modifier, then

               if  the  controlling set is still empty,  interact with the user to select one or more keys to be
               Meta.

             If there are no unused modifier bits, ask the user to take corrective action.

       The above means that the Mod1 modifier does not necessarily mean Meta, although some  applications  (such
       as twm and emacs 18) assume that.  Any of the five unassigned modifier bits could mean Meta; what matters
       is that a modifier bit is generated by a keycode which is bound to the keysym Meta_L or Meta_R.

       Therefore,  if you want to make a ``meta'' key, the right way is to make the keycode in question generate
       both a Meta keysym, and some previously-unassigned modifier bit.

THE MODE_SWITCH KEYSYM

       In case the above didn't make sense, what the Mode_switch keysym does is, basically, act as an additional
       kind of shift key.  If you have four keysyms attached to the A key,  then  those  four  keysyms  will  be
       accessed by the chords: A; Shift-A, Mode_Switch-A; and Mode_Switch-Shift-A, respectively.

       Like  any  Modifier  Key,  for  Mode_switch to function, it must have a modifier bit attached to it.  So,
       select one of the bits Mod1 through Mod5 (whichever is unused) and attach that to the Mode_switch key.

THE MULTI_KEY KEYSYM

       Not to be confused with Mode_switch, Multi_key allows the input  of  multiple  character  sequences  that
       represent a single character (keysym.)  A more traditional name for this keysym might have been Compose.

       The  Multi_key keysym is not a modifier keysym.  That is, for it to function properly, it should not have
       any modifier bits associated with it.  This is because it is not a ``chording'' key: you do not  hold  it
       down along with other keys.  Rather, you press Multi_key, then release it, then press and release another
       key, and the two together yield a new character.

       For  example,  one traditional binding would be for Multi_key, followed by single-quote, followed by A to
       produce the Aacute keysym.

       Not all vendors support the use of the Multi_key keysym; in particular, Digital, Sun, and HP support  it,
       but  the  X  Consortium  does  not.   (The  reason for this, I am told, is that ``Compose'' sequences are
       considered obsolete; the party line is that you should be using Input Methods to do this.)

       Whether Multi_key works is a property of the Xt library (not the X server) so it's  possible  that  on  a
       single  system,  Multi_key  might  work  with  some  applications  and not others (depending on how those
       applications were compiled and linked.)

       If you use Lucid Emacs or XEmacs, then you can take advantage of Multi_key sequences even if your version
       of Xt doesn't support it, by loading the x-compose library, which simulates the traditional Xt  behavior.
       For  more  info,  read  the  commentary  at  the  top  of  the  file "/usr/local/lib/xemacs-*/lisp/x11/x-
       compose.el".

DEAD KEYSYMS

       Dead keys work similarly Multi_key, but they are two-keystroke commands instead of three.   For  example,
       pressing  the  Dead_tilde  key,  releasing  it,  then pressing the A key would generate the single keysym
       Atilde.  (They are called ``dead'' keys because they  do  not,  by  themselves,  insert  characters,  but
       instead modify the following character typed.  But HP likes to call them ``mute'' instead of ``dead,'' no
       doubt to avoid frightening the children.)

       Again, these are not supported by all versions of the Xt library (but can be simulated by XEmacs.)

       Also  note  that  different vendors have different names for the dead keysyms.  For example: depending on
       your vendor, X server version, and the phase of the moon, you might find that the name of  ``dead-tilde''
       is  Dead_Tilde,  Dtilde,  SunFA_Tilde,  SunXK_FA_Tilde,  DXK_tilde,  DXK_tilde_accent, hpmute_asciitilde,
       hpXK_mute_asciitilde, or even XK_mute_asciitilde.  It's a mess!  You'll have to just try it and see  what
       works, if anything.

THINGS YOU CAN'T DO

       People  often  ask  if xkeycaps or xmodmap can be used to make one key generate a sequence of characters.
       Unfortunately, no: you can't do this sort of thing by manipulating the server's keymaps.  The X  keyboard
       model just doesn't work that way.

       The way to do such things is to set translation resources on particular widgets.  It has to be done on an
       application-by-application  basis.   For  example,  here's  how you would convince xterm(1) to insert the
       string next when you hit F17:
       xterm*VT100.Translations: #override \
           <Key>F17: string("next")
       Other applications may have different mechanisms for accomplishing the same thing, and some  applications
       might not support it at all.  Check the relevant man pages for specifics.

       Likewise,  you can't convince one key to generate another key with modifiers (for example, you can't make
       F1 behave like Ctrl-A except by using translations, as above.)

       It is also not possible to make a keyboard key behave as a mouse button.

LOSER VENDORS

       Both HP and S.u.S.E. ship their systems with broken keyboard settings by  default.   They  really  should
       know better, but they don't.

       As  explained  above,  it  is  undefined behavior for one modifier bit to be shared between two keys with
       dissimilar semantics.

       By default, HP uses Mod1 for both Meta and Mode_switch.  This means that it's impossible for a program to
       tell the difference between, for example, Meta-X and Mode_switch-X.

       So, to repair this mess, you need to give the  Mode_switch  key  a  different  modifier  bit  (mod2,  for
       example.)  Or, you could just remove it from the keymap entirely.

       S.u.S.E.  Linux  is  even  more  screwed  up  than HP: whereas HP's default keymap contains only one bug,
       S.u.S.E.'s default map contains three completely different errors!

       First, their default keymap has the Control modifier attached to both the Control key and the  Multi_key.
       This  is completely crazy, because not only is Multi_key not a control key, it's not even a chording key!
       It mustn't have any modifier bits attached to it at all.

       Second, they attach Mod1 to Meta_L and also to Alt_R.  Some people think that ``meta''  and  ``alt''  are
       synonyms,  but  the  fact  is  that  the X Window System does not agree.   Those are distinct keys.  It's
       possible to have both ``meta'' and ``alt'' keys on the keyboard at the same time, and  to  have  programs
       interpret  them distinctly.  But of course only if they don't bogusly share the same modifier bit, making
       the interpretation of that bit be ambiguous.

       Third, they attach Mod5 to both Scroll_Lock and to Hyper_R, which is wrong for reasons that should by now
       be obvious.

       The easiest way to fix your S.u.S.E. configuration is to: remove control from Multi_key; change the  left
       Alt key to generate Alt_L instead of Meta_L; and delete the Hyper_R keysym from the keyboard.

       If you have any pull with these vendors, I encourage you to encourage them to get their act together.

X RESOURCES

       XKeyCaps understands all of the core resource names and classes as well as:

       *Keyboard.keyboard (class Keyboard)
           Which  keyboard  to  display;  this is the same as the -keyboard command-line option.  If this is not
           specified, the default keyboard is guessed, based on the server's vendor identification string.

       *Keyboard.Keyboard.selectCursor (class Cursor)
           The cursor to use when selecting a key or window with  the  mouse.   The  default  is  the  crosshair
           cursor.

       *Keyboard.Key.highlight (class Background)
           The  color  to  use  to  highlight a key when it is depressed.  If this is the same as the background
           color of the key, it is highlighted with a stipple pattern instead.

       *Keyboard.Key.keycapColor (class Foreground)
           The color to paint the keycap string.

       *Keyboard.Key.keycodeColor (class Foreground)
           The color to paint the keycode number.

       *Keyboard.Key.borderColor (class Color)
           The color of the box around each key.

       *Keyboard.Key.keycapFont (class Font)
           The font to use to draw the keycap string.

       *Keyboard.Key.keycodeFont (class Font)
           The font to use to draw the keycode number.

       *Keyboard.Key.borderWidth (class Int)
           The thickness of the box around each key.

       *Keyboard.Key.gutterWidth (class Int)
           How many pixels to leave between this key and it's neighbors to the right and bottom.

       The class of each key widget is ``Key,'' as you see above.  The name of each key is the string(s) printed
       on its face.  So if you wanted (for example) the Shift keys to have wider borders, you could specify that
       with
       xkeycaps*Keyboard.Shift.borderWidth: 2

ACTIONS

       It is possible to rebind the actions which happen when a key or mouse  button  is  pressed  or  released.
       These actions are available on the Keyboard widget:

       HighlightKey(condition, arg)
           This places the key in question in the highlighted state.

           If  no  argument is passed to this action, then the key is determined by the event which invoked this
           action.  If this action is invoked by a KeyPress or KeyRelease  event,  the  key-widget  is  the  key
           corresponding  to  the  key  that  the  event  represents.  If it is a ButtonPress, ButtonRelease, or
           PointerMotion event, then the key-widget is the one under the mouse.

           The argument may be one of the words mouse, highlighted, or displayed,  meaning  the  key  under  the
           mouse,  the  key most recently highlighted, or the key currently being described in the ``Info'' area
           at the top of the window, respectively.

           The condition may be one of the words ifmod, unlessmod, iftracking, unlesstracking, ifhighlighted, or
           unlesshighlighted.  If ifmod was specified and the key in question (as determined by the argument  or
           by  the  invoking  event)  is  not  a  modifier key, then this action is not executed.  The unlessmod
           condition is the opposite.  The iftracking and unlesstracking conditions allow you to do some actions
           only if (or unless) the key is being ``tracked'' with the mouse (see below.)  The  ifhighlighted  and
           unlesshighlighted  actions  allow  you  to  do some things only if (or unless) the key in question is
           currently in the highlighted state.

       UnhighlightKey(condition, arg)
           This places the key in question in the unhighlighted state.  Arguments are as above.

       ToggleKey(condition, arg)
           This makes the key be highlighted if it is unhighlighted, or  unhighlighted  if  it  is  highlighted.
           Arguments are as above.

       SimulateKeyPress(condition, arg)
           This  action  makes  a  KeyPress  event  corresponding to the key be synthesized on the focus window.
           Arguments are as above.

       SimulateKeyRelease(condition, arg)
           This action makes a KeyRelease event corresponding to the key be synthesized  on  the  focus  window.
           Arguments are as above.

       TrackKey(condition, arg)
           This  makes  the key in question begin being ``tracked'', which means that moving the mouse off of it
           will simulate a button-release action, and then will simulate a button-press action on the  key  that
           the  mouse  has  moved  on  to.   This action may only be invoked from a ButtonPress or ButtonRelease
           event.

       UntrackKey(condition, arg)
           This makes the key in question no longer be ``tracked.''

       DescribeKey(condition, arg)
           This action causes the key and its bindings to be displayed in the ``Info'' section at the top of the
           window, if it is not already described there.

       The default actions for the Keyboard widget are:
       <Motion>:   DescribeKey(mouse,unlessTracking)      \n\
       \
       <KeyDown>:  HighlightKey()                         \
                   DescribeKey(unlessMod)                 \
                   DescribeKey(displayed)                 \
                   SimulateKeyPress()                     \n\
       \
       <KeyUp>:    UnhighlightKey()                       \
                   DescribeKey(displayed)                 \
                   SimulateKeyRelease()                   \n\
       \
       <Btn1Down>: HighlightKey(unlessMod)                \
                   ToggleKey(ifMod)                       \
                   TrackKey(unlessMod)                    \
                   SimulateKeyPress(ifHighlighted)        \
                   SimulateKeyRelease(unlessHighlighted)  \n\
       \
       <Btn1Up>:   UntrackKey(highlighted)                \
                   SimulateKeyRelease(highlighted,unlessMod) \
                   UnhighlightKey(highlighted,unlessMod)  \n\
       \
       <Btn3Down>: XawPositionSimpleMenu(keyMenu)         \
                   MenuPopup(keyMenu)                     \n
       If you don't want a key to be described each time the mouse moves over it, you can  remove  the  <Motion>
       action.  In that case, you should probably add DescribeKey() to the <Btn1Down> and <KeyDown> actions.

       If  you  want  the key under the mouse to be described even while the mouse is moving with a button down,
       then remove the unlessTracking parameter from the DescribeKey action bound to <Motion>.

       If you don't want the modifier keys to toggle, then change the Button1 actions to
       xkeycaps*Keyboard.actions:  #override               \
               <Btn1Down>: HighlightKey()                  \
                           TrackKey(unlessmod)             \
                           SimulateKeyPress()              \n\
               <Btn1Up>:   UntrackKey(highlighted)         \
                           SimulateKeyRelease(highlighted) \
                           UnhighlightKey(highlighted)     \n
       Remember that these actions exist on the Keyboard widget, not on the Key widgets.  If you add actions  to
       the Key widgets, things will malfunction.

ENVIRONMENT

       DISPLAY
           to get the default host and display number.

       XENVIRONMENT
           to get the name of a resource file that overrides the global resources stored in the RESOURCE_MANAGER
           property.

       XKEYSYMDB
           to get the location of the XKeysymDB file, which lists the vendor-specific keysyms.

UPGRADES

       The latest version can always be found at http://ftp.debian.org/debian/pool/main/x/xkeycaps/

SEE ALSO

       X(1), xmodmap(1), xset(1), xdpyinfo(1)

BUGS

       Because  this  program  has  default  colors that aren't "black" and "white", the -rv command-line option
       doesn't work.  But the incantation
       % xkeycaps -fg white -bg black -bd white
       will do what you want on a monochrome screen.

       The NeXT default map is believed to be incorrect; someone with access to a NeXT will need to debug this.

       There is no portable way to be sure what keyboard is being used; this means it will often not default  to
       the correct one, and if the user makes changes to the keymap while displaying a keyboard which is not the
       right one, very bad things can happen.

       If  you  depress more than a dozen keys at a time, many X servers get confused, and don't transmit enough
       KeyRelease events; the result of this is that the xkeycaps keys will get ``stuck'' until they are pressed
       again.  (Don't go like that.)

       The AutoRepeat flag is apparently useless on all X servers except the OpenWindows one  (I've  never  seen
       another server that didn't ignore it.)

       You  don't get to select from the set of Vendor keysyms (those keysyms which are defined in the XKeysymDB
       file) unless you're running X11r5 or newer.

       NCD's non-US keyboards do not use the standard R4/R5 mechanism for attaching more than two keysyms to one
       key; instead of simply having three or four keysyms attached to the keycode in question, the Compose  key
       changes  the  actual  keycode of the key (it turns its high bit on.)  The xkeycaps program doesn't really
       understand this.  Someone from NCD support told me that in future releases they will do things the  R4/R5
       way  instead  of  the  way  they do things now, so hacking xkeycaps to understand the current behavior is
       probably not worth the effort.

       The Type at Window command doesn't seem to work on the WreckStation version  of  XTerm.   I  assume  some
       variation of the normal XTerm's Allow SendEvents command is necessary.

       If  you  can't  select anything from the right-button popup menu, it might be because you have NumLock or
       CapsLock down.  I'm not sure how to fix this, it seems to be some dumb Xt thing.

       If the popup menu is always greyed out, or doesn't correspond to the key that you clicked on, it might be
       because you're running xswarm, an old version of xautolock,  or  some  other  program  that  antisocially
       interferes with event-propagation.  (Don't go like that.)

       Because  of the nonlinear way in which this program uses XLookupString, there's no sensible way for it to
       do compose processing, and show you the results of ``dead'' key or Multi_key sequences.

       It needs to know about more keyboard types (and no doubt always will...)

       L-shaped keys aren't drawn accurately.  We should use the Shape extension for that.

       In addition to displaying the ASCII version of the given character, it should display  the  corresponding
       character  in  the  character set (Latin2, Kana, Greek, etc.)  This would require having fonts for all of
       those character sets, though, and as far as I can tell, they don't all come standard.

       When running on a Sun and talking to an OpenWindows server, we should parse  the  appropriate  file  from
       $OPENWINHOME/etc/keytables/  to determine the default keymap.  No doubt there are system-specific ways of
       doing this in other environments as well.

       The HP C compiler complains about "invalid pointer initialization" in the header files.  This is a bug in
       that compiler, not in xkeycaps.  This compiler bug goes away if you invoke  HP's  cc  with  the  the  -Aa
       (ANSI) option.

       The  xmodmap  program still sucks.  Since its ADD and REMOVE directives take keysyms as arguments instead
       of keycodes, there are things that you can do with XKeyCaps that you can't represent in an xmodmap script
       (at least, not without great pain.)

       The xmodmap program has no commands for changing the autorepeat status of keys, so  that  information  is
       not  written  in  the  output.   Perhaps  we  could  write out an appropriate xset command instead.  (For
       example, to turn on autorepeat on PgUp (which happens to have key code 103) on  Solaris,  you  would  do:
       "xset r 103".)

       Some  versions of OpenWound use a nonstandard mechanism for specifying which keys have toggle (lock-like)
       behavior (whereas most other X servers base this behavior on the keysym: if Caps_Lock  or  Shift_Lock  is
       generated, the key locks, otherwise it does not.)  XKeyCaps doesn't know how to change the lock status on
       these servers.  This is because I don't know how, either.  If you know what system calls are necessary to
       hack this behavior, tell me.

       The  XKB  interface of X11R6 looks to provide most of the information which xkeycaps needs to know, but I
       haven't had time to investigate this yet.

COPYRIGHT

       Copyright © 1991-1999 by Jamie Zawinski.  Copyright © 2005-2006 by Christoph Berg.   Permission  to  use,
       copy,  modify, distribute, and sell this software and its documentation for any purpose is hereby granted
       without fee, provided that the above copyright notice appear in all copies and that both  that  copyright
       notice  and this permission notice appear in supporting documentation.  No representations are made about
       the suitability of this software for any purpose.  It is provided "as  is"  without  express  or  implied
       warranty.

AUTHOR

       Jamie Zawinski <jwz@jwz.org>, 10-nov-91.

       Please send in any changes you make!  Especially new keyboards.  The strength of this program lies in the
       fact  that it knows about so many different keyboards, thanks to the hundreds contributions received over
       the years.  If you have to make your own modifications, please do your part!  Send the  changes  back  to
       <cb@df7cb.de> to get them incorporated into a future release.

       Thanks to:
           Jonathan  Abbey,  Alon  Albert,  Vladimir  Alexiev,  David Arnold, David Axmark, Ruediger Back, Pedro
           Bayon, Corne Beerse, Eric Benson, Christoph Berg, Markus  Berndt,  Roger  Binns,  Stefan  Bjornelund,
           black@westford.ccur.com,  Mark Borges, Volker Bosch, Dave Brooks, Lorenzo M. Catucci, Michel Catudal,
           Francois Regis Colin, John Coppens, Cesar Crusius, Bart Van Cutsem, Matthew Davey, Christopher Davis,
           Albrecht Dress, Kristian Ejvind, Michael Elbel, Joe English, Eric Fischer, Morgan  Fletcher,  Olivier
           Galibert,  Carson  Gaspar,  Andre  Gerhard, Daniel Glastonbury, Christian F. Goetze, Dan R. Greening,
           Edgar Greuter, John Gotts, Berthold Gunreben, Jens  Hafsteinsson,  Adam  Hamilton,  Magnus  Hammerin,
           Kenneth  Harker,  Ben  Harris,  Mikael  Hedin, Tom Ivar Helbekkmo, Mick Hellstrom, Neil Hendin, Andre
           Heynatz, Mike Hicks, Alan Ho, Hide Horiuchi, Dirk Jablonowski, Alan Jaffray, Anders  Wegge  Jakobsen,
           Chris Jones, Jorgen Jonsson, Peter Kaiser, Heikki Kantola, Tufan Karadere, Benedikt Kessler, Philippe
           Kipfer, Edwin Klement, John Knox, Haavard Kvaalen, Frederic Leguern, Simon Leinen, Michael Lemke, Tor
           Lillqvist,  Torbjorn  Lindgren,  Tony  Lindstrom, Richard Lloyd, Ulric Longyear, Ulf Magnusson, Cliff
           Marcellus, John A. Martin, Tom McConnell, Grant McDorman,  Hein  Meling,  Jason  Merrill,  Aleksandar
           Milivojevic,  Manuel Moreno, Ken Nakata, Pekka Nikander, Todd Nix, Leif Nixon, Christian Nybo, Antoni
           Pamies Olive, Edgar Bonet Orozco, Steven W. Orr, Martin  Ouwehand,  Daniel  Packman,  John  Palmieri,
           Chris Paulson-Ellis, Antony Pavloff, Eduardo Perez, Michael Piotrowski, Andrej Presern, Jeremy Prior,
           Dominique  Quatravaux,  Matthias  Rabe, Garst R. Reese, Peter Remmers, Todd Richmond, Ken Rose, Pavel
           Rosendorf, Gael Roualland, Lucien Saviot, Johannes Schmidt-Fischer, Andreas Schuch, Larry  Schwimmer,
           Joe  Siegrist,  Jarrod  Smith,  Tom  Spindler,  Robin  Stephenson,  Joerg  Stippa,  D.  Stolte, A. A.
           Stoorvogel, Juergen Stuber, Markus Stumpf, Jeffrey Templon, Jay Thorne,  Anthony  Thyssen,  Christoph
           Tietz,  tkil@scrye.com,  Juha  Vainikka, Poonlap Veeratanabutr, Ivo Vollrath, Gord Vreugdenhil, Ronan
           Waide, Jan Wedekind, Bjorn Wennberg, Mats Wichmann, Stephen Williams, Barry Warsaw, Steven  Winikoff,
           Carl Witty, Stephen Wray, Endre Witzoe, Kazutaka Yokota, Yair Zadik, and Robert Zwickenpflug.

XKeyCaps 2.47                                       02-Jan-06                                        XKeyCaps(1)