← Back to team overview

ubuntu-multiseat team mailing list archive

Lightdm and Xephyr multiseat fun

 

Hi guys,

Using Ubuntu 13.10 i686 and the superb work in the ubuntu-multiseat
PPA, I run a configured X server on a dual-output Intel GPU (started
from a modified lightdm upstart script [1]):
# /usr/bin/Xorg :0 -nolisten tcp vt7

then start configured [2] lightdm, which in turn runs the Xephyr
wrapper [3]. Both user sessions start; so far so good.

Since I need to also attach touchscreen and sound to the screens, I
have to use udev tags, so I assign a mouse the 'seat1' tag [4,5] and
it isn't listed in 'loginctl seat-status seat0' as expected, but it
doesn't move the cursor on the second head (or first).

loginctl shows only a single seat, despite both Xephyr servers being
passed '-seat seat0' and '-seat1' (which isn't listed in 'Xephyr
-help):
$ loginctl list-seats
SEAT
seat0

1 seats listed.

Any idea what I'm missing?

Many thanks!
  Daniel

-- [1] /etc/init/lightdm.conf

# LightDM - light Display Manager
#
# The display manager service manages the X servers running on the
# system, providing login and auto-login services
#
# based on gdm upstart script

description    "LightDM Display Manager"
author        "Robert Ancell <robert.ancell@xxxxxxxxxxxxx>"

start on ((filesystem
           and runlevel [!06]
           and started dbus
           and plymouth-ready)
          or runlevel PREVLEVEL=S)

stop on runlevel [016]

emits login-session-start
emits desktop-session-start
emits desktop-shutdown

script
    if [ -n "$UPSTART_EVENTS" ]
    then
        # Check kernel command-line for inhibitors, unless we are being called
        # manually
        for ARG in $(cat /proc/cmdline); do
            if [ "$ARG" = "text" ]; then
        plymouth quit || :
                stop
        exit 0
            fi
        done

    [ ! -f /etc/X11/default-display-manager -o "$(cat
/etc/X11/default-display-manager 2>/dev/null)" = "/usr/bin/lightdm" -o
"$(cat /etc/X11/default-display-manager 2>/dev/null)" =
"/usr/sbin/lightdm" ] || { stop; exit 0; }

    if [ "$RUNLEVEL" = S -o "$RUNLEVEL" = 1 ]
    then
        # Single-user mode
        plymouth quit || :
        exit 0
    fi
    fi

    # start parent X server
    /usr/bin/Xorg :0 -nolisten tcp vt7 &
    until xrefresh -display :0.0 2>/dev/null; do sleep 0.2; done

    exec lightdm
end script

post-start script
    sleep 5
    clear > /dev/tty7
end script

post-stop script
    if [ "$UPSTART_STOP_EVENTS" = runlevel ]; then
        initctl emit desktop-shutdown
    fi
    killall /usr/bin/Xorg || :
end script

-- [2] /usr/share/X11/xorg.conf.d/90-multiseat.conf

Section "ServerLayout"
    Identifier "Layout"
    Screen     "screen0"
    Screen     "screen1" Below "screen0"

    Option     "AllowMouseOpenFail" "true"
    Option     "DontVTSwitch" "yes"
    Option     "DontZap" "yes"
EndSection

Section "Device"
    Identifier  "card0"
    Driver      "intel"
    Option      "AccelMethod" "SNA"
    Option      "ZaphodHeads" "HDMI1"
    Screen      0
EndSection

Section "Device"
    Identifier  "card1"
    Driver      "intel"
    Option      "AccelMethod" "SNA"
    Option      "ZaphodHeads" "HDMI2"
    Screen      1
EndSection

Section "Screen"
    Identifier "screen0"
    Device     "card0"
EndSection

Section "Screen"
    Identifier "screen1"
    Device     "card1"
EndSection

-- [2] /etc/lightdm/lightdm.conf.d/90-multiseat.conf

[SeatDefaults]
user-authority-in-system-dir=true
autologin-user-timeout=10
autologin-session=ubuntu
xserver-command=/usr/local/bin/xephyr-wrapper

[Seat:0]
xdg-seat=seat0
autologin-user=me1

[Seat:1]
xdg-seat=seat1
autologin-user=me2
xserver-vt=0

-- [3] /usr/local/bin/xephyr-wrapper

#!/bin/bash

export DISPLAY=:0.$((${1#:}-1))
declare -a argv=("$@")

# drop incompatible args
for (( i=0; i<${#argv[@]}; i++ )); do
    case ${argv[$i]} in
    -novtswitch|-sharevts|vt7|-config|-layout)
        argv[$i]=""
        ;;
    esac
done

echo "Starting Xephyr on display $DISPLAY with ${argv[@]}"
exec /usr/bin/Xephyr -fullscreen ${argv[@]}

-- [4] /etc/udev/rules.d/99-multiseat.rules

DEVPATH=="/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2",
ENV{ID_SEAT}="seat1", TAG+="seat1"

-- [5] udevadm test /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/

...
ACTION=add
BUSNUM=001
DEVNAME=/dev/bus/usb/001/005
DEVNUM=005
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2
DEVTYPE=usb_device
DRIVER=usb
ID_BUS=usb
ID_MODEL=USB_OPTICAL_MOUSE
ID_MODEL_ENC=\x20USB\x20OPTICAL\x20MOUSE
ID_MODEL_FROM_DATABASE=Optical Mouse
ID_MODEL_ID=0a4d
ID_REVISION=0100
ID_SEAT=seat1
ID_SERIAL=15d9_USB_OPTICAL_MOUSE
ID_USB_INTERFACES=:030102:
ID_VENDOR=15d9
ID_VENDOR_ENC=15d9
ID_VENDOR_FROM_DATABASE=Trust International B.V.
ID_VENDOR_ID=15d9
MAJOR=189
MINOR=4
PRODUCT=15d9/a4d/100
SUBSYSTEM=usb
TAGS=:seat1:
TYPE=0/0/0
USEC_INITIALIZED=19896680505
unload module index
-- 
Daniel J Blueman


Follow ups