Xrandr 试图避免显示损坏的问题

Xrandr 试图避免显示损坏的问题

几天前,我不小心摔坏了笔记本电脑的显示屏,屏幕的右侧已损坏,但左侧的大部分可用。我做了一些研究,试图找到一种方法来修改屏幕的尺寸,以适应该区域而不造成损坏,我发现xrandr

screenshot

我找到了下一个 .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

屏幕占据了我想要的位置,但运行该命令后,屏幕左侧出现黑色边框,我无法将其删除。

screenshot

知道这里出了什么问题吗?

答案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或显示管理器的vanilla 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

然后,从会话菜单中lightdm选择“MATE”,并作为登录用户:

$ LD_PRELOAD= xrandr --fb 800x768

我还无法让它与plasmagnome3/ gnome-shell/一起工作mutter

答案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,则需要禁用 KScreen 以将设置转移到 KDE Plasma 中。

连接显示器后运行...

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

相关内容