it-swarm-vi.com

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

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 sau 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 đó?

58
Yaroslav Fedevych

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 [~ # ~] hdmi [~ # ~] , trong tệp tập lệnh sau, thay đổi tất cả VGA1 đến HDMI1)

Đó là một giải pháp bẩn, nhưng 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 tôi có thể bạn sẽ ổn với chế độ mặc định RandR cho 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

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

  1. Đặt kịch bản trên (homemadeMonitor.sh) vào thư mục bạn thích

  2. 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

    chmod +x homemadeMonitor.sh

  3. Chạy tệp .sh

    ./homemadeMonitor.sh

20
peoro

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ó 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 --property và xem nếu các sự kiện được báo cáo khi bạn (dis-) kết nối hiển thị

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 bất kỳ sự kiện udev nào.

21
Andy

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 đó.

Máy tính xách tay của tôi có thẻ NVIDIA, vì vậy tôi sử dụng phần phụ trợ phân tán thay vì xrandr. 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 đăng này, tôi sẽ gọi nó là autorandr để thống nhất.

Bạn có thể lưu hồ sơ với autorandr --save profile_name. Chạy autorandr 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 vớ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 --default laptop với lệnh đó, 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.

19
Jack Senechal

Tôi đã sử dụng quy tắc udev được đề xuất ở trên cùng với 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 DISPLAY, bạn có thể sử dụng echo $DISPLAY để xem nó bằng số nào. Sử dụng xrandr -q để xem 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.

7
Cappie

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/tổng quan

Đâ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.)

6
Joachim Breitner

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ừ một giải pháp của người dùng 1 :

Theo dõi (đầu ra) các sự kiện UDEV với udevadm
[.__.] Bước này sẽ quan trọng nhất đối với mỗi người dùng. Chạy 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
5
iyrin

Đố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 [.___] renice +19 $$>/dev/null [.__.] [.__.] ngủ $ START_DELAY [.__.] [.__.] OLD_DUAL = "dummy" [.__.] [.__.] trong khi [ 1]; làm [.___.] DUAL = $ (cat/sys/class/drm/card0-DP-2/status) [. ___. [[. ___.] if ["$ OLD_DUAL"! = "$ DUAL"]; sau đó [.__.] nếu ["$ DUAL" == "được 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 [.__.] đã thực hiện [.__. ] [.__.]

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ỳ).

3
Balzola

Để đơ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à độ phân giải số. 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
1
user180381

Tôi đoán những người đang xem 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ẽ phải xem câu hỏi này, nhưng 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 màn hình được cắm vào hoặc ra.

Đáng buồn là cấu hình trong tệp Monitor.xml không được ghi lại rõ ràng. 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
Joachim Breitner

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
Aaros

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, rồi 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 --change khi 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!

0
nicholas.alipaz