Xrandrはディスプレイの破損の問題を回避しようとします。

Xrandrはディスプレイの破損の問題を回避しようとします。

数日前、誤ってノートパソコンのディスプレイを落とし、画面の右側が破損していましたが、左側はほとんど使用できました。損傷を引き起こすことなく、その領域に合わせて画面サイズを変更する方法を見つけるためにいくつかの研究を行い、その結果を知りましたxrandr

スクリーンショット

次の.shアーカイブが見つかりましたが、画面を左側に配置する方法、または--transformパラメータまたはコマンドを変更する方法が見つかりませんでした--fb

#!/bin/bash

#change these 4 variables accordingly
ORIG_X=1280
ORIG_Y=800
NEW_X=1160
NEW_Y=800
###

X_DIFF=$(($NEW_X - $ORIG_X))
Y_DIFF=$(($NEW_Y - $ORIG_Y))

ORIG_RES="$ORIG_X"x"$ORIG_Y"
NEW_RES="$NEW_X"x"$NEW_Y"
ACTIVEOUTPUT=$(xrandr | grep -e " connected [^(]" | sed -e "s/\([A-z0-9]\+\) connected.*/\1/")
MODELINE=$(cvt $NEW_X $NEW_Y | grep Modeline | cut -d' ' -f3-)

xrandr --newmode $NEW_RES $MODELINE
xrandr --addmode $ACTIVEOUTPUT $NEW_RES
xrandr --output $ACTIVEOUTPUT --fb $NEW_RES --panning $NEW_RES --mode $NEW_RES
xrandr --fb $NEW_RES --output $ACTIVEOUTPUT --mode $ORIG_RES --transform 1,0,$X_DIFF,0,1,$Y_DIFF,0,0,1

また、次の行の.shアーカイブを実行せずにこれを試しました。

xrandr --output LVDS-1 --fb 800x768 --mode 800x768 --transform 1,0,566,0,1,0,0,0,1

画面は私が望む場所にありますが、コマンドを実行すると画面の左側に黒い枠が表示され、削除できません。

スクリーンショット

ここで何が起こっているのかご存知ですか?

答え1

xrandr --fb--mode(、、などではありません)を使って画面サイズを設定します--transform

$ xrandr --fb 800x768

xrandr画面サイズが小さすぎると文句を言いますが、設定は引き続き適用されます。

例:

$ xrandr --fb 1520x1080
xrandr: specified screen 1520x1080 not large enough for output VGA-0 (1920x1080+0+0)
X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  29 (RRSetPanning)
  Serial number of failed request:  43
  Current serial number in output stream:  43

# from the xtruss output
--- ConfigureNotify(event=w#000004A8, window=w#000004A8, x=0, y=0, width=1520, height=1080, border-width=0, above-sibling=None, override-redirect=False)

$ xwininfo -root | grep geo
  -geometry 1520x1080+0+0

これはエラーではなく警告です。場合によっては、画面サイズを実際の表示サイズより小さく設定するのが合理的です。

修正する:

マルチヘッドサポートウィンドウマネージャは、Xrandr(3)およびXinerama(3)拡張を介して画面に関する情報を取得し、サイズをルートウィンドウの長方形に制限しません。

一時的な解決策は、ハッキングによる使用Xrandrと拡張を防ぐことです。これは、仮想関数を返された四角形を切り取りラッパーに変換することで改善できます。XineramaLD_PRELOAD

mateこれはlightdmデスクトップ環境および/またはディスプレイマネージャを備えたBanila Debian 9.5で動作しますgdm3

root# apt-get install mate-desktop-environment lightdm
root# apt-get install gcc

root# cat <<'EOT' | cc -fPIC -x c - -shared -o /etc/X11/no_xrr.so
int XineramaIsActive(void *d){ return 0; }
void *XineramaQueryScreens(void *dpy, int *n){ *n = 0; return 0; }
int XineramaQueryExtension(void *d, int *i, int *j){ return 0; }
int XRRQueryExtension(void *d, int *i, int *j){ return 0; }
EOT

root# cat <<'EOT' >/etc/X11/Xsession.d/98-no_xrr
export LD_PRELOAD=/etc/X11/no_xrr.so
case $STARTUP in
/usr/bin/ssh-agent*)
        STARTUP="/usr/bin/ssh-agent env LD_PRELOAD=$LD_PRELOAD ${STARTUP#* }";;
esac
EOT

次にセッションメニューから「MATE」を選択し、lightdmユーザーとしてログインします。

$ LD_PRELOAD= xrandr --fb 800x768

まだ //plasmaまたは を使用して動作していません。gnome3gnome-shellmutter

答え2

以下はこのスクリプトの修正版です(KDEの変更は他の場所で見つかりました)。

#!/bin/bash

# (if using as a KDE autostart script)
# sleep 10

# change these 4 variables accordingly
ORIG_X=2880
ORIG_Y=1800
NEW_X=2810
NEW_Y=1800
###
#Modify to multiple of 8. Issues with window sizing etc without these next two lines.
NEW_X=$(($NEW_X/8*8))
NEW_Y=$(($NEW_Y/8*8))
X_DIFF=$(($NEW_X - $ORIG_X))
Y_DIFF=$(($NEW_Y - $ORIG_Y))
# Uncomment the next line to use left portion of screen:
#X_DIFF=0
# Uncomment the next line to use upper portion of screen:
#Y_DIFF=0

ORIG_RES="$ORIG_X"x"$ORIG_Y"
NEW_RES="$NEW_X"x"$NEW_Y"
ACTIVEOUTPUT=$(xrandr | grep -e " connected [^(]" | sed -e "s/\([A-z0-9]\+\) connected.*/\1/")
MODELINE=$(cvt $NEW_X $NEW_Y | grep Modeline | cut -d' ' -f3-)

xrandr --newmode $NEW_RES $MODELINE
xrandr --addmode $ACTIVEOUTPUT $NEW_RES
xrandr --output $ACTIVEOUTPUT --fb $NEW_RES --panning $NEW_RES --mode $NEW_RES
xrandr --fb $NEW_RES --output $ACTIVEOUTPUT --mode $ORIG_RES --transform 1,0,$X_DIFF,0,1,$Y_DIFF,0,0,1

# KDE specific -- restart shell so that icon tray is properly sized
# kquitapp5 plasmashell
# kstart5 plasmashell

衛星ベースのデジタルマルチモード光ファイバ:

sddmログイン画面で機能させるには、各xrandr行の前にechoを配置し、結果のxrandrコマンドをsddmの先頭にコピーします。KDEを実行している場合、設定をKDEプラズマに転送するにはKScreenを無効にする必要があります。

モニター接続後に実行...

grep "Manufacturer:" /var/log/Xorg.0.log

.../var/log/Xorg.0.logでディスプレイを見つけ、それに応じて以下のif grep行を修正してください。上記のようにxrandr行を変更することを忘れないでください。 /usr/share/sddm/scripts/Xsetupに追加:

if grep -q -wi "Manufacturer: SKY  Model: 1801" /var/log/Xorg.0.log; then
  xrandr --newmode 2872x2160 531.25 2872 3104 3416 3960 2160 2163 2173 2237 -hsync +vsync
  xrandr --addmode HDMI-A-0 2872x2160
  xrandr --output HDMI-A-0 --fb 2872x2160 --panning 2872x2160 --mode 2872x2160
  xrandr --fb 2872x2160 --output HDMI-A-0 --mode 3840x2160 --transform 1,0,-968,0,1,0,0,0,1
fi

関連情報