Linux

試圖避免顯示損壞的 Xrandr 問題

  • January 12, 2022

幾天前我不小心弄壞了我的筆記型電腦顯示屏,螢幕右側已損壞,但左側大部分都可以使用。我做了一些研究,試圖找到一種方法來修改螢幕尺寸以適應該區域而不會造成損壞,然後我找到了 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(no --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) 擴展獲取有關螢幕的資訊,並且不會將它們的尺寸限制在根視窗矩形內。

一個臨時的解決方法是阻止他們通過 hac​​k 使用XrandrandXinerama擴展LD_PRELOAD。這可以通過將虛擬函式轉換為修剪返回的矩形的包裝器來改進。

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儘管使用or gnome3/ gnome-shell/但我無法讓它工作mutter

引用自:https://unix.stackexchange.com/questions/472459