我办公室里有一台 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);