Input

Revision 5 as of 2009-04-23 20:25:08

Clear message

Ubuntu 8.04 and later include a new version of Xorg which support input-hotplug. With this new functionality, it's likely that you won't need to do any configuration at all to make your devices work, assuming they're recognized and set up by the kernel. However, if you do need to do adjust things, read on.

Dynamic Input Configuration with xinput

The xinput command line tool can be used for some on-the-fly configuration adjustments. Ubuntu 8.04 users will first need to install xinput from universe.

To view a listing of the input devices X sees, run:

$ xinput list
...
"Configured Mouse"      id=2    [XExtensionPointer]
        Num_buttons is 9
        Num_axes is 2
        Mode is Relative
        Motion_buffer is 256
        Axis 0 :
                Min_value is -1
                Max_value is -1
                Resolution is 1
        Axis 1 :
                Min_value is -1
                Max_value is -1
                Resolution is 1
"Generic Keyboard"      id=3    [XExtensionKeyboard]
        Num_keys is 248
        Min_keycode is 8
        Max_keycode is 255

Individual devices can be queried for more details:

$ xinput query-state "Configured Mouse"
2 classes :
ButtonClass
        button[1]=up
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=3182
        valuator[1]=969

If you have multiple mouse devices installed, you can switch which is considered the core pointer like this:

$ xinput set-pointer "Configured Mouse"

xinput can also be used to alter the button mappings on mice and adjust the acceleration and feedback settings.

In Ubuntu 8.10 and later, different input drivers may also expose arbitrary properties for applications to set. Synaptics touchpads are particularly configurable like this, but other devices have some more general properties.

$ xinput list-props "SynPS/2 Synaptics TouchPad"
Device 'SynPS/2 Synaptics TouchPad':
        Device Enabled:         1
        Synaptics Edges:                1632, 5312, 1575, 4281
        Synaptics Finger:               25, 30, 256
        Synaptics Tap Time:             180
        Synaptics Tap Move:             220
        Synaptics Tap Durations:                180, 180, 100
        Synaptics Tap FastTap:          0
[...]

$ xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Device Enabled" 8 0
$ xinput list-props "SynPS/2 Synaptics TouchPad"
Device 'SynPS/2 Synaptics TouchPad':
        Device Enabled:         0
        Synaptics Edges:                1632, 5312, 1575, 4281
        Synaptics Finger:               25, 30, 256
        Synaptics Tap Time:             180
        Synaptics Tap Move:             220
        Synaptics Tap Durations:                180, 180, 100
        Synaptics Tap FastTap:          0
[...]

Input Configuration with HAL

Beginning with Ubuntu 8.10, input device configuration is done through HAL rather than in your xorg.conf. The syntax for HAL fdi files is a bit different than xorg.conf, and editing XML is only marginally better than editing xorg.conf... but on the plus side configuration changes don't require an X restart - just replugging of the device.

Essentially, to configure a device, add a new fdi file for it to your /etc/hal/fdi/policy directory. You will then need to replug the device or log out and in again for the changes to take effect.

For example, use this sort of fdi file to set Synaptics touchpad options (see the synaptics manpage for possible options, or the Synaptics documentation for other methods):

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
 <device>
  <match key="input.x11_driver" string="synaptics">
   <merge key="input.x11_options.VertTwoFingerScroll" type="string">true</merge>
   <merge key="input.x11_options.HorizTwoFingerScroll" type="string">true</merge>
  </match>
 </device>
</deviceinfo>

The match elements are used to conditionally match on various attributes related to the device or system. In this case we apply these settings to any device using the synaptics (ie. touchpad) driver. The append elements are used to add parameters to various options. Options previously put in xorg.conf can be set using input.x11_options.<option-name> (string).

Here is an example fdi file for setting up keys on a Dell Precision M20:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" prefix="Precision">
      <match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" contains="M20">
        <append key="input.keymap.data" type="strlist">e005:brightnessdown</append> <!-- Fn+Down arrow Brightness Down -->
        <append key="input.keymap.data" type="strlist">e006:brightnessup</append> <!-- Fn+Up arrow Brightness Up -->
        <append key="input.keymap.data" type="strlist">e007:battery</append> <!-- Fn+F3 battery icon -->
        <append key="input.keymap.data" type="strlist">e008:wlan</append> <!-- Fn+F2 Turn On/Off Wireless -->
        <append key="input.keymap.data" type="strlist">e009:ejectclosecd</append> <!-- Fn+F10 Eject CD -->
        <append key="input.keymap.data" type="strlist">e00a:suspend</append> <!-- Fn+F1 hibernate -->
        <append key="input.keymap.data" type="strlist">e00b:displaytoggle</append> <!-- Fn+F8 CRT/LCD -->
        <append key="info.capabilities" type="strlist">input.keymap</append>
      </match>
    </match>
  </device>
</deviceinfo>

These match elements are used to match on the system's product name, to check that it starts with "Precision" and contains "M20". In this case, we're appending some [key]:[function] pairs to the input.keymap.data option.

As a contrived example, let's say you wanted to specify the dvorak-intl variant and configure the eurosign to the E key:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keys">
      <merge key="input.xkb.variant" type="string">dvorak-intl</merge>
      <merge key="input.xkb.options" type="string">eurosign:e</merge>
    </match>
  </device>
</deviceinfo>

An example of configuring for the Logitech MX1000 USB mouse:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
 <device>
  <match key="info.capabilities" contains="input.mouse">
   <merge key="input.x11_driver" type="string">mouse</merge>

    <!-- Logitech tweaks -->
    <match key="@input.originating_device:usb.vendor_id" int="0x46d">
     <match key="@input.originating_device:usb.product_id" int_outof="0xc50e;0xc518">
      <merge key="input.x11_options.RelHWHEELOptions" type="string">invert</merge>
     </match>
    </match>

   </match>
  </match>
 </device>
</deviceinfo>

The vendor_id and product_id values can be found via

$ cat /proc/bus/input/devices

More on writing fdi's

The fdi file allows you to adjust the HAL layers auto-detection of hardware to make it work better, or work at all. So for instance, I am configuring my mouse. I will need to know what to use to match the input device and how it is identified by hal. Probing the HAL is very easy with

$ lshal | less

I can then search that output with /<search term> . In my case, I can able discover the following about my mouse device:

udi = '/org/freedesktop/Hal/devices/usb_device_2222_3061_noserial_if0_logicaldev_input'
  info.capabilities = {'input', 'input.mouse'} (string list)
  info.category = 'input'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_2222_3061_noserial_if0'  (string)
  info.product = 'Evoluent Vertical Mouse 2'  (string)
  info.subsystem = 'input'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_2222_3061_noserial_if0_logicaldev_input'  (string)
  input.device = '/dev/input/event1'  (string)
  input.originating_device = '/org/freedesktop/Hal/devices/usb_device_2222_3061_noserial_if0'  (string)
  input.product = 'Evoluent Vertical Mouse 2'  (string)
  input.x11_driver = 'evdev'  (string)
  linux.device_file = '/dev/input/event1'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'input'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:0b.1/usb2/2-5/2-5.3/2-5.3:1.0/input/input1/event1'  (string)

I used to have this configured in my xorg.conf like this

Section "InputDevice"
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection
}}

I will need to match the mouse device in the hal output and configure it to respond like it did in my xorg. I created the following fdi file to accomplish this.
{{{
<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.mouse">
        <merge key="input.x11_driver" type="string">mouse</merge>
        <merge key="input.x11_options.Emulate3Buttons" type="string">no</merge>
        <merge key="input.x11_options.ZAxisMapping" type="integer">4 5</merge>
    </match>
  </device>
</deviceinfo>

As you can see, the translation from xorg configuration to fdi is fairly trivial. A simple script could easy accomplish this task. I then repeated the same method for my keyboard configuration.

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
      <merge key="input.x11_driver" type="string">kbd</merge>
    </match>
  </device>
</deviceinfo>

Thats it. Here are a few more links on general fdi configuration

Troubleshooting

If you run into a problem where you HAL hardware detection just doesn't work with GDM(once the login screen comes up) you're not alone. It looks like there is an issue with the gdm start priorities. Since a patch is not released yet, you can read about it here, the best solution is to alter the boot priorities of gdm during start up so it always starts after hal. You do that by running the following:

$ sudo update-rc.d -f gdm remove #get rid of the old boot symlinks
$ sudo update-rc.d gdm defaults 25 #add the new ones with a higher priority

That's all there is to it. Hopefully that fixed the issue for you. If not, try converting your old xorg.conf input sections to fdi files using the techniques described above.

Disable Middle Mouse Paste

If you have a two-button (non-scrollwheel) mouse and want to get rid of the paste behavior when clicking left and right buttons simultaneously, you can disable it during run-time like this:

First find your input devices id:

$ xinput list | grep 'id='

"Virtual core pointer"  id=0    [XPointer]
"Virtual core keyboard" id=1    [XKeyboard]
"AT Translated Set 2 keyboard"  id=2    [XExtensionKeyboard]
"Macintosh mouse button emulation"      id=3    [XExtensionPointer]
"Logitech USB-PS/2 Optical Mouse"       id=4    [XExtensionPointer]

Then look at the input properties available for it:

$ xinput list-props 4

Device 'Logitech USB-PS/2 Optical Mouse':
        Device Enabled (94):            1
        Evdev Axis Inversion (229):             0, 0
        Evdev Reopen Attempts (226):            10
        Evdev Axis Calibration (227):           
        Evdev Axes Swap (228):          0
        Evdev Middle Button Emulation (230):            2
        Evdev Middle Button Timeout (231):              50
        Evdev Wheel Emulation (232):            0
        Evdev Wheel Emulation Axes (233):               0, 0, 4, 5
        Evdev Wheel Emulation Inertia (234):            10
        Evdev Wheel Emulation Timeout (235):            200
        Evdev Wheel Emulation Button (236):             4
        Evdev Drag Lock Buttons (237):          0

Finally, disable the middle mouse button like this:

$ xinput set-int-prop 4 230 8 2

If you want to set it permanently, system-wide, do the following.

First find your mouse's info.product as follows:

 lshal | less

Search for your mouse device and note its info.product value.

Then, edit your preferences.fdi file:

# /etc/hal/fdi/policy/preferences.fdi 
<device>
  <match key=”info.capabilities” contains=”input.mouse”>
    <match key=”info.product” string=”<your mouse’s info.product>”>
      <merge key=”input.x11_options.Emulate3Buttons” type=”string”>false</merge>
    </match>
  </match>
</device>

Contributed Documentation

The following documentation was provided by various people in the past. Generally, much of it was written for pre-InputHotplug X, so may or may not still work in Intrepid.

Keyboard Config

Mouse Config

Tablet Config

Touchpad Config

Game Controller Config