Một công cụ để tự động áp dụng cấu hình RandR khi màn hình ngoài được cắm vào


53

Có một công cụ cho phép một người:

  • nhớ cấu hình RandR hiện tại (vị trí, định hướng, độ phân giải, v.v.) trên cơ sở mỗi màn hình,
  • tự động áp dụng cấu hình tốt được biết đến lần cuối ngay khi màn hình được cắm, không cần phải di chuyển xung quanh với các applet hoặc xrandr (1)?

Các cấu hình sẽ phải được áp dụng trên cơ sở mỗi người dùng, mỗi màn hình.

Nếu không có công cụ như vậy trong tự nhiên, tôi muốn tự mình ném một cái, nhưng theo như tôi thấy, không có cách nào để nói rằng một màn hình đã được cắm vào. Tôi có phải thăm dò ý kiến ​​với xrandr -q thỉnh thoảng mới nhận ra rằng một đầu ra đã được kết nối hoặc ngắt kết nối, hoặc có cách nào hiệu quả hơn để làm điều đó không? Udev có thể được điều chỉnh để làm điều đó?


Bạn có chắc chắn không có cách nào để nói rằng một màn hình đã được cắm vào thẻ của bạn. Hãy thử chạy udevadm monitor --propertytừ thiết bị đầu cuối và cắm màn hình vào. Với thẻ của tôi, tôi thấy một sự kiện khi nó được cắm. Bạn có thể sử dụng quy tắc + RUN trong udev và một số tập lệnh bash để có được những gì bạn muốn. Tuy nhiên, tôi không chắc làm thế nào bạn có thể thực hiện điều này trên cơ sở cho mỗi người dùng bằng cách sử dụng udev.
Steven D

@Steven: Nhận xét của bạn nên là một câu trả lời. Nó không phải là một câu trả lời hoàn chỉnh, nhưng nó có tiến bộ đáng kể. Nếu udev không nhìn thấy một sự kiện phần cứng, nó sẽ thông báo cho hal biết rằng nó sẽ gửi một sự kiện dbus mà mã người dùng có thể nhìn thấy.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


19

Tôi đang sử dụng tập lệnh đơn giản (tự chế) này để tiếp tục bỏ phiếu RandR và chuyển đổi giữa LVDS1 và VGA1 khi VGA được kết nối / ngắt kết nối. (Đối với đầu ra HDMI , trong tệp tập lệnh sau, hãy thay đổi tất cả VGA1thành HDMI1)

Đó là một giải pháp bẩn, nhưng nó vẫn hoạt động tốt.

Nó được tùy chỉnh cho thiết lập của tôi: rất có thể bạn sẽ cần thay đổi tên đầu ra RandR ( LVDS1VGA1) và không giống như tôi có thể sẽ ổn với chế độ mặc định RandR cho VGA của bạn.

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

Các bước đầy đủ:

  1. Mở Terminal bằng cách nhấn Ctrl+Alt+t
  2. Điều hướng đến một vị trí tốt để tạo và lưu trữ tập lệnh shell tự động chuyển đổi. Thí dụ

    cd ./Desktop/

  3. Tạo và chỉnh sửa tệp .sh bằng trình soạn thảo văn bản mong muốn của bạn (ở đây, tôi đã sử dụng pluma. Bạn có thể thử nano, vim, v.v.). Đặt tên cho nó để thuận tiện cho bạn. Thí dụ

    sudo pluma homemadeMonitor.sh

  4. Chỉnh sửa tệp và sao chép dán mọi thứ từ tập lệnh được đề cập ở trên (tập lệnh có #! / Bin / bash)

  5. Làm cho tệp .sh có thể thực thi được bằng cách gõ lệnh sau trong thiết bị đầu cuối

    sudo chmod +x homemadeMonitor.sh

  6. Chạy tệp .sh

    ./homemadeMonitor.sh


Kịch bản hay! Cảm ơn, tôi cần một cái gì đó như thế này. Tôi chỉ sao chép nó và thiết lập để chạy tự động. Cảm ơn!
Linuxios

21

Trả lời cách "[a] để nói rằng một màn hình đã được cắm" một phần của câu hỏi:

Sự hỗ trợ vẫn thay đổi khá nhiều, nhưng với các nhân gần đây, có một số hỗ trợ để tạo các sự kiện udev khi xảy ra hiện tượng cắm nóng màn hình. Với phần cứng kernel 2.6,38 và ATI X1400, tôi nhận được một sự kiện lần đầu tiên khi tôi kết nối màn hình VGA nhưng không có sự kiện nào về việc ngắt kết nối hoặc kết nối lại màn hình. Phần cứng Intel có thể có sự hỗ trợ tốt hơn. Trình điều khiển độc quyền của NVIDIA hiện không hỗ trợ KMS; Tôi đã không thử tìm kiếm các sự kiện cắm nóng trên phần cứng NVIDIA, nhưng tôi nghi ngờ nó sẽ hoạt động.

Nếu bạn muốn thử nghiệm với udev, bạn có thể thử các bước sau:

  • cập nhật lên kernel mới nhất
  • đảm bảo rằng cài đặt chế độ kernel (KMS) được bật. Nếu được bật, nó sẽ được báo cáo trong đầu ra kernel của bạn. Của tôi nói [drm] radeon kernel modesetting enabled[drm] initializing kernel modesetting
  • chạy udevadm monitor --propertyvà xem nếu các sự kiện được báo cáo khi bạn (dis-) kết nối màn hình

Nếu bạn đang nhận các sự kiện udev trên hotplug hiển thị, bạn có thể kích hoạt tập lệnh với quy tắc udev như:

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

Lưu ý: Điều này sẽ không hoạt động nếu bạn sử dụng GPU nVIDIA với trình điều khiển nhị phân độc quyền, vì nó không sử dụng KMS. Bạn sẽ không nhận được bất kỳ sự kiện udev.


19

Về một công cụ có thể lưu trữ hồ sơ cấu hình giám sát trên cơ sở mỗi người dùng và mỗi màn hình, autorandr sẽ thực hiện chính xác điều đó. https://github.com/wertarbyte/autorandr .

Máy tính xách tay của tôi có thẻ NVIDIA, vì vậy tôi sử dụng phụ trợ phân tán thay vì xrandr: http://willem.engen.nl/projects/disper/ . Autorandr sẽ sử dụng bộ phân phối làm phụ trợ để quản lý màn hình của bạn nếu bạn gọi nó là autodisper. Đối với phần còn lại của bài viết này, tôi sẽ đề cập đến nó như là autorandrsự nhất quán.

Bạn có thể lưu hồ sơ với autorandr --save profile_name. Chạy autorandrbởi chính nó sau đó sẽ cung cấp cho bạn một danh sách các cấu hình và xác định cấu hình nào được phát hiện là cấu hình hiện tại.

Ví dụ:

$ autorandr
laptop
syncmaster19 (detected)

Bạn có thể yêu cầu nó tự động tải cấu hình phù hợp cho cấu hình hiện tại autorandr --change. Lệnh này, được kết hợp với quy tắc udev để chạy nó khi được cắm nóng, sẽ làm những gì bạn yêu cầu.

Như một biện pháp phòng ngừa bổ sung, tôi đã thêm vào --default laptoplệnh đó, điều này sẽ làm cho nó mặc định với màn hình của máy tính xách tay nếu không có cấu hình đã lưu phù hợp với cấu hình hiện tại. Vì vậy, lệnh đầy đủ tôi sử dụng để chuyển đổi hiển thị là:

autorandr --change --default laptop

Thật không may, máy của tôi không cung cấp bất kỳ đầu ra udev nào khi tôi cắm nóng màn hình. Tôi đang sử dụng trình điều khiển độc quyền của NVIDIA, vì vậy điều đó không gây ngạc nhiên. Vì vậy, bây giờ tôi đã ràng buộc nó với khóa XF68Display (Fn-F8), điều này gần như là tốt.


1
autorandr là một sự lãng phí thời gian, tài liệu xấu, nhấp nháy màn hình ngẫu nhiên, không có hướng dẫn cài đặt / gỡ cài đặt. Có thể giải quyết bằng cách sử dụngudev
Leo Gallucci

5
Chỉ trong trường hợp, có một ngã ba Python được viết lại được bảo trì tốt đẹp của autorandr: github.com/phillipberndt/autorandr
Olegs Jeremejevs 17/11/17

7

Tôi đã sử dụng quy tắc udev được đề xuất ở trên cùng với một tập lệnh shell trông giống như

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

Phần Xauthority rất cần thiết cũng như xuất khẩu DISPLAY, bạn có thể sử dụng echo $DISPLAYđể xem nó bằng số nào. Sử dụng xrandr -qđể xem các màn hình bên ngoài bạn có. Tuyên bố khác cuối cùng chỉ là để đảm bảo rằng bạn không bao giờ bị kẹt mà không có màn hình.


6

Một chương trình nhỏ chờ máy chủ X thông báo cho nó về cấu hình màn hình đã thay đổi và sau đó thực thi một lệnh đã cho (ví dụ: autorandrđược đề cập trong câu trả lời khác) có sẵn tại: https://bitbucket.org/portix/srandrd/overview

Đây có vẻ là một giải pháp sạch hơn khi sử dụng udev(nơi bạn phải lo lắng về việc tìm đúng máy chủ X, v.v.)


5

Nếu bạn phải tự động phát hiện màn hình khi được cắm, có vẻ như giải pháp sạch nhất là thêm quy tắc UDEV để chạy tập lệnh chứa các lệnh xrandr của bạn. Đây là một ví dụ từ giải pháp 1 của người dùng :

Giám sát (đầu ra) các sự kiện UDEV vớiudevadm
Bước này sẽ quan trọng nhất đối với mỗi người dùng. Chạy đi udevadm monitor --environment --udev. Sau đó kết nối cáp HDMI của bạn.

Quy tắc UDEV
Dựa trên đầu ra từ lệnh trên, người dùng đã tạo quy tắc UDEV này tại /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"

Lưu ý các biến môi trường được sử dụng để xrandr sẽ được chạy trong hồ sơ người dùng.

tập lệnh xrandr hotplug_monitor.sh

Bạn có thể muốn điều chỉnh các tùy chọn xrandr cho phù hợp với nhu cầu của bạn.

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

Đối với những người, vì bất kỳ lý do gì, không muốn đi theo con đường cắm nóng, vẫn có thể không bỏ phiếu trong một tập lệnh bằng cách sử dụng inotifywait:

#! / bin / bash

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

gia hạn +19 $$> / dev / null

ngủ $ START_DELAY

OLD_DUAL = "giả"

trong khi [1]; làm
    DUAL = $ (cat / sys / class / drm / card0-DP-2 / status)

    if ["$ OLD_DUAL"! = "$ DUAL"]; sau đó
        if ["$ DUAL" == "đã kết nối"]; sau đó
            echo 'Thiết lập màn hình kép'
            xrandr --output $ SCREEN_LEFT --auto --rotate bình thường --pose 0x0 --output $ SCREEN_RIGHT --auto --rotate bình thường - tin $ SCREEN_LEFT
        khác
            echo 'Thiết lập màn hình đơn'
            xrandr --auto
        fi

        OLD_DUAL = "$ DUAL"
    fi

    inotifywait -q -e close / sys / class / drm / card0-DP-2 / status> / dev / null
làm xong

Thăm dò ý kiến ​​với xrandr đã đưa ra các vấn đề về khả năng sử dụng nghiêm trọng trên máy tính xách tay hoàn toàn mới của tôi (chuột sẽ bị đình trệ định kỳ).


1

Khi sử dụng giải pháp của peoro, tôi đã nhận được một số đầu ra bổ sung từ xrandr, vì vậy tôi đã sử dụng tùy chọn -c cho grep để đếm số lượng trận đấu. Tôi đã điều chỉnh nó cho HDMI và thêm cả chuyển đổi âm thanh:

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

Tôi đoán những người nhìn vào câu hỏi này không phải là những người muốn sử dụng Gnome và những người sử dụng Gnome sẽ không phải xem câu hỏi này, mà vì lợi ích của sự hoàn chỉnh:

Gnome có chức năng này tích hợp sẵn. Nếu bạn thay đổi thiết lập thông qua gnome-control-centre, gnome-settings-daemon sẽ ghi nhớ nó (trong .config/monitors.xml) và tự động áp dụng nó khi cắm hoặc tắt màn hình.

Đáng buồn là cấu hình trong tệp Monitor.xml không được ghi chép tốt. Xem câu hỏi tại đây . Công cụ hiển thị gnome cũng không có phương tiện để thiết lập panning, chia tỷ lệ trên mỗi màn hình và nó không thu nhỏ. Vì nhiều người đang sử dụng màn hình máy tính xách tay HiDPI cùng với màn hình DPI thông thường, các công cụ không đủ để có được một giải pháp khả thi.

Tôi đã thấy điều này được đề cập như một mục lộ trình cho Wayland mặc dù vậy khi cuối cùng chúng ta có thể thấy một bản sửa lỗi cho các vấn đề được đề cập. Cho đến khi trên Gnome tôi mới chạy tập lệnh khởi động sau khi trì hoãn để thiết lập xrandr theo cách thủ công.


1

Để đơn giản hóa trong Xfce chẳng hạn, vui lòng cài đặt "arandr" có sẵn trong các gói distro của bạn. Định cấu hình màn hình của bạn bằng cách sử dụng "arandr", sau đó lưu nó dưới dạng "displayLayout". Arandr nên thêm cho bạn phần mở rộng ".sh" để nó có thể được sử dụng trực tiếp trong "function connect ()" như được viết trong tập lệnh "hotplug_monitor.sh" được đề cập bởi iyrin ở trên, ví dụ:

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

Để sử dụng cơ chế ngắt kết nối, hãy thêm vào đầu tập lệnh ngay bên dưới "#! / Bin / bash" như vậy:

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

xrandr sẽ phát hiện màn hình hiển thị và chuyển đầu ra cho awk, nó sẽ lọc nó dựa trên biểu thức thông thường "được kết nối" theo sau là một chữ số mà về bản chất là những gì chúng ta muốn. Theo tôi, không cần thiết phải khớp độ phân giải chính xác trong biểu thức chính quy vì màn hình chính được báo cáo là "chính được kết nối" theo sau là số phân giải. Sau đó, awk "in $ 1" sẽ chỉ in cột đầu tiên là tên của màn hình ngoài trong trường hợp này và điều này sẽ được lưu trữ trong biến PLUGGED_EXTERNAL. Tiếp theo thay vì tên hiển thị cố định "HDMI1" trong tập lệnh $ PLUGGED_EXTERNAL có thể được sử dụng như vậy:

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

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

0

Chỉnh sửa câu trả lời của tôi để làm cho nó đơn giản hơn để thiết lập.

Cài đặt autorandr để tự động hóa bố cục màn hình trong xrandr, lấy .deb mới nhất từ https://github.com/nalipaz/autorandr/release và chạy:

dpkg -i [file]

Thiết lập autorandr với bố cục màn hình được lưu trữ

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

Ví dụ, trên máy tính xách tay của tôi không có bất kỳ màn hình nào được cắm vào, tôi thiết lập arandr theo cách tôi muốn, sau đó chạy:

autorandr --save mobile

Sau đó cắm hdmi của tôi và cấu hình lại arandr, sau đó chạy:

autorandr --save docked

Sau khi thiết lập từng bố cục của bạn, bạn có thể chạy (thay thế 'điện thoại di động' bằng tên ưa thích trước đó, tôi đã sử dụng điện thoại di động):

autorandr --default mobile

Bây giờ autorandr là tất cả các thiết lập, bạn có thể tự động hóa quy trình bằng cách cài đặt gói sẽ thăm dò các màn hình được kết nối và chạy autorandr --changekhi phát hiện. Vâng, tôi biết về udev và bạn có thể thiết lập nó nếu nó hoạt động cho bạn, nhưng trong thử nghiệm của tôi, udev không hoạt động cho hdmi của tôi một cách nhất quán. Nó chỉ hoạt động 1 trong số 20 phích cắm / phích cắm hoặc hơn thế, và đôi khi nó chỉ dừng lại hoàn toàn.

Tải xuống .deb mới nhất từ ​​đây: https://github.com/nalipaz/poll-xrandr/release/ sau đó cài đặt với

dpkg -i [file]

Rất có thể bạn cần chạy nhiều tác vụ hơn sau khi hoàn thành autorandr --change, autorandr cho phép các lệnh này được chèn vào một tệp có tên ~ / .autorandr / postswitch. Làm như sau:

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

Bây giờ chỉnh sửa tệp postswitch để có cái gì đó tương tự như sau:

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

Ngoài ra, bạn có thể muốn thêm autorandr và poll-xrandr vào phần khởi động của mình, giống như hai lệnh sau:

autorandr --change &
poll-xrandr &

Rút phích cắm hoặc cắm vào màn hình và xem phép thuật!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.