AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 472459
Accepted
Daniel
Daniel
Asked: 2018-10-01 13:02:22 +0800 CST2018-10-01 13:02:22 +0800 CST 2018-10-01 13:02:22 +0800 CST

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

  • 772

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

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

在此处输入图像描述

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

linux xrandr
  • 2 2 个回答
  • 1993 Views

2 个回答

  • Voted
  1. Best Answer
    mosvy
    2018-10-01T15:53:06+08:002018-10-01T15:53:06+08:00

    只需使用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使用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。

    • 4
  2. JJones
    2022-01-13T14:00:30+08:002022-01-13T14:00:30+08:00

    这是我对该脚本的修改版本(在其他地方找到了 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:要在 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
    
    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve