Como alternar automaticamente os monitores com o dock do meu laptop

11

Eu tenho um Dell Precision M4300 com um Dell Dock PRO1X executando o Ubuntu Natty.

Quando o laptop está acoplado, a tela de LCD está desligada e eu uso dois monitores externos; no entanto, quando desacopro o laptop, ele não muda para a tela do laptop. O mesmo acontece quando encaixo o laptop, ele não muda para os monitores externos.

Se eu reiniciar o laptop, ele escolherá a configuração correta, mas não mudará automaticamente de monitor com o Ubuntu em execução.

My Xorg.conf

Cas
fonte

Respostas:

10

Scripts Dock / UnDock

Finalmente, montei uma configuração completa de script que detectará o status do meu dock e trocará os monitores automaticamente.

A primeira coisa que fiz foi me livrar do meu Xorg.conf, pois causava mais problemas do que resolvia. Como estou usando uma placa nvdia, finalmente descobri que usar o disper era o melhor caminho a percorrer. Eu já o havia desconsiderado antes, pois seus comandos padrão não conseguiam minha configuração de visualização dupla, mas descobri que podia criar um metamodo personalizado para usar com o disper.

Para criar o metamodo personalizado, usei os valores armazenados no Xorg.conf juntamente com os testes anteriores com nv-control-dpy e xrandr como um guia. Este metamodo e outros valores twinview foram adicionados a um arquivo que pode ser passado para dispersar através do stdin .

Devido a ter monitores de tamanhos diferentes com o Twinview, preciso usar o XCreateMouseVoid , conforme descrito nesta pergunta .

Abaixo está uma descrição completa dos scripts e arquivos com seu conteúdo.


Scripts

  1. Crie o script XCreateMouseVoid:

    Nome do script: ~/.mousevoid

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

    chmod +x ~/.mousevoid

  2. Crie o arquivo de configurações do Disper:

    Nome do arquivo: ~/.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. Crie o script de sessão do dbus de exportação:

    Nome do script: ~/.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
    

    Defina apenas como executável pelo usuário: chmod 700 ~/.export_x_info

    Em seguida, coloque-o em Aplicativos de inicialização:

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

    A menos que você reinicie, você precisa executar ~ / .export_x_info para criar o arquivo .Xdbus

  4. Crie a regra do udev que será executada em um evento de dock:

    Nome do script: /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. Crie o script associado à regra do udev:

    Nome do script: /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. Crie o script de desencaixe (altere seu_usuário para corresponder ao seu nome de usuário):

    Nome do script: /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. Crie o script dock (altere seu_usuário para corresponder ao seu nome de usuário):

    Nome do script: /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


Depurar

Para depurar os scripts de dock, você precisa habilitar o log de depuração do udev:

udevadm control --log-priority=debug

Em seguida, abra o syslog no Log File Viewer


Recursos

Leia-me da nVidia: Config Twinview , X Opções de configuração
Autorandr
Disper PPA Fórum do Ubuntu
nv-control-dpy
- Scripts de Un / Dock
Thinkwiki
udevadm

Cas
fonte
Cas, foi sugerido que eu comentário no seu post para perguntar sobre o problema que estou tendo com isso: askubuntu.com/questions/68737/auto-switching-with-dock
Toby Joiner
Você tem o script dell-dock.sh?
Cas
1
Sim, parece que esse arquivo não existe: $ cat /sys/devices/platform/dock.0/docked cat: /sys/devices/platform/dock.0/docked: No such file or directory
Toby Joiner
3

Você pode usar o autorandr .

Detecte automaticamente o hardware do monitor de conexão e carregue a configuração apropriada do X11 usando xrandr ou disper

Selecionar automaticamente uma configuração de exibição com base nos dispositivos conectados

Veja também:

landroni
fonte
Esta solução é indolor e funciona muito bem.
mercearia