Puppy Linux(TahrPup,XenialPupなど)でモニタの解像度が低くなってしまう不具合(Ubuntuなどでも起こるらしい)の対処法
うちのPuppy Linuxを入れているマシンにつないでいるモニタはこれまでずっと1024x768が最大の解像度で、ずっとそのまま使ってきた。
あるとき、モニタにRESOLUTION NOTIFIERという機能があり、これをオンにして見たところ、「最適信号は1280x1024」だと表示された。
つまり、このモニタは1280x1024で表示できたのだ。
今まで気が付かなかったが、そういえばWindowsXPではその解像度で使っていたような気もする。
XPを消してしまって随分経つので忘れていたのかも知れない。
ともかく1280x1024で表示できるならそれで使うほうが良いに決まっている。
Puppy Linuxにある「Xorg ビデオ ウィザード」から解像度を設定するアプリを呼び出せる。
そこには確かに1280x1024がプルダウンメニューの選択項目にある。
しかし、これを選択してXサーバーを再起動しても解像度が上がらないのである。
Subsection "Display"
Depth 24 #screen0depth
Modes "1024x768" #screen0modes
EndSubsection
のModesを"1280x1024"に変えてもダメだった。
調べてみるとPuppy Linuxを入れているマシンのオープンソースのグラフィックドライバのradeonが1024x768以下の解像度しか設定できないと認識しているようだ(この言い方が正しいかわからない)。
/var/log/Xorg.0.logの中に以下の出力がある。
[ 19.576] (II) RADEON(0): Modeline "1024x768"x60.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz e)
[ 19.576] (II) RADEON(0): Modeline "800x600"x60.3 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz e)
[ 19.576] (II) RADEON(0): Modeline "800x600"x56.2 36.00 800 824 896 1024 600 601 603 625 +hsync +vsync (35.2 kHz e)
[ 19.576] (II) RADEON(0): Modeline "848x480"x60.0 33.75 848 864 976 1088 480 486 494 517 +hsync +vsync (31.0 kHz e)
[ 19.576] (II) RADEON(0): Modeline "640x480"x59.9 25.18 640 656 752 800 480 489 492 525 -hsync -vsync (31.5 kHz e)
同じような症状に悩まされている人は多いようで、もっと高い解像度で表示できるモニタですら1024x768でしか表示できないのはかなり悲惨である。
ネットで調べてみると、どうやらgtfやcvtというコマンドを使って強制的に解像度を変更できるらしい。
gtf 1280 1024 60
# 1280x1024 @ 60.00 Hz (GTF) hsync: 63.60 kHz; pclk: 108.88 MHz
Modeline "1280x1024_60.00" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
cvtだと
cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
と出る。
微妙に値が違う。
PCディスプレイの信号タイミング基準について - Diary on wind
GTFのタイミング公式はブラウン管ディスプレイに最適化されており、電子ビームの移動に必要な空白期間を多めにとるようになっている。 液晶ディスプレイではそれほど空白期間を必要としないため、空白期間を短くしたタイミング公式 CVT RB(Reduced Blanking) を新たに制定した。
CVTの方が新しい規格である上、液晶モニタを想定して作られているということからcvtコマンドの出力結果を利用する。
xrandrコマンドでXの再起動無しに動的に解像度を変える方法もあるが、結局、設定を保存して次回から自動的に設定した解像度で表示されるようにするには/etc/X11/xorg.confを書き換えなければいけないので、最初からそれを行う。
もしものために今のxorg.confを保存しておく。
端末で
cp /etc/X11/xorg.conf xorg.conf.bak
などとすると/rootディレクトリにxorg.conf.bakというファイルができる。
エディタでxorg.confを開いているなら「名前をつけて保存」で同じようなことをしても良い。
とにかくバックアップをとっておこう。
cvtコマンドを使って出力された文字列のうちModeline以下をコピーする。
端末でドラッグして選択し、マウスの右ボタンと左ボタンを同時にクリックすればコピーできる。
ドラッグするとそれでコピーされ、端末内でマウスの右ボタンと左ボタンを同時に押すと貼り付けの動作となると書いてある記事もあるが、そのように動作する場合もあればそうならない場合もある。
また、
cvt 1280 1024 > modeline.txt
とすると出力が/root/modeline.txtに保存されるので、これをエディタで開けば良い。
コピーした文字列をxorg.conf内のSection “Monitor"に貼り付ける。
こんな感じだ。
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
# HorizSync 35-81
# VertRefresh 59-76
#UseModes "Modes0" #monitor0usemodes
# Option "PreferredMode" "1024x768" #monitor0prefmode
Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
EndSection
EndSectionのインデントがおかしいのだが、これはPuppy Linuxの問題で、動作には問題ないのでそのままにしておく。
次にSection “Screen"のSubsection "Display"にModesを追加する。
Subsection "Display"
# Depth 24 #screen0depth
# Modes "1024x768" #screen0modes
Modes "1280x1024_60.00"
EndSubsection
とした。
これでXサーバーを再起動すると1280x1024で表示されるはずである。
もしうまくいかなかった場合は、Ctrl+Alt+Backspaceを使ってコンソールに戻るか、強制終了して再起動し、Grubのコマンドラインで"pfix=nox"としてコンソールで起動するようにする。
そして
rm /etc/X11/xorg.conf
cp xorg.conf.bak /etc/X11/xorg.conf
としてバックアップしておいた設定ファイルを復元して、xwinでXサーバーを起動するか、PCを再起動すれば元に戻る。
随分、画面が広く使えるようになった。
画面サイズが大きいので、ツイッター公式サイトなどレスポンシブなレイアウトを使っているサイトは見た目が変わった。
今まで気がついていなかったが、考えてみるとこれと同じ状況はAndroid-x86やRemixOSにもあるんじゃないだろうか?
画面解像度は変更前のPuppy Linuxと同じだった気がする。
それが普通だと思っていたので気が付かなかっただけである。
ともかくPuppy Linuxではモニタを本来の最高の性能で使えるようになった。
めでたしめでたし。