Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
XKeyCaps(1)		     General Commands Manual		     XKeyCaps(1)

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 de-
     scribes 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 an-
	 other 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.

X OPTIONS
     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 win-
	 dow.  The default is light gray.

     -fg color
	 This option specifies the color to use for the foreground of  the  win-
	 dow.  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 op-
	 tions.

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 gener-
		 ates.

     ASCII:	 This displays the ASCII equivalent of this key, taking into ac-
		 count 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 Con-
		 trol.

     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  dis-
	 played.   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.  Af-
	 ter 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 win-
	 dows 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  exe-
	 cute  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 us-
	 ing 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  De-
	 fault 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 sim-
     ulated 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 sim-
     ulated 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 inter-
     cept 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 ex-
	 changed.  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  immedi-
	 ately.

     Restore Key To Default
	 The  key  on  which you brought up the menu will be restored to its de-
	 fault 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  in-
	 terpretation  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 charac-
	 ter 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 punc-
	       tuation 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 seman-
	       tics (and makes the A key generate an A), not the KeyCodes.

	       Usually keys are associated with one or two keysyms, which corre-
	       spond to the symbols generated when the key is pressed, and  when
	       it  is pressed while the shift key is held down.  There is a spe-
	       cial 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 simultan-
	       iously  (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 ei-
	       ther 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  modi-
	       fier  bits,  it	might  appear to work at first, but other things
	       would malfunction.

	       Keys like Meta (and Super, Hyper, etc.) are a  bit  more  compli-
	       cated (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 asso-
	       ciated.

	       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 (ig-
	 noring 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 con-
	 tains third and fourth KeySyms.  Within each group, if the second  ele-
	 ment  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.   Oth-
	 erwise,  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 up-
	 percase 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  Get-
	 ModifierMapping() 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 mod-
	 ifiers.   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, al-
     though 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-unas-
     signed 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, respec-
     tively.

     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  rea-
     son for this, I am told, is that ``Compose'' sequences are considered obso-
     lete; 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 com-
     piled 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/lo-
     cal/lib/xemacs-*/lisp/x11/x-compose.el".

DEAD KEYSYMS
     Dead keys work similarly Multi_key, but they are two-keystroke commands in-
     stead 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  chil-
     dren.)

     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,   hp-
     mute_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  gener-
     ate 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 rele-
     vant 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 transla-
     tions, 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 exam-
     ple) 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 but-
     ton 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,  Button-
	 Release,  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, un-
	 lesstracking, ifhighlighted, or unlesshighlighted.  If ifmod was speci-
	 fied  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  exe-
	 cuted.   The  unlessmod  condition is the opposite.  The iftracking and
	 unlesstracking conditions allow you to do some actions only if (or  un-
	 less)	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 unhigh-
	 lighted if it is highlighted.	Arguments are as above.

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

     SimulateKeyRelease(condition, arg)
	 This  action  makes a KeyRelease event corresponding to the key be syn-
	 thesized 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  de-
	 scribed 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  ac-
     tions 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-spe-
	 cific keysyms.

UPGRADES
     The  latest  version  can	always	be  found  at  http://ftp.debian.org/de-
     bian/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  con-
     fused,  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 Open-
     Windows 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 attach-
     ing 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 be-
     havior 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 ver-
     sion 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  char-
     acter 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 de-
     fault 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  com-
     piler 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 (C) 1991-1999 by Jamie  Zawinski.   Copyright  (C)  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  im-
     plied 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  dif-
     ferent  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 fu-
     ture release.

     Thanks to:
	 Jonathan Abbey, Alon Albert, Vladimir Alexiev, David Arnold, David  Ax-
	 mark,	Ruediger Back, Pedro Bayon, Corne Beerse, Eric Benson, Christoph
	 Berg,	Markus	Berndt,  Roger	Binns,	Stefan	Bjornelund,  black@west-
	 ford.ccur.com,  Mark  Borges,	Volker	Bosch,	Dave  Brooks, Lorenzo M.
	 Catucci, Michel Catudal, Francois Regis Colin, John Coppens, Cesar Cru-
	 sius, Bart Van  Cutsem,  Matthew  Davey,  Christopher	Davis,	Albrecht
	 Dress,  Kristian Ejvind, Michael Elbel, Joe English, Eric Fischer, Mor-
	 gan 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 Ham-
	 merin, 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 McDor-
	 man, Hein Meling, Jason Merrill, Aleksandar Milivojevic, Manuel Moreno,
	 Ken  Nakata,  Pekka Nikander, Todd Nix, Leif Nixon, Christian Nybo, An-
	 toni Pamies Olive, Edgar Bonet Orozco, Steven W. Orr, Martin  Ouwehand,
	 Daniel Packman, John Palmieri, Chris Paulson-Ellis, Antony Pavloff, Ed-
	 uardo	Perez,	Michael  Piotrowski,  Andrej  Presern, Jeremy Prior, Do-
	 minique Quatravaux, Matthias Rabe, Garst R. Reese, Peter Remmers,  Todd
	 Richmond, Ken Rose, Pavel Rosendorf, Gael Roualland, Lucien Saviot, Jo-
	 hannes  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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=xkeycaps&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help