Linux
試圖避免顯示損壞的 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
螢幕佔據了我想要的位置,但執行該命令後,螢幕左側出現黑色邊框,我無法將其刪除。
知道這裡出了什麼問題嗎?
只需使用
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) 擴展獲取有關螢幕的資訊,並且不會將它們的尺寸限制在根視窗矩形內。
一個臨時的解決方法是阻止他們通過 hack 使用
Xrandr
andXinerama
擴展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
儘管使用orgnome3
/gnome-shell
/但我無法讓它工作mutter
。