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

Dan*_*iel 9 linux xrandr monitors display

几天前,我不小心弄坏了笔记本电脑的显示屏,屏幕右侧损坏了,但左侧的大部分都可以使用。我做了一些研究,试图找到一种方法来修改屏幕的尺寸以适应该区域而不会造成损坏,我找到了 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
Run Code Online (Sandbox Code Playgroud)

我还尝试在不运行下一行的 .sh 存档的情况下执行此操作:

xrandr --output LVDS-1 --fb 800x768 --mode 800x768 --transform 1,0,566,0,1,0,0,0,1
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

小智 4

xrandr --fb只需使用(不--mode,,--transform等等)设置屏幕尺寸。

$ xrandr --fb 800x768
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这可能应该是一个警告而不是一个错误;在某些情况下,将屏幕尺寸设置为小于实际显示器的尺寸是非常有意义的。

更新:

启用多头的窗口管理器通过 Xrandr(3) 和 Xinerama(3) 扩展获取有关屏幕的信息,并且不会将其尺寸限制在根窗口矩形内。

一个临时的解决方法是阻止他们通过黑客行为使用Xrandr和扩展。可以通过将虚拟函数转换为修剪返回矩形的包装器来改进这一点。XineramaLD_PRELOAD

这对我在带有mate桌面环境的 vanilla debian 9.5 以及lightdm显示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
Run Code Online (Sandbox Code Playgroud)

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

$ LD_PRELOAD= xrandr --fb 800x768
Run Code Online (Sandbox Code Playgroud)

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