it-swarm-tr.com

Harici ekran takıldığında RandR yapılandırmasını otomatik olarak uygulamak için bir araç

aşağıdakileri sağlayan bir araç var mı:

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

Konfigürasyonlar, kullanıcı başına, ekran başına uygulanmalıdır.

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 Bir çıkışın bağlandığını veya bağlantısını kestiğini anlamak için arada bir mi yoksa bunu yapmanın daha etkili bir yolu var mı? Udev tam da bunu yapacak şekilde ayarlanabilir mi?

58

VGA bağlandığında/kesildiğinde LVR1 ve VGA1 arasında geçiş yapan bu basit (ev yapımı) komut dosyasını kullanıyorum. ( [~ # ~] hdmi [~ # ~] çıktıları için, aşağıdaki komut dosyasında tüm VGA1 ila HDMI1)

Kirli bir çözüm, ama gayet iyi çalışıyor.

Kurulumum için özelleştirildi: Büyük olasılıkla RandR çıktı adlarını değiştirmeniz gerekecek (LVDS1 ve VGA1) ve benden farklı olarak büyük olasılıkla VGA için RandR varsayılan modunuzda iyi 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. Komut dosyasının üstüne koy (homemadeMonitor.sh) tercih ettiğiniz dizine

  2. Terminalde aşağıdaki komutu yazarak .sh dosyasını yürütülebilir yapın

    chmod +x homemadeMonitor.sh

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

    ./homemadeMonitor.sh

20
peoro

Sorunun bir kısmının "bir monitörün takılı olduğunu söylemenin" yolunu yanıtlamak:

Destek hala biraz değişiyor, ancak son çekirdeklerde bir ekran hotplug oluştuğunda udev olayları oluşturmak için bazı destek var. Çekirdek 2.6.38 ve ATI X1400 donanımıyla, bir VGA ekranını ilk kez bağladığımda bir olay alıyorum, ancak sonraki ekran bağlantılarını keser veya yeniden bağlar. Intel donanımının daha iyi desteği olabilir. NVIDIA tescilli sürücüsü şu anda KMS'yi desteklemiyor; NVIDIA donanımında hotplug olaylarını aramayı denemedim, ancak işe yarayacağından şüpheliyim.

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 rapor edilmelidir. Benimki [drm] radeon kernel modesetting enabled ve [drm] initializing kernel modesetting
  • çalıştırmak udevadm monitor --property ve ekranları (dis-) bağladığınızda olayların raporlanıp raporlanmadığına bakın

Ekran hotplug'da udev olayları alıyorsanız, aşağıdaki gibi bir udev kuralıyla bir komut dosyasını tetikleyebilirsiniz:

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

Not: Kullanılmadığı için özel ikili sürücü ile bir nVIDIA GPU kullanırsanız değil çalışır KMS. not herhangi bir udev etkinliği alacaksınız.

21
Andy

Monitör yapılandırma profillerini kullanıcı başına ve ekran başına esasına göre depolayabilen bir araçla ilgili olarak autorandr tam olarak bunu yapacaktır.

Dizüstü bilgisayarımda bir NVIDIA kartı var, bu yüzden xrandr yerine disper backend kullanıyorum. Autorandr, autodisper olarak adlandırırsanız monitörlerinizi yönetmek için arka uç olarak disper kullanır. Bu yazının geri kalanı için, tutarlılık için autorandr olarak anlatacağım.

Profilleri autorandr --save profile_name İle kaydedebilirsiniz. autorandr 'yi kendi başına çalıştırmak size bir profil listesi verir ve hangisinin geçerli yapılandırma olarak tespit edildiğini belirler.

Örneğin:

$ autorandr
laptop
syncmaster19 (detected)

autorandr --change İle geçerli yapılandırma için uygun profili otomatik olarak yüklemesini söyleyebilirsiniz. Çalıştırıldığında udev kuralıyla eşleştirilen bu komut, istediğinizi yapar.

Ek bir önlem olarak, bu yapılandırmaya --default laptop Ekledim; bu, geçerli yapılandırmayla eşleşen kaydedilmiş bir profil yoksa dizüstü bilgisayarın ekranını varsayılan hale getirir. Ekranları değiştirmek için kullandığım tam komut:

autorandr --change --default laptop

Monitörimi çalışırken taktığımda maalesef makinem udev çıkışı vermiyor. NVIDIA'ya özel sürücüleri kullanıyorum, bu şaşırtıcı değil. Şimdilik XF68Display anahtarına (Fn-F8) bağladım, ki bu neredeyse iyi.

19
Jack Senechal

Yukarıda önerilen bir Kabuk betiği ile birlikte yukarıda önerilen udev kuralını 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ı ve DISPLAY dışa aktarmanın yanı sıra, hangi numaraya eşit olduğunu görmek için echo $DISPLAY Kullanabilirsiniz. Sahip olduğunuz harici monitörleri görmek için xrandr -q Kullanın. Başka son ifade sadece ekran olmadan takılıp kalmamaktır.

7
Cappie

X sunucusunun değiştirilen monitör yapılandırması hakkında bildirimde bulunmasını ve ardından verilen bir komutu yürütmesini (örneğin başka bir yanıtta belirtilen autorandr) küçük bir program şu adreste bulunabilir: https: // bitbucket .org/Portix/srandrd/bakış

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

6
Joachim Breitner

Takıldığında ekranı otomatik olarak algılaması gerekiyorsa, en temiz çözüm xrandr komutlarınızı içeren bir komut dosyası çalıştırmak için bir UDEV kuralı eklemek gibi görünüyor. Bir kullanıcının çözümünden bir örnek 1 :

UDEV olaylarını udevadm ile izleyin (çıktı)
Bu adım her kullanıcı için çok önemli olacaktır. Çalıştırmak udevadm monitor --environment --udev. Ardından HDMI kablonuzu bağlayın.

UDEV kuralı
Yukarıdaki komuttan elde edilen verilere dayanarak, kullanıcı bu UDEV kuralını /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"

Böylece xrandr kullanıcı profili altında çalıştırılacak olan ortam değişkenlerine dikkat edin.

xrandr betiği hotplug_monitor.sh

Xrandr seçeneklerini ihtiyaçlarınıza göre 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
5
iyrin

Ne olursa olsun, hotplug yolunu almak istemeyenler için, inotifywait kullanarak bir komut dosyasında anket yapmak hala 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" 
 
 ise [ 1]; 
 DUAL = $ (cat /sys/class/drm/card0-DP-2/status)[.____. ["$ OLD_DUAL"! = "$ DUAL"] ise; sonra 
 ["$ DUAL" == "bağlı"] ise; sonra 
 echo 'Çift monitör kurulumu' 
 xrandr - çıkış $ SCREEN_LEFT --auto - normal döndür --pos 0x0 - çıkış $ SCREEN_RIGHT --auto - normal döndür - aşağıda SCREEN_LEFT 
 Başka 
 Echo 'Tek monitör kurulumu' 
 Xrandr --auto 
 Fi 
 
 OLD_DUAL = "$ DUAL" 
 fi 
 
 inotifywait -q -e close/sys/class/drm/card0-DP-2/status>/dev/null 
 bitti 
 

Xrandr ile anket yapmak, yeni dizüstü bilgisayarımda (fare periyodik olarak durur) ciddi kullanılabilirlik sorunları verdi.

3
Balzola

Örneğin Xfce'de basitleştirmek için lütfen dağıtım paketlerinizde bulunması gereken "arandr" 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 yukarıdaki iyrin tarafından belirtilen "hotplug_monitor.sh" betiğinde yazılan "function connect ()" içinde doğrudan kullanılabilir, örneğin:

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

Bağlantı kesme mekanizmasını kullanmak için komut dosyasının üst kısmına "#!/Bin/bash" ifadesinin hemen altına ekleyin:

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

xrandr ekranı algılar ve çıktıyı awk'a geçirir, bu da onu "bağlanmış" normal ifadeye göre filtreleyecektir, ardından özünde istediğimiz rakamdır. Benim görüşüme göre, normal gösterimde kesin çö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 "print $ 1" yalnızca bu durumda harici monitörün adı olan ilk sütunu yazdırır ve bu PLUGGED_EXTERNAL değişkeninde saklanır. Daha sonra $ PLUGGED_EXTERNAL komut dosyasında sabit görünen ad "HDMI1" yerine şu şekilde kullanılabilir:

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

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

Sanırım bu soruya bakan insanlar GNOME kullanmak isteyenler değil ve GNOME kullananlar bu soruya bakmak zorunda kalmayacaklar, ancak bütünlük için:

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

Ne yazık ki monitors.xml dosyasındaki yapılandırma iyi belgelenmemiştir. Bkz. Soru burada . Gnome ekran takımının ayrıca kaydırma, monitör başına ölçekleme ayarlama aracı yoktur ve uzaklaştırma yapmaz. Birçok kişi normal bir DPI ekranı ile birlikte bir HiDPI dizüstü bilgisayar ekranı kullandığından, araçlar uygulanabilir bir çözüm elde etmek için yeterli değildir.

Bunu gördüm Wayland için bir yol haritası öğesi olarak bahsedildi olsa da nihayet geldiğinde belirtilen sorunlar için bir düzeltme görebilirsiniz. O zamana kadar Gnome'da xrandr'ı manuel olarak kurmak için bir gecikmeden sonra bir başlangıç ​​komut dosyası çalıştırıyorum.

1
Joachim Breitner

Peoro'nun çözümünü kullanırken, xrandr'den bazı ekstra çıktılar aldım, bu yüzden grep için eşleşme sayısını sayan -c seçeneğini kullandım. HDMI için uyarladım ve ses anahtarını da 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
Aaros

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

Ekran düzenini xrandr'de otomatikleştirmek için autorandr'yi yükleyin, https://github.com/nalipaz/autorandr/releases adresinden en son .deb dosyasını alın ve çalıştırın:

dpkg -i [file]

Kayıtlı ekran düzenleriyle autorandr kurulumu

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

Örnek olarak, herhangi bir monitör takılı olmadan dizüstü bilgisayarımda, arandr'ı istediğim gibi ayarladım, sonra koştum:

autorandr --save mobile

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

autorandr --save docked

Her bir düzeninizi ayarladıktan sonra çalıştırabilirsiniz ('mobil' yerine daha önce tercih ettiğiniz adı kullanın, mobil kullandım):

autorandr --default mobile

Artık autorandr'ın tamamı kurulduğuna göre, bağlı ekranlar için anket oluşturacak ve algılama üzerine autorandr --change Çalıştıracak bir paket yükleyerek işlemi otomatikleştirebilirsiniz. Evet, udev'i biliyorum ve sizin için çalışıyorsa bunu ayarlayabilirsiniz, ancak testimde udev hdmi için tutarlı bir şekilde çalışmadı. Sadece her 20 fiş/prizden 1'i çalıştı ve bazen tamamen durdu.

En son .deb dosyasını buradan indirin: https://github.com/nalipaz/poll-xrandr/releases/ sonra yükleyin

dpkg -i [file]

Büyük olasılıkla autorandr --change Tamamlandıktan sonra daha fazla görev çalıştırmanız gerekir, autorandr bu komutların ~/.autorandr/postswitch adlı bir dosyaya eklenmesine izin verir. Aşağıdaki gibi yapın:

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

Şimdi postswitch dosyasını aşağıdakine benzer bir şeye sahip 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 aşağıdaki iki komut gibi bir şey olarak autorandr ve poll-xrandr eklemek isteyeceksiniz:

autorandr --change &
poll-xrandr &

Bir monitörü prizden çıkarın veya takın ve büyüyü izleyin!

0
nicholas.alipaz