数日前、ラップトップのディスプレイを誤って壊してしまいました。画面の右側が損傷していますが、左側の大部分は使用可能です。私はいくつかの調査を行って、画面の寸法を変更して損傷のない領域に収まるようにする方法を見つけたところ、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
画面が希望の位置になりましたが、そのコマンドを実行した後、画面の左側に黒い境界線が表示され、削除できません。
ここで何が問題になっているのかわかりますか?
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)拡張機能を介して画面に関する情報を取得し、ルートウィンドウの四角形の内側にそれらの寸法を固定しません。
一時的な回避策は、LD_PRELOAD
ハックを介してXrandr
およびXinerama
拡張機能を使用できないようにすることです。これは、ダミー関数を、返された四角形をトリミングするラッパーに変えることで改善できます。
これは、mate
デスクトップ環境とlightdm
またはgdm3
ディスプレイマネージャーを備えたVanilla debian 9.5で私にとってうまくいきました:
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
次に、lightdm
のセッションメニューから[MATE]を選択し、ログインユーザーとして次のようにします。
$ LD_PRELOAD= xrandr --fb 800x768
まだplasma
またはgnome3
/gnome-Shell
/mutter
を使用して動作させることはできませんでした。