Alat untuk menerapkan konfigurasi RandR secara otomatis ketika layar eksternal dicolokkan


54

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 polling 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?


Apakah Anda yakin tidak ada cara untuk mengatakan bahwa monitor telah dicolokkan dengan kartu Anda. Coba jalankan udevadm monitor --propertydari terminal dan sambungkan monitor. Dengan kartu saya, saya melihat suatu peristiwa ketika dicolokkan. Anda mungkin dapat menggunakan aturan + RUN di udev dan beberapa skrip bash untuk mendapatkan yang Anda inginkan. Namun, saya tidak yakin bagaimana Anda bisa menerapkan ini pada basis per pengguna menggunakan udev.
Steven D

@ Seven: Komentar Anda harus menjadi jawaban. Itu bukan jawaban yang lengkap, tetapi itu membuat kemajuan yang signifikan. Jika udev melihat acara perangkat keras, ia harus memberi tahu hal yang mengirim acara dbus yang dapat dilihat oleh kode pengguna.
Gilles 'SO- berhenti menjadi jahat'

Jawaban:


19

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

Ini solusi kotor, namun berhasil dengan baik.

Ini disesuaikan untuk pengaturan saya: Anda kemungkinan besar perlu mengubah nama output RandR ( LVDS1dan 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. Buka Terminal dengan menekan Ctrl+Alt+t
  2. Arahkan ke lokasi yang baik untuk membuat dan menyimpan skrip shell auto-switching. Contoh

    cd ./Desktop/

  3. Buat dan edit file .sh dengan editor teks yang Anda inginkan (di sini, saya menggunakan pluma. Anda dapat mencoba nano, vim, dll). Beri nama sesuai kenyamanan Anda. Contoh

    sudo pluma homemadeMonitor.sh

  4. Edit file dan salin rekatkan semua dari skrip yang disebutkan di atas (file dengan #! / Bin / bash)

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

    sudo chmod +x homemadeMonitor.sh

  6. Jalankan file .sh

    ./homemadeMonitor.sh


Naskah yang bagus! Terima kasih, saya butuh sesuatu seperti ini. Saya hanya menyalinnya dan mengaturnya agar berjalan secara otomatis. Terima kasih!
Linuxios

21

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. Punyaku berkata [drm] radeon kernel modesetting enableddan[drm] initializing kernel modesetting
  • jalankan udevadm monitor --propertydan lihat apakah acara dilaporkan ketika Anda (dis-) menghubungkan display

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 tidak akan berfungsi jika Anda menggunakan GPU nVIDIA dengan driver biner berpemilik, karena tidak menggunakan KMS. Anda tidak akan mendapatkan acara udev.


19

Mengenai alat yang dapat menyimpan profil konfigurasi monitor berdasarkan per pengguna dan per tampilan, autorandr akan melakukan hal itu. https://github.com/wertarbyte/autorandr .

Laptop saya memiliki kartu NVIDIA, jadi saya menggunakan backend disper alih-alih xrandr: http://willem.engen.nl/projects/disper/ . Autorandr akan menggunakan disper sebagai backend untuk mengelola monitor Anda jika Anda menyebutnya sebagai autodisper. Untuk sisa posting ini, saya akan merujuknya sebagai autorandrkonsistensi.

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

Misalnya:

$ autorandr
laptop
syncmaster19 (detected)

Anda dapat memerintahkannya untuk memuat profil yang sesuai secara otomatis dengan konfigurasi saat ini 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 laptopperintah 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.


1
autorandr adalah buang-buang waktu, dokumen buruk, monitor acak berkedip, tidak ada instruksi instal / uninstall. Bisa mengatasinya menggunakanudev
Leo Gallucci

5
Untuk jaga-jaga, ada garpu Python yang ditulis ulang dengan baik di autorandr: github.com/phillipberndt/autorandr
Olegs Jeremejevs

7

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 serta ekspor DISPLAY, Anda dapat menggunakan gema $DISPLAYuntuk melihat nomor yang sama dengan. Gunakan xrandr -quntuk melihat monitor eksternal yang Anda miliki. Pernyataan lain terakhir adalah hanya untuk memastikan bahwa Anda tidak pernah terjebak tanpa tampilan.


6

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

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


5

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. Berikut adalah contoh dari solusi satu pengguna 1 :

Monitor (output) acara UDEV denganudevadm
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

3

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

tidur $ START_DELAY

OLD_DUAL = "dummy"

sementara [1]; melakukan
    DUAL = $ (cat / sys / class / drm / card0-DP-2 / status)

    if ["$ OLD_DUAL"! = "$ DUAL"]; kemudian
        jika ["$ DUAL" == "terhubung"]; kemudian
            gema 'Pengaturan monitor ganda'
            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
Selesai

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


1

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

Saya kira orang-orang yang melihat pertanyaan ini bukan 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 (masuk .config/monitors.xml) dan secara otomatis menerapkannya ketika monitor dicolokkan ke dalam atau keluar.

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 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 jadi 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

Untuk mempermudah dalam Xfce misalnya, silakan instal "arandr" yang harus 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 untuk mencocokkan resolusi tepat dalam ekspresi reguler karena tampilan utama dilaporkan sebagai "primer terhubung" diikuti oleh nomor yaitu resolusi. 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

0

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, pada 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 polling untuk tampilan yang terhubung dan berjalan autorandr --changepada deteksi. 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 selesainya 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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.