Bug 24712

Summary: Input device hotplugging is incompatible with multiseat mode
Product: xorg Reporter: Ilia K. <mail4ilia>
Component: Server/Input/CoreAssignee: Xorg Project Team <xorg-team>
Status: RESOLVED FIXED QA Contact: Xorg Project Team <xorg-team>
Severity: normal    
Priority: medium CC: peter.hutterer
Version: git   
Hardware: All   
OS: Linux (All)   
Whiteboard:
i915 platform: i915 features:
Attachments:
Description Flags
proposed fix
none
proposed fix
none
proposed fix none

Description Ilia K. 2009-10-24 08:00:15 UTC
The usual deployment of multiseat environment involves running several instances of X server simultaneously. If hotplugging is enabled, all keyboards/mice are detected and used by all X servers, which makes multiseat environment practically unusable. A traditional workaround for this issue was disabling hotplugging with
 Option  "AutoAddDevices" "false"
However, this workaround misses all the advantages of hotplugging. Particularly, changing a physical keyboard/mouse requires X server restart. This is especially annoying when some low-end keyboards/mice/usb hubs "blink" (go off, then immediately on) due to EMI or something like that.

A possible solution is to allow hotplugging but "filter out" new input device notifications for unnecessary devices.
Comment 1 Ilia K. 2009-10-24 08:45:26 UTC
Created attachment 30657 [details] [review]
proposed fix

Attached patch implements the fix.
A user is able to attach x11_layout option to the device which is matched 
against current server layout id. If x11_layout option is missing, is "*" 
or equals to server layout id, the device is added. Otherwise it's ignored.

Assume that in xorg.conf AutoAddDevices option is set to true (which is a
default) and two ServerLayout sections are present:
Section "ServerLayout"
        Identifier     "Seat0"
        Screen      0  "Screen0" 0 0
EndSection
Section "ServerLayout"
        Identifier     "Seat1"
        Screen      0  "Screen1" 0 0
EndSection

Than the following file can be added as
/etc/hal/fdi/policy/30-multiseat_input.fdi :

<?xml version="1.0" encoding="UTF-8"?>
<!-- define which keyboard/mouse should be used by which instance of X server -->

<deviceinfo version="0.2">
  <device>
    <!-- Seat 0 uses usb hub 1-7 only -->
    <match key="info.category" string="input">
      <match key="linux.sysfs_path" contains="/sys/devices/pci0000:00/0000:00:02.1/usb1/1-7/">
        <merge key="input.x11_options.x11_layout" type="string">Seat0</merge>
      </match>
    </match>

    <!-- Seat 1 uses usb hub 1-8 only -->
    <match key="info.category" string="input">
      <match key="linux.sysfs_path" contains="/sys/devices/pci0000:00/0000:00:02.1/usb1/1-8/">
        <merge key="input.x11_options.x11_layout" type="string">Seat1</merge>
      </match>
    </match>

    <!-- input devices which don't match above rules will be added to all X instances -->
  </device>
</deviceinfo>
Comment 2 Ilia K. 2009-10-24 08:45:30 UTC
Created attachment 30658 [details] [review]
proposed fix

Attached patch implements the fix.
A user is able to attach x11_layout option to the device which is matched 
against current server layout id. If x11_layout option is missing, is "*" 
or equals to server layout id, the device is added. Otherwise it's ignored.

Assume that in xorg.conf AutoAddDevices option is set to true (which is a
default) and two ServerLayout sections are present:
Section "ServerLayout"
        Identifier     "Seat0"
        Screen      0  "Screen0" 0 0
EndSection
Section "ServerLayout"
        Identifier     "Seat1"
        Screen      0  "Screen1" 0 0
EndSection

Than the following file can be added as
/etc/hal/fdi/policy/30-multiseat_input.fdi :

<?xml version="1.0" encoding="UTF-8"?>
<!-- define which keyboard/mouse should be used by which instance of X server -->

<deviceinfo version="0.2">
  <device>
    <!-- Seat 0 uses usb hub 1-7 only -->
    <match key="info.category" string="input">
      <match key="linux.sysfs_path" contains="/sys/devices/pci0000:00/0000:00:02.1/usb1/1-7/">
        <merge key="input.x11_options.x11_layout" type="string">Seat0</merge>
      </match>
    </match>

    <!-- Seat 1 uses usb hub 1-8 only -->
    <match key="info.category" string="input">
      <match key="linux.sysfs_path" contains="/sys/devices/pci0000:00/0000:00:02.1/usb1/1-8/">
        <merge key="input.x11_options.x11_layout" type="string">Seat1</merge>
      </match>
    </match>

    <!-- input devices which don't match above rules will be added to all X instances -->
  </device>
</deviceinfo>
Comment 3 Peter Hutterer 2009-10-25 19:53:12 UTC
Wasn't this supposed to be addressed by ConsoleKit or something?
Comment 4 Peter Hutterer 2013-04-10 05:19:34 UTC
commit 159b03e13760920274b573a2bccdbf6a79f059e7
Author: Lennart Poettering <lennart@poettering.net>
Date:   Mon Jul 18 21:19:23 2011 +0200

    config: add udev/systemd multi-seat support

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.