it-swarm-id.com

Alat untuk menerapkan konfigurasi RandR secara otomatis ketika layar eksternal dicolokkan

apakah ada alat yang memungkinkan seseorang untuk:

  • ingat konfigurasi RandR saat ini (posisi, orientasi, resolusi dll) berdasarkan monitor,
  • secara otomatis menerapkan konfigurasi yang baik yang diketahui terakhir segera setelah layar dicolokkan, tanpa perlu main-main dengan applet atau xrandr (1)?

Konfigurasi harus diterapkan pada per-pengguna, per-tampilan.

Jika tidak ada alat seperti itu di alam liar, saya ingin menyatukannya sendiri, tetapi sejauh yang saya bisa lihat, tidak ada cara untuk mengatakan bahwa monitor telah dipasang. Apakah saya harus melakukan jajak pendapat dengan xrandr -q sesekali untuk mengetahui bahwa output terhubung atau terputus, atau apakah ada cara yang lebih efisien untuk melakukannya? Bisakah udev disetel untuk melakukan hal itu?

58

Saya menggunakan skrip sederhana (buatan sendiri) yang membuat polling RandR dan beralih antara LVDS1 dan VGA1 ketika VGA terhubung/terputus. (Untuk [~ # ~] HDMI [~ # ~] keluaran, dalam file skrip berikut, ubah semua VGA1 hingga HDMI1)

Ini solusi kotor, namun bekerja dengan baik.

Ini disesuaikan untuk pengaturan saya: Anda kemungkinan besar perlu mengubah nama output RandR (LVDS1 dan VGA1) dan tidak seperti saya Anda mungkin akan baik-baik saja dengan mode default RandR Anda untuk VGA.

#!/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

Langkah Lengkap:

  1. Letakkan skrip di atas (homemadeMonitor.sh) ke dalam direktori pilihan Anda

  2. Buat file .sh dapat dieksekusi dengan mengetikkan perintah berikut di terminal

    chmod +x homemadeMonitor.sh

  3. Jalankan file .sh

    ./homemadeMonitor.sh

20
peoro

Menanggapi cara "[a] untuk memberi tahu bahwa monitor telah dipasang" bagian dari pertanyaan:

Dukungan masih bervariasi sedikit, tetapi dengan kernel baru-baru ini ada beberapa dukungan untuk menghasilkan peristiwa udev ketika hotplug tampilan muncul. Dengan kernel 2.6.38 dan perangkat keras ATI X1400, saya mendapatkan sebuah acara saat pertama kali saya menghubungkan layar VGA tetapi tidak ada kejadian pada pemutusan berikutnya atau menghubungkan kembali layar. perangkat keras Intel mungkin memiliki dukungan yang lebih baik. Driver berpemilik NVIDIA saat ini tidak mendukung KMS; Saya belum mencoba mencari acara hotplug pada perangkat keras NVIDIA, tapi saya ragu itu akan berhasil.

Jika Anda ingin bereksperimen dengan udev Anda bisa mencoba langkah-langkah berikut:

  • perbarui ke kernel terbaru
  • pastikan bahwa pengaturan mode kernel (KMS) diaktifkan. Jika diaktifkan, itu harus dilaporkan dalam output kernel Anda. Milik saya mengatakan [drm] radeon kernel modesetting enabled dan [drm] initializing kernel modesetting
  • lari udevadm monitor --property dan lihat apakah acara dilaporkan ketika Anda (dis-) menghubungkan tampilan

Jika Anda mendapatkan acara udev pada hotplug tampilan, Anda dapat memicu skrip dengan aturan udev seperti:

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

Catatan: Ini akan tidak berfungsi jika Anda menggunakan GPU nVIDIA dengan driver biner berpemilik, karena tidak menggunakan KMS. Anda akan tidak mendapatkan acara udev.

21
Andy

Mengenai alat yang dapat menyimpan profil konfigurasi monitor berdasarkan per-pengguna dan per-tampilan, autorandr akan melakukan hal itu.

Laptop saya memiliki kartu NVIDIA, jadi saya menggunakan backend disper bukan xrandr. Autorandr akan menggunakan disper sebagai backend untuk mengelola monitor Anda jika Anda menyebutnya autodisper. Untuk sisa posting ini, saya akan menyebutnya sebagai autorandr untuk konsistensi.

Anda dapat menyimpan profil dengan autorandr --save profile_name. Menjalankan autorandr dengan sendirinya akan memberi Anda daftar profil, dan mengidentifikasi mana yang terdeteksi sebagai konfigurasi saat ini.

Contohnya:

$ autorandr
laptop
syncmaster19 (detected)

Anda dapat memerintahkannya untuk memuat profil yang sesuai secara otomatis untuk konfigurasi saat ini dengan autorandr --change. Perintah ini, dipasangkan dengan aturan udev untuk menjalankannya ketika dicolokkan, akan melakukan apa yang Anda minta.

Sebagai tindakan pencegahan tambahan saya telah menambahkan --default laptop ke perintah itu, yang akan menjadikannya default untuk tampilan laptop jika tidak ada profil tersimpan yang cocok dengan konfigurasi saat ini. Jadi perintah lengkap yang saya gunakan untuk mengganti display adalah:

autorandr --change --default laptop

Sayangnya mesin saya tidak memberikan output udev ketika saya menghubungkan monitor saya. Saya menggunakan driver berpemilik NVIDIA, jadi itu tidak mengejutkan. Jadi saya telah mengikatnya ke tombol XF68Display (Fn-F8) untuk saat ini, yang hampir sama baiknya.

19
Jack Senechal

Saya menggunakan aturan udev yang disarankan di atas bersama dengan skrip Shell yang terlihat seperti

#!/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

Bagian Xauthority sangat penting dan juga ekspor DISPLAY, Anda dapat menggunakan echo $DISPLAY untuk melihat nomor mana itu sama dengan. Gunakan xrandr -q untuk melihat monitor eksternal yang Anda miliki. Pernyataan lain terakhir adalah hanya untuk memastikan bahwa Anda tidak pernah terjebak tanpa tampilan.

7
Cappie

Sebuah program kecil yang menunggu server X untuk memberi tahu tentang perubahan konfigurasi monitor, dan kemudian menjalankan perintah yang diberikan (misalnya autorandr yang disebutkan dalam jawaban lain) tersedia di: https: // bitbucket .org/portix/srandrd/ikhtisar

Ini tampaknya menjadi solusi bersih yang menggunakan udev (di mana Anda harus khawatir menemukan server X yang tepat, dll.)

6
Joachim Breitner

Jika Anda harus memilikinya secara otomatis mendeteksi tampilan ketika dicolokkan, sepertinya solusi terbersih adalah menambahkan aturan UDEV untuk menjalankan skrip yang berisi perintah xrandr Anda. Ini adalah contoh dari solusi satu pengguna 1 :

Monitor (output) acara UDEV dengan udevadm
Langkah ini akan menjadi yang paling penting untuk setiap pengguna. Lari udevadm monitor --environment --udev. Kemudian sambungkan kabel HDMI Anda.

Aturan UDEV
Berdasarkan output dari perintah di atas, pengguna membuat aturan UDEV ini di /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"

Perhatikan variabel lingkungan yang digunakan sehingga xrandr akan dijalankan di bawah profil pengguna.

skrip xrandr hotplug_monitor.sh

Anda mungkin ingin menyesuaikan opsi xrandr sesuai dengan kebutuhan Anda.

#! /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

Bagi mereka yang, untuk alasan apa pun, tidak ingin mengambil rute hotplug, masih mungkin untuk tidak melakukan polling dalam skrip menggunakan inotifywait:

 #!/bin/bash 
 
 SCREEN_LEFT = DP2 
 SCREEN_RIGHT = eDP1 
 START_DELAY = 5 
 
 renice +19 $$>/dev/null 
 
 sleep $ START_DELAY 
 
 OLD_DUAL = "dummy" 
 
 sementara [ 1]; do 
 DUAL = $ (cat /sys/class/drm/card0-DP-2/status)[.____.
 jika ["$ OLD_DUAL"! = "$ DUAL"]; lalu 
 jika ["$ DUAL" == "terhubung"]; lalu 
 gema 'Dual monitor setup' 
 xrandr --output $ SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $ SCREEN_RIGHT --auto --rotate normal - di bawah $ SCREEN_LEFT 
 Lain 
 Gema 'Pengaturan monitor tunggal' 
 Xrandr --auto 
 Fi 
 
 OLD_DUAL = "$ DUAL" 
 fi 
 
 inotifywait -q -e close/sys/class/drm/card0-DP-2/status>/dev/null 
 dilakukan 
 

Polling dengan xrandr memberikan masalah kegunaan serius pada laptop baru saya (mouse akan berhenti secara berkala).

3
Balzola

Untuk mempermudah dalam Xfce misalnya, silakan instal "arandr" yang seharusnya tersedia dalam paket distro Anda. Konfigurasikan tampilan Anda menggunakan "arandr" lalu simpan sebagai "displayLayout" misalnya. Arandr harus menambahkan untuk Anda ekstensi ".sh" sehingga dapat langsung digunakan dalam "function connect ()" seperti yang tertulis dalam skrip "hotplug_monitor.sh" yang disebutkan oleh iyrin di atas, misalnya:

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

Untuk menggunakan mekanisme putuskan, tambahkan di bagian atas skrip tepat di bawah "#!/Bin/bash" seperti:

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

xrandr akan mendeteksi tampilan dan meneruskan keluaran ke awk yang akan memfilternya berdasarkan ekspresi reguler "terhubung" diikuti oleh digit yang intinya adalah apa yang kita inginkan. Menurut pendapat saya, tidak perlu mencocokkan resolusi tepat dalam ekspresi reguler karena tampilan utama dilaporkan sebagai "primer terhubung" diikuti oleh resolusi nomor. Kemudian awk "print $ 1" hanya akan mencetak kolom pertama yang merupakan nama monitor eksternal dalam kasus ini dan ini akan disimpan dalam variabel PLUGGED_EXTERNAL. Selanjutnya alih-alih nama tampilan tetap "HDMI1" dalam skrip $ PLUGGED_EXTERNAL dapat digunakan seperti ini:

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

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

Saya kira orang-orang yang melihat pertanyaan ini bukanlah mereka yang ingin menggunakan GNOME, dan mereka yang menggunakan GNOME tidak harus melihat pertanyaan ini, tetapi demi kepentingan kelengkapan:

GNOME memiliki fungsi ini bawaan. Jika Anda mengubah pengaturan melalui gnome-control-center, gnome-settings-daemon akan mengingatnya (di .config/monitors.xml) dan secara otomatis menerapkannya saat monitor dicolokkan atau dilepas.

Sayangnya konfigurasi dalam file monitor.xml tidak terdokumentasi dengan baik. Lihat pertanyaan di sini . Tool display gnome juga tidak memiliki cara mengatur panning, scaling per monitor dan itu tidak melakukan zoom-out. Karena banyak orang menggunakan layar laptop HiDPI bersama-sama dengan layar DPI biasa, alat tidak cukup untuk mendapatkan solusi yang bisa diterapkan.

Saya telah melihat ini disebutkan sebagai item peta jalan untuk Wayland meskipun begitu ketika akhirnya tiba kita mungkin melihat perbaikan untuk masalah yang disebutkan. Sampai saat itu di Gnome saya baru saja menjalankan skrip startup setelah penundaan untuk men-setup xrandr secara manual.

1
Joachim Breitner

Saat menggunakan solusi peoro, saya mendapat beberapa output tambahan dari xrandr, jadi saya menggunakan opsi -c untuk grep yang menghitung jumlah kecocokan. Saya mengadaptasinya untuk HDMI dan menambahkan saklar audio juga:

#!/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

Mengedit jawaban saya untuk mempermudah pengaturan.

Instal autorandr untuk mengotomatiskan tata letak layar di xrandr, ambil .deb terbaru dari https://github.com/nalipaz/autorandr/releases dan jalankan:

dpkg -i [file]

Atur autorandr dengan tata letak layar yang tersimpan

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

Sebagai contoh, di laptop saya tanpa monitor terpasang, saya mengatur arandr seperti yang saya inginkan, lalu menjalankan:

autorandr --save mobile

Kemudian dicolokkan ke HDMI saya dan konfigurasi ulang arandr, lalu jalankan:

autorandr --save docked

Setelah mengatur setiap tata letak Anda, Anda dapat menjalankan (ganti 'ponsel' dengan nama yang disukai sebelumnya, saya menggunakan ponsel):

autorandr --default mobile

Sekarang autorandr sudah siap, Anda dapat mengotomatiskan proses dengan menginstal paket yang akan melakukan polling untuk tampilan yang terhubung dan menjalankan autorandr --change saat dideteksi. Ya, saya tahu tentang udev dan Anda dapat mengaturnya jika itu berfungsi untuk Anda, tetapi dalam pengujian saya udev tidak bekerja untuk HDMI saya secara konsisten. Ini hanya bekerja 1 dari setiap 20 colokan/cabut atau lebih, dan kadang-kadang berhenti sama sekali.

Unduh .deb terbaru dari sini: https://github.com/nalipaz/poll-xrandr/releases/ lalu instal dengan

dpkg -i [file]

Kemungkinan besar Anda perlu menjalankan lebih banyak tugas setelah menyelesaikan autorandr --change, autorandr memungkinkan perintah-perintah ini dimasukkan ke dalam file bernama ~/.autorandr/postswitch. Lakukan sebagai berikut:

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

Sekarang edit file postswitch untuk memiliki sesuatu yang mirip dengan yang berikut:

#!/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) &

Selain itu, Anda mungkin ingin menambahkan autorandr dan poll-xrandr ke startup Anda, sesuatu seperti dua perintah berikut:

autorandr --change &
poll-xrandr &

Cabut atau tancapkan monitor dan tonton keajaibannya!

0
nicholas.alipaz