如何获取外部显示器的正确模式行?

如何获取外部显示器的正确模式行?

我办公室里有一台 Flatron E2042,它的 [固件] 问题是我见过的显示器中最严重的问题:它无法始终以全分辨率工作。

今天是它正常工作的日子,我想获取正确分辨率的模式行。它不在 Xorg.0.log 中,并且gtf/cvt计算一个模式行。澳大利亚金融情报机构xrandr --verbose显示所有需要的数字,但重新排列并且无法随时供以后使用--newmode。并且xvidtune -show仅列出内部显示,手册中没有关于选择另一个显示的任何信息。

那么,还有其他方法可以获取当前的模式行吗?

更新:

我现在用来使其工作的脚本:

#!/bin/bash
modeline="flatron_e2042 108.00 1600 1624 1704 1800 900 901 904 1000 +hsync +vsync"
xrandr --newmode $modeline
modename="$(echo ${modeline%% *})"
xrandr --addmode VGA1 $modename
xrandr --output VGA1 --mode $modename

答案1

尝试使用 xvidtune:

xvidtune -show

答案2

不完全是模式行,但您可以下载显示器的 EDID 信息,其中列出了所有支持的分辨率。我会使用 read-edid 包中的 get-edid 和 parse-edid 工具(http://manpages.ubuntu.com/manpages/oneiric/man1/get-edid.1.html)。然后在启动 X 时尝试使用 EDID 信息,而不是每次都向显示器询问该信息。

我知道 nvidia 驱动程序对自定义 EDID 文件有很好的支持。我不确定其他驱动程序是如何支持的。我相信你会弄清楚的。

命令:

sudo get-edid > ~/lg_edid
parse-edid < ~/lg_edid

答案3

公认的答案声称要获取当前 ModeLine,应该使用“xvidtune”工具。不幸的是,该程序显示的是 X 服务器启动时使用的 ModeLine,而不是当前的 ModeLine。只需尝试更改分辨率(使用“xrandr”或窗口管理器监视器控制工具),然后再次运行“xvidtune -show”,您就会明白我在说什么。可能,获取当前 ModeLine 的更好方法是使用“xrandr”工具本身,如下所示:

$ xrandr --verbose

例如,在我的情况下,结果是这样的(唯一具有当前 ModeLine 的行):

1920x1080 (0x251) 148.500MHz +HSync +VSync *current h: width 1920 start 2008 end 2052 total 2200 skew 0 clock 67.50KHz v: height 1080 start 1084 end 1089 total 1125 clock 60.00Hz

如您所见,当前 ModeLine 由“*current”标记指定。如果使用多个显示器,则可能需要在 xrandr 的输出中查找适当的部分,该部分标有所讨论的显示器所连接的输出名称(例如 HDMI-0、DVI-D-0、VGA-0 等)。

答案4

parse-edid已过时。只需使用xrandr,它包含所有信息。

您可以xrandr使用例如这样的 Perl 脚本将输出重新格式化为模式行

#!/usr/bin/perl

use strict;
use warnings;

my ($dp, $width, $height, $opts, $current, $clock, $sync, $hpart, $vpart, $refresh);
my $preferred = "";
sub flush() {
    print "    Option \"PreferredMode\" \"$preferred\"\n" if ($preferred);
    print "EndSection\n" if ($dp);
    $preferred = "";
    $dp = "";
}

open(my $F, "xrandr --verbose |") or die $!;

while(<$F>) {
    chomp;
    if (/^(\S+) (\S+)/) {
        flush();
        $dp = $2 eq "connected" && $1;
        next unless $dp;
        print "Section \"Monitor\"\n";
        print "    Identifier \"$dp\"\n";
        next;
    }
    next unless $dp;
    if (/^\s+(\d+)x(\d+)\s+\S*\s+(\d+\.?\d*)\S+\s+([-+]HSync\s+[-+]VSync)\s*(.*)/i) {
        $width = $1; $height = $2; $clock = $3; $sync = lc $4; $opts = $5;
        $current = $opts =~ /current/;
        if ($opts !~ /preferred/) {
            flush();
            next;
        }
    }
    if (/^\s+h: width\s+(\d+)\s+start\s+(\d+)\s+end\s+(\d+)\s+total\s+(\d+)/) {
        $hpart = "$1 $2 $3 $4";
    }
    if (/^\s+v: height\s+(\d+)\s+start\s+(\d+)\s+end\s+(\d+)\s+total\s+(\d+).*?\bclock\s+(\d+)/) {
        $vpart = "$1 $2 $3 $4";
        $refresh = $5;
        my $mode = "${width}x${height}_${refresh}";
        print "    Modeline    \"$mode\" $clock $hpart $vpart $sync   ($width x $height @ $refresh)\n";
        if ($current) {
            $preferred = $mode;
        }
    }
}
flush();
close($F);

相关内容