Jak automatycznie przełączać monitory za pomocą stacji dokującej do laptopa

11

Mam Dell Precision M4300 z Dell Dock PRO1X z systemem Ubuntu Natty.

Kiedy mam zadokowany laptop, wyświetlacz lcd jest wyłączony i korzystam z dwóch zewnętrznych monitorów, jednak po oddokowaniu laptopa nie przełącza się na ekran laptopa. To samo dzieje się, gdy dokuję laptopa, nie przełącza się on na zewnętrzne monitory.

Po ponownym uruchomieniu laptopa wybierze prawidłową konfigurację, ale nie zmieni automatycznie monitorów z uruchomionym Ubuntu.

Mój Xorg.conf

Cas
źródło

Odpowiedzi:

10

Dock / UnDock Scripts

W końcu przygotowałem kompletną konfigurację skryptu, która wykryje mój status stacji dokującej i automatycznie przełączy monitory.

Pierwszą rzeczą, którą zrobiłem, było pozbycie się mojego Xorg.conf, ponieważ spowodował więcej problemów, które rozwiązał. Ponieważ używam karty NVDIA I w końcu okazało się, że za pomocą disper była najlepsza droga. Zdyskontowałem go wcześniej, ponieważ jego standardowe polecenia nie mogły osiągnąć konfiguracji dualview, ale potem odkryłem, że mogę stworzyć niestandardowy metamode do użycia z disper.

Aby utworzyć niestandardowy metamode, wykorzystałem wartości zapisane w Xorg.conf wraz z poprzednimi testami z nv-control-dpy i xrandr jako wskazówką. Ten metamode i inne wartości twinview zostały dodane do pliku, który można przekazać w celu rozproszenia standardowego wejścia .

Ze względu na posiadanie monitorów o różnej wielkości z Twinview, muszę użyć XCreateMouseVoid , jak opisano w tym pytaniu .

Poniżej znajduje się pełna lista skryptów i plików z ich zawartością.


Skrypty

  1. Utwórz skrypt XCreateMouseVoid:

    Nazwa skryptu: ~/.mousevoid

    #!/bin/bash
    echo "Mouse Void"
    /opt/XCreateMouseVoid/XCreateMouseVoid 0 1112 1280 88 &
    /opt/XCreateMouseVoid/XCreateMouseVoid 0 0 1280 88 &
    

    chmod +x ~/.mousevoid

  2. Utwórz plik ustawień Disper:

    Nazwa pliku: ~/.disperDocked

    backend: nvidia
    associated displays: CRT-0, DFP-0, DFP-1
    metamode: CRT-0: 1280x1024_60 @1280x1024 +0+88, DFP-1: 1920x1200 @1920x1200 +1280+0
    scaling: default, default, stretched
    xinerama info order: DFP-1, CRT-0, DFP-0
    
  3. Utwórz skrypt sesji eksportu dbus:

    Nazwa skryptu: ~/.export_x_info

    #!/bin/bash
    # Export the dbus session address on startup so it can be used by any other environment
    sleep 5
    touch $HOME/.Xdbus
    chmod 600 $HOME/.Xdbus
    env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.Xdbus
    echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.Xdbus
    # Export XAUTHORITY value on startup so it can be used by cron
    env | grep XAUTHORITY >> $HOME/.Xdbus
    echo 'export XAUTHORITY' >> $HOME/.Xdbus
    

    Ustawiony tylko na plik wykonywalny użytkownika: chmod 700 ~/.export_x_info

    Następnie umieść go w aplikacjach startowych:

    Name: X Environment Variables
    Command: /home/your_user/.export_x_info
    

    O ile nie uruchomisz ponownie, musisz uruchomić ~ / .export_x_info, aby utworzyć plik .Xdbus

  4. Utwórz regułę udev, która będzie działać po zdarzeniu dokowania:

    Nazwa skryptu: /etc/udev/rules.d/81-dell-dock.rules

    KERNEL=="dock.0", ACTION=="change", RUN+="/usr/local/sbin/dell-dock"

    chmod +x /etc/udev/rules.d/81-dell-dock.rules

  5. Utwórz skrypt powiązany z regułą udev:

    Nazwa skryptu: /usr/local/sbin/dell-dock

    #!/bin/sh
    # wait for the dock state to change
    sleep 0.5
    DOCKED=$(cat /sys/devices/platform/dock.0/docked)
    case "$DOCKED" in
       "0")
           echo "Run UnDocking Script..."
            /usr/local/sbin/undock
            ;;
        "1") 
            echo "Run Docking Script..."
            /usr/local/sbin/dock
            ;;
    esac
    exit 0
    

    chmod +x /usr/local/sbin/dell-dock

  6. Utwórz skrypt oddokowania (zmień swojego_użytkownika, aby pasował do swojej nazwy użytkownika):

    Nazwa skryptu: /usr/local/sbin/undock

    #!/bin/bash
    USER=your_user
    export HOME=/home/$USER
    source $HOME/.Xdbus
    export DISPLAY=:0
    echo "UnDocking Script"
    echo "Switch primary monitor"
    sudo -u $USER disper -s
    echo "Killall XCreateMouseVoid"
    pkill XCreate
    echo "Restart conky"
    pkill conky
    sudo -u $USER conky &
    

    chmod +x /usr/local/sbin/undock

  7. Utwórz skrypt dokowania (zmień swojego_użytkownika, aby pasował do nazwy użytkownika):

    Nazwa skryptu: /usr/local/sbin/dock

    #!/bin/bash
    USER=your_user
    export HOME=/home/$USER
    source $HOME/.Xdbus
    export DISPLAY=:0
    echo "Docking Script"
    echo "Switch to Dualview"
    sudo -u $USER disper -i < $HOME/.disperDocked
    echo "Start XCreateMouseVoid"
    pkill XCreate
    sudo -u $USER $HOME/.mousevoid
    echo "Restart conky"
    pkill conky
    sudo -u $USER conky &
    

    chmod +x /usr/local/sbin/dock


Odpluskwić

Aby debugować skrypty dokowania, musisz włączyć rejestrowanie debugowania udev:

udevadm control --log-priority=debug

Następnie otwórz syslog w przeglądarce plików dziennika


Zasoby

Readme nVidia: Config Twinview , X Config Opcje
Autorandr
Disper PPA
nv-control-dpy
Forum Ubuntu - Un / Dock Skrypty
Thinkwiki
udevadm

Cas
źródło
Cas, zasugerowano, że skomentuję twój post, aby zapytać o problem, który mam z tym: askubuntu.com/questions/68737/auto-switching-with-dock
Toby Joiner
Czy masz skrypt dell-dock.sh?
Cas
1
Tak, wygląda na to, że ten plik nie istnieje: $ cat /sys/devices/platform/dock.0/docked cat: /sys/devices/platform/dock.0/docked: No such file or directory
Toby Joiner
3

Możesz użyć autorandr .

Automatycznie wykryj podłączony sprzęt wyświetlacza i załaduj odpowiednią konfigurację X11 za pomocą xrandr lub disper

Automatycznie wybierz konfigurację wyświetlania na podstawie podłączonych urządzeń

Zobacz też:

landroni
źródło
To rozwiązanie jest bezbolesne i działa świetnie.
sklep spożywczy