Provided by: xkeycaps_2.47-8_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.