Harici ekran takılı olduğunda RandR yapılandırmasını otomatik olarak uygulamak için bir araç


53

biri sağlayan bir araç var mı:

  • Monitör başına bazında mevcut RandR yapılandırmasını (konum, yönlendirme, çözünürlük vb.) hatırlayın,
  • Ekran takılı olduğu anda en son iyi yapılandırmayı otomatik olarak uygularsanız, uygulama veya xrandr (1) ile uğraşmanıza gerek kalmaz mı?

Konfigürasyonların, kullanıcı başına ekran başına esasına göre uygulanması gerekir.

Vahşi doğada böyle bir araç yoksa, kendimi bir araya getirmek istiyorum, ancak görebildiğim kadarıyla bir monitörün takılı olduğunu söylemenin bir yolu yok. Xrandr -q ile anket yapmak zorunda mıyım Arada bir çıktının bağlandığını ya da bağlantısının kesildiğini anlamak için arada bir mi, yoksa bunu yapmanın daha etkili bir yolu var mı? Udev bunu yapmak için ayarlanabilir mi?


Bir monitörün kartınıza takılı olduğunu söylemenin bir yolu olmadığından emin misiniz? udevadm monitor --propertyTerminalden koşmayı ve monitörü takmayı deneyin . Kartımla, fişe takılı bir olay görüyorum. İstediğiniz şeyi almak için udev'de + RUN kuralı ve bash komut dosyası kullanabilirsiniz. Ancak, bunu udev kullanarak kullanıcı bazında nasıl uygulayacağınızdan emin değilim.
Steven D,

@Steven: Yorumunuz bir cevap olmalıdır. Bu tam bir cevap değil, ancak kayda değer ilerleme sağlıyor. Eğer udev bir donanım olayı görürse, kullanıcı kodu tarafından görülebilen bir dbus olayı gönderen hal bildirilmelidir.
Gilles 'SO- kötülük' dur '

Yanıtlar:


19

VGA bağlandığında / bağlantısı kesildiğinde RandR'ı sorgulayan ve LVDS1 ile VGA1 arasında geçiş yapan bu basit (ev yapımı) betiği kullanıyorum. ( HDMI çıkışları için, aşağıdaki komut dosyasında, hepsini değiştirin VGA1. HDMI1)

Kirli bir çözüm ama yine de iyi çalışıyor.

Kurulumum için özelleştirildi: RandR çıkış adlarını ( LVDS1ve VGA1) değiştirmeniz gerekecek ve benden farklı olarak muhtemelen VGA için RandR varsayılan modunuzla iyi durumda olacaksınız.

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done

Tam adımlar:

  1. Tuşuna basarak Terminali açın. Ctrl+Alt+t
  2. Otomatik değiştirme kabuk komut dosyasını oluşturmak ve saklamak için iyi bir konuma gidin. Örnek

    cd ./Desktop/

  3. İstediğiniz metin editörüyle .sh dosyasını oluşturun ve düzenleyin (burada pluma kullandım. Nano, vim, vb. Deneyebilirsiniz). Rahatınız için adlandırın. Örnek

    sudo pluma homemadeMonitor.sh

  4. Dosyayı düzenleyin ve yukarıda belirtilen koddan her şeyi yapıştırın (#! / Bin / bash olanı)

  5. Terminalde aşağıdaki komutu yazarak .sh dosyasını çalıştırılabilir hale getirin.

    sudo chmod +x homemadeMonitor.sh

  6. .Sh dosyasını çalıştırın

    ./homemadeMonitor.sh


İyi senaryo! Teşekkürler, böyle bir şeye ihtiyacım vardı. Sadece kopyaladım ve otomatik olarak çalışacak şekilde ayarladım. Teşekkürler!
Linuxios

21

Sorunun "bir monitörün takılı olduğunu söylemenin bir yolu" yanıtına:

Destek hala biraz değişmekle birlikte, son çekirdeklerde, bir ekran hotplug meydana geldiğinde udev olayları oluşturmak için bir miktar destek var. Çekirdek 2.6.38 ve ATI X1400 donanımıyla, VGA ekranını ilk kez bağladığımda bir olay elde ediyorum, ancak ekranın bağlantısını kesen veya tekrar bağlayan olaylarda olay yok. Intel donanımı daha iyi destek olabilir. NVIDIA tescilli sürücüsü şu anda KMS'yi desteklememektedir; NVIDIA donanımında hotplug etkinlikleri aramayı denemedim, ancak işe yarayacağından şüpheliyim.

Eğer udev ile denemek istiyorsanız, aşağıdaki adımları deneyebilirsiniz:

  • en yeni çekirdeğe güncelleme
  • çekirdek modu ayarının (KMS) etkin olduğundan emin olun. Etkinleştirilirse, çekirdek çıktınızda raporlanmalıdır. Benimki diyor [drm] radeon kernel modesetting enabledve[drm] initializing kernel modesetting
  • çalıştırın udevadm monitor --propertyve ekranları bağladığınızda (-) bir olay bildirilip bildirilmediğini görün

Ekran hotplug'unda udev olayları alıyorsanız, aşağıdaki gibi bir udev kuralına sahip bir betiği tetikleyebilirsiniz:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"

Not: Bu olacak değil size özel bir ikili sürücüsü ile bir nVIDIA GPU kullanırsak KMS kullanarak olmadığından, çalışırlar. Sen olacak değil herhangi Udev olayları olsun.


19

Monitör konfigürasyon profillerini kullanıcı başına ve ekran başına bazda saklayabilen bir araçla ilgili olarak, autorandr tam olarak bunu yapacak. https://github.com/wertarbyte/autorandr .

Dizüstü bilgisayarımda bir NVIDIA kartı var, bu yüzden xrandr yerine disper arka ucunu kullanıyorum: http://willem.engen.nl/projects/disper/ . Autorandr, eğer kullanıyorsanız monitörleri yönetmek için arka uç olarak disper kullanacaktır autodisper. Yine de bu yazının geri kalanı autorandriçin tutarlılık olarak atıfta bulunacağım.

İle profilleri kaydedebilirsiniz autorandr --save profile_name. Tek autorandrbaşına çalıştırmak size bir profil listesi verir ve hangisinin mevcut yapılandırma olarak algılandığını belirler.

Örneğin:

$ autorandr
laptop
syncmaster19 (detected)

Geçerli yapılandırma için uygun profili otomatik olarak yüklemesini söyleyebilirsiniz autorandr --change. Hotplugged olduğunda çalıştırmak için bir udev kuralı ile eşleştirilen bu komut istediğinizi yapar.

Ek bir önlem olarak --default laptop, bu komuta ekledim , mevcut konfigürasyonla eşleşen kaydedilmiş bir profil yoksa, bunu dizüstü bilgisayarın ekranına varsayılan yapacaktır. Yani ekranları değiştirmek için kullandığım tam komut:

autorandr --change --default laptop

Maalesef makinemi monitörümü çalıştırdığımda udev çıkışı vermiyor. NVIDIA tescilli sürücülerini kullanıyorum, bu yüzden şaşırtıcı değil. Bu yüzden onu XF68Display anahtarına (Fn-F8) bağladım, bu da neredeyse kadar iyi.


1
autorandr zaman kaybı, belgelenmiş, rastgele monitör yanıp sönüyor, kurulum / kaldırma talimatı yok. Kullanarak çözebilirudev
Leo Gallucci

5
Durumda, yeniden yazılmış bir Python çatalı var autorandr: github.com/phillipberndt/autorandr
Olegs Jeremejevs

7

Yukarıda önerilen udev kuralını, benzeyen bir kabuk betiği ile birlikte kullandım

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi

Xauthority kısmı ihracat kadar önemlidir DISPLAY, $DISPLAYhangi sayıya eşit olduğunu görmek için yankıyı kullanabilirsiniz . Sahip xrandr -qolduğunuz harici monitörleri görmek için kullanın . En son ifade ise, hiçbir zaman ekran olmadan takılmadığınızdan emin olmak içindir.


6

X sunucusunun değiştirilen monitör yapılandırması hakkında bilgilendirmesini bekleyen ve daha sonra verilen bir komutu (örneğin autorandrbaşka bir cevapta belirtilen) yürüten küçük bir program şu adreste mevcuttur: https://bitbucket.org/portix/srandrd/overview

Bu, udev(doğru X sunucuyu bulma konusunda endişelenmeniz gereken) vb. Kullanarak daha temiz bir çözüm gibi görünüyor .


5

Takılı olduğunda ekranı otomatik olarak algılamanız gerekiyorsa, en temiz çözüm, xrandr komutlarınızı içeren bir komut dosyasını çalıştırmak için bir UDEV kuralı eklemektir. İşte bir kullanıcının 1 numaralı çözümünden bir örnek :

UDEV olaylarını izleyin (çıktı alın)udevadm
Bu adım her kullanıcı için en önemli olacaktır. Run udevadm monitor --environment --udev. Ardından, HDMI kablonuzu bağlayın.

UDEV kuralı
Yukarıdaki komutun çıktısına dayanarak, kullanıcı bu UDEV kuralını adresinde yarattı /etc/udev/rules.d/95-monitor-hotplug.rules.

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"

Kullanılan ortam değişkenlerini unutmayın, böylece xrandr kullanıcı profili altında çalıştırılır.

xrandr betiği hotplug_monitor.sh

İhtiyaçlarınıza göre xrandr seçeneklerini ayarlamak isteyebilirsiniz.

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect

3

Her ne sebeple olursa olsun, hotplug rotasını kullanmak istemeyenlere, inotifywait kullanarak bir betiğin içinde yoklama yapmak mümkündür:

#! / Bin / bash

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

renice +19 $$> / dev / null

uyku $ START_DELAY

OLD_DUAL = "kukla"

[1] iken; yap
    DUAL = $ (kedi / sys / sınıf / drm / kart0-DP-2 / durum)

    eğer ["$ OLD_DUAL"! = "$ DUAL"]; sonra
        eğer ["$ DUAL" == "bağlı"]; sonra
            echo 'İkili monitör kurulumu'
            xrandr - çıkış $ SCREEN_LEFT - otomatik - normal döndür - 0x0 - çıkış $ SCREEN_RIGHT - otomatik - döndür normal - sıfır $ SCREEN_LEFT
        Başka
            echo 'Tek monitör kurulumu'
            xrandr --auto
        fi

        OLD_DUAL = "$ ÇİFT"
    fi

    inotifywait -q -e kapat / sys / sınıf / drm / kart0-DP-2 / durum> / dev / null
tamam

Xrandr ile oylama, yeni dizüstü bilgisayarımda ciddi kullanılabilirlik sorunları ortaya çıkardı (fare belirli aralıklarla dururdu).


1

Peoro'nun çözümünü kullanırken, xrandr'dan fazladan çıktı aldım, bu yüzden eşleşme sayısını sayan grep için -c seçeneğini kullandım. HDMI için uyarladım ve ayrıca ses düğmesi de ekledim:

#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
    xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    pactl set-card-profile 0 output:hdmi-stereo-extra1
    MONITOR=HDMI1
}
function DeactivateHDMI {
    xrandr --output HDMI1 --off --output LVDS1 --auto
    pactl set-card-profile 0 output:analog-stereo
    MONITOR=LVDS1
}

# functions to check if HDMI is connected and in use
function HDMIActive {
    [ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
    [[ `xrandr | grep "^HDMI1" | grep -c disconnected` -eq 0 ]]
}

# actual script
while true
do
    if ! HDMIActive && HDMIConnected
    then
        ActivateHDMI
    fi

    if HDMIActive && ! HDMIConnected
    then
        DeactivateHDMI
    fi

    sleep 1s
done

1

Sanırım bu soruya bakan insanlar GNOME'u kullanmak isteyenler değil ve GNOME'u kullananlar bu soruya bakmak zorunda kalmayacaklardı.

GNOME bu işlevselliğe yerleşiktir. Kurulumu gnome-control-center ile değiştirirseniz, gnome-settings-daemon bunu hatırlar (in .config/monitors.xml) ve bir monitör takılıyken veya çıkarıldığında otomatik olarak uygular.

Ne yazık ki monitors.xml dosyasındaki yapılandırma iyi belgelenmemiş. Burada soruya bakın . Gnome ekran takımının ayrıca kaydırma yapma, monitör başına ölçeklendirme gibi araçları yoktur ve uzaklaştırma yapmaz. Birçok kişi normal DPI ekranıyla birlikte bir HiDPI dizüstü bilgisayar ekranı kullandığından, araçlar uygulanabilir bir çözüm elde etmek için yeterli değil.

Bunu, Wayland için bir yol haritası öğesi olarak görmüştüm , ancak sonunda geldiğinde, belirtilen sorunlar için bir düzeltme görebiliriz. O zamana dek Gnome'da sadece xrandr'ı manuel olarak kurmak için bir gecikmeden sonra bir başlangıç ​​betiği çalıştırıyorum.


1

Örneğin, Xfce'de sadeleştirmek için lütfen dağıtım paketlerinizde bulunması gereken "arandr" uygulamasını yükleyin. Ekranınızı "arandr" kullanarak yapılandırın ve ardından "displayLayout" olarak kaydedin. Arandr sizin için ".sh" uzantısını eklemelidir, böylece doğrudan yukarıdaki iyrin tarafından belirtilen "hotplug_monitor.sh" betiğinde yazıldığı gibi "function connect ()" içinde kullanılabilir:

function connect(){
 /path/to/displayLayout.sh
}

Bağlantı kesme mekanizmasını kullanmak için komut dosyasının en üstüne "#! / Bin / bash" komutunu hemen ekleyin:

#!/bin/bash
#
PLUGGED_EXTERNAL=`xrandr | awk /"connected [0-9]"/'{print $1}'`

xrandr, ekranı algılar ve çıktıyı awk'a iletir, bu da "bağlanmış" ifadesi ve ardından istediğimiz şey olan bir basamağa göre filtrelenir. Kanımca, normal ifadede tam çözünürlüğü eşleştirmek gerekli değildir, çünkü birincil ekran "bağlı birincil" ve ardından sayı yani özünürlük olarak rapor edilir. Daha sonra awk "$ $ yazdır", bu durumda harici monitörün adı olan yalnızca ilk sütunu yazdırır ve bu PLUGGED_EXTERNAL değişkeninde saklanır. Daha sonra $ PLUGGED_EXTERNAL betiğinde "HDMI1" sabit ekran adı yerine şu şekilde kullanılabilir:

function disconnect(){
  xrandr --output $PLUGGED_EXTERNAL --off
}

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect

0

Kurulumu kolaylaştırmak için cevabımı düzenleme.

Xrandr'da ekran düzenini otomatikleştirmek için autorandr'ı kurun, https://github.com/nalipaz/autorandr/releases adresinden en son .deb komutunu alın ve çalıştırın:

dpkg -i [file]

Kayıtlı ekran düzenleri ile autorandr kurulumu

autorandr --save [docked|mobile|home|etc]

Bir örnek olarak, herhangi bir monitör takılı olmadan dizüstü bilgisayarımda, istediğim gibi arandr yapıyorum, sonra koştum:

autorandr --save mobile

Sonra benim hdmi takılı ve arandr yeniden yapılandırılmış, sonra koştu:

autorandr --save docked

Düzenlerinizin her birini ayarladıktan sonra çalıştırabilirsiniz ('mobil'i önceki tercih edilen adla değiştirin, mobil kullandım):

autorandr --default mobile

Artık autorandr tamamen ayarlanmış durumda, bağlı ekranlar için yoklama ve autorandr --changetespit etmeye çalışacak bir paket kurarak işlemi otomatikleştirebilirsiniz . Evet, udev'i biliyorum ve sizin için işe yarayacaksa bunu ayarlayabilirsiniz, ancak testlerimde udev hdmi için sürekli işe yaramadı. Sadece her 20 fiş / prizden 1'inde çalıştı ve bazen tamamen durdu.

Burada en son .deb indirin: https://github.com/nalipaz/poll-xrandr/releases/ daha sonra yüklemek

dpkg -i [file]

autorandr --changeAutorandr'ın tamamlanmasından sonra daha fazla iş yapmanız büyük olasılıkla bu komutların ~ / .autorandr / postswitch adlı bir dosyaya eklenmesini sağlar. Aşağıdaki gibi yapın:

cd ~/.autorandr/ && touch postswitch && chmod +x postswitch

Şimdi postswitch dosyasını aşağıdakine benzer bir şey olacak şekilde düzenleyin:

#!/bin/bash
if pidof conky > /dev/null 2>&1; then
  killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &

Ek olarak, muhtemelen şu iki komut gibi, başlangıçlarınıza autorandr ve poll-xrandr eklemek isteyeceksiniz:

autorandr --change &
poll-xrandr &

Bir monitörün fişini çekin ya da prize takın ve büyüyü izleyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.