xf86-video-i810-2.0.0
Device セクションのオプションに CheckDevices と書けるようだ。値は bool。
これはモニタが接続しているかどうかを調べるフラグかな。
i830_driver.c を読む限りあんま関係ないな。
"Screen" セクションの Virtual は記述した方がよさげ。ここで指定した width height が Probe に効いてくる。ここを指定しないと xrandr経由で値を得ようとする。が、多分 0(0mm x 0mm の部分) が得られるはず。
>xrandr --prop Screen 0: minimum 320 x 200, current 1400 x 1050, maximum 1400 x 1050 VGA connected 1024x768+0+0 (normal left inverted right) 0mm x 0mm 1024x768 60.0* 800x600 60.3 640x480 59.9 LVDS connected 1400x1050+0+0 (normal left inverted right) 0mm x 0mm BACKLIGHT: 39062 (0x00000000) range: (0,39062) 1400x1050 29.7*+ 74.8 60.0 1280x1024 85.0 75.0 60.0 1280x960 85.0 60.0 1152x864 75.0 1152x768 54.8 1024x768 85.0 75.0 70.1 60.0 832x624 74.6 800x600 85.1 72.2 75.0 60.3 56.2 640x480 85.0 72.8 75.0 59.9 720x400 85.0 640x400 85.1 640x350 85.1
xf86crtc.c を見ると、モード選択のパラメータは width/height, pereferred で rate がなさげ。なので、得られたモード集合のうち最初にマッチしたものを選択してしまうのではないだろうか?
あとは、 preferred が on になる条件がキモかも。ということでおっかけてみる。
preferred は xf86ProbeOutputModes 関数内でセットされていて、基本的には ServerLayout セクションの PreferredMode オプションで決まるらしい。
Modeline の定義:
Modeline "解像度" PixelClock HDisplay HSyncStart HSyncEnd HTotal VDisplay VSyncStart VSyncEnd VTotal -hsync -vsync
Xorg.0.log で得られた 1400x1050 のモードたち:
(II) intel(0): Modeline "1400x1050"x29.7 53.43 1400 1464 1576 1688 1050 1052 1060 1066 (31.7 kHz) (II) intel(0): Modeline "1400x1050"x74.8 155.80 1400 1464 1784 1912 1050 1052 1064 1090 +hsync +vsync (81.5 kHz) (II) intel(0): Modeline "1400x1050"x60.0 122.00 1400 1488 1640 1880 1050 1052 1064 1082 +hsync +vsync (64.9 kHz)
preferred を選択するところ:
/* yes, use VDisplay here, not xf86ModeHeight */ dpi = (mode->VDisplay * 254) / (mm_height * 10); diff = dpi - 96; diff = diff < 0 ? -diff : diff; if (target_mode == NULL || (preferred > target_preferred) || (preferred == target_preferred && diff < target_diff)) { target_mode = mode; target_diff = diff; target_preferred = preferred; }
これじゃぁ、29.7Hz を選んじゃうよなぁ..