概要
- X11 での DPIスケーリング や マルチモニター対応 の不可能説への挑戦
- OpenGL を用いた ピクセル単位のスケーリング制御 の実験
- 複数ディスプレイ 間での物理サイズ維持の実証
- Xサーバ から取得した情報を用いた 動的サイズ調整
- 結論: 「できない」と言われても実際には可能 であるという実体験
X11のDPIスケーリングとマルチモニター対応の実態
- 世間ではX11はDPIスケーリングや複数モニター対応ができない という意見が多い
- 実際に検証するために、複数の異なるサイズ・解像度のディスプレイを用意
- xrandrコマンド で各ディスプレイの物理サイズと解像度を取得
- eDP (ラップトップ)、DisplayPort-0 (モニター)、DisplayPort-1 (TV)の構成
- OpenGLとGLX でウィンドウとシェーダーを用意し、 常に2インチの円 を描画することを目標
- シェーダー内のradius変数 が円の半径(ピクセル数)を制御
実装アプローチ
- XサーバのConfigureNotifyイベント でウィンドウ位置やサイズの変化を検知
- 各モニターの物理幅(mm)と仮想幅(ピクセル) をXRRScreenResourcesから取得
- XRROutputInfo で物理幅を、 XRRCrtcInfo でピクセル幅・位置を取得
- ピクセル幅/物理幅からDPIを計算し、目的の物理サイズに合わせてradiusを調整
- モニター間でウィンドウを移動すると、常に同じ物理サイズの円が描画される ことを確認
実験結果と考察
- 各ディスプレイで2インチの円が表示されることを実証
- TVでは4K解像度にも関わらず、物理サイズは維持
- 計測誤差(TVの実測サイズとスペック表記の違い) による微小なズレも経験
- プログラムはリモートのルーターで実行しても問題なく動作
- X11+OpenGL+MIT-MAGIC-COOKIE-1でのリモート描画の有効性 も確認
「できない」と言われる理由と反論
- 「X11ではDPIスケーリングやマルチモニターはできない」という通説 は必ずしも正しくない
- 必要な情報はXサーバから取得可能 で、プログラム側で適切に処理すれば実現可能
- 「できない」と言われても、自分で試してみることの重要性
- 実際に動作する例を示すことで、誤解を払拭
応用例とまとめ
- Shape Extensionを使ったオンスクリーン定規 も作成
- 端末の行高さ(1/8インチ)も正確に測定可能
- 「できない」と言われていることも、実際には技術的に可能
- 実験と検証による知見の重要性