Скрипт xrandr для настройки внешнего монитора не выполняется из udev

У моего ноутбука экран 4k, и у меня также есть внешний монитор 1080p. Масштабирование монитора неправильное, поэтому каждый раз, когда я подключаю монитор, я выполняю команду xrandr, чтобы исправить это. Я решил, что могу автоматизировать этот процесс, и создал правило udev, которое будет выполняться, когда он распознает, что мой монитор подключен к порту HDMI. Проблема в том, что скрипты xrandr не выполняются. Я поместил эхо в текстовый файл в скрипт прямо над командой xrandr, чтобы убедиться, что он достиг этой точки, и так оно и было. Я также пробовал использовать команды сна, но внешний монитор просто ждет, пока скрипт перестанет спать, прежде чем включиться. Запуск скрипта вручную работает.

Мой файл правил udev выглядит следующим образом:

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/ext_monitor_scale"

xrandr script:

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
HDMI_STATUS=`cat /sys/class/drm/card0/card0-DP-3/status`

if [ $HDMI_STATUS = "connected" ]
then
        echo "test" >> test.txt
        sudo -u $USER_NAME xrandr --output DP-3 --scale 2x2 --output eDP-1 --scale 0.9999x0.9999
fi

Кто-нибудь знает обходной путь? Кажется, мне нужно подождать и позволить монитору включиться неправильно, а затем заставить скрипт выполнить команду xrandr, но, поскольку дисплей ждет сна, прежде чем он автоматически настроится, я не знаю, как это сделать. Спасибо!

0
задан 11 September 2020 в 04:04

1 ответ

Я не знаю, если вы все еще ищу решение, но ваш скрипт помог мне сделать это правильно.

Проблема в том, что вы считаете необходимым запускать его от имени пользователя, который в данный момент находится в системе. Во-первых, в этом нет необходимости, а во-вторых, способ, которым вы это делаете, неверен, потому что вызов «кто» ответит с помощью root, поскольку скрипт выполняется от имени пользователя root.

Чтобы решить вашу проблему, удалите sudo и добавьте правильный идентификатор дисплея:

#!/bin/sh
HDMI_STATUS=`cat /sys/class/drm/card1-HDMI-A-1/status`

if [ $HDMI_STATUS = "connected" ]
then
    DISPLAY=:0 /usr/bin/xrandr ...
else
    DISPLAY=:0 /usr/bin/xrandr ...
fi

Это отлично работает для меня.

В качестве бонуса вы можете заменить свой вызов xrandr вызовом arandr-скрипта (arandr может сохранить свою конфигурацию как скрипт в ~/.screenlayout (или куда угодно). Используя эти скрипты, вы только необходимо обновить их, чтобы они автоматически работали на событии udev.

1
ответ дан 7 November 2020 в 13:21

Другие вопросы по тегам:

Похожие вопросы: