几天前,我不小心摔坏了笔记本电脑的显示屏,屏幕的右侧已损坏,但左侧的大部分可用。我做了一些研究,试图找到一种方法来修改屏幕的尺寸,以适应该区域而不造成损坏,我发现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
屏幕占据了我想要的位置,但运行该命令后,屏幕左侧出现黑色边框,我无法将其删除。
知道这里出了什么问题吗?
答案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
和扩展。可以通过将虚拟函数转换为修剪返回矩形的包装器来改进这一点。Xinerama
LD_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
我还无法让它与plasma
或gnome3
/ 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