2014-02-27

Gnome 3.10 / GTK3.10 でのHiDPI

糞すぎ。スケールが整数単位だなんて、OSXの影響受けすぎでしょ、そんなにOSXマネするんだったらそれ使えばいいじゃん。

ってのは冗談で、GTK 3.10 で HiDPI とも呼ばれる DPIスケーリングがサポートされたのでその話。

去年の頭に 12インチのフルHD液晶のラップトップを買った関係で、DPIスケーリングをオンにして通常Windowsを使ってる。でFirefoxもHiDPIをサポートしているので、HiDPIをサポートしてないアプリは基本的に使いたくなくなった。

現在Windows上であってもHiDPIをまともにサポートしているブラウザはInternet ExplorerとFirefoxだけで、Chromeはいまだにサポートしてくれず (Issueはあるよ!)、Operaに至っては、OS標準のDPI Scalingをオフにしている関係で、かなり残念なことになってる。HiDPIで使ってるのに文字サイズが細かくなりすぎる。

OSX版だとみんなサポートしてくれてるんだけどね。

このDPIスケーリングはGTK3.10でやっとサポートされたため、Linuxのデスクトップでもやっと使うことができるんだが (でもスケールサイズは整数のみという残念仕様。cairo使ってるのに)、今日時点でどのブラウザもサポートできてない。GNOME標準のブラウザであってもだ!。


こんな感じでGTK3側で勝手に低解像度でスケールする仕組みになってるんだけど、せっかくcairo surfaceにそのまま描画しただけでは全然ダメだということがわかる。ChromeとFirefoxはGTK2アプリ (ChromeはAuraに移行予定らしい) なんだけど、組み込みコントロールによってスケールするしないがあって、非常に残念な結果になってる。GTK2だとすべてエミュレーションでいいのに中途半端なことし過ぎ。GTK3だとデフォで全部エミュレーション。

しかも、デフォルトで低解像度自動スケールなので、こっちがスケールしたくなくても勝手にスケールする羽目になる。調べるとcairo側にscaleするAPIを作ってそれを呼んでるらしいと。cairoへ描画してるのにピクセル単位での描画じゃなくて、スケール単位での描画なので残念な描画結果になる。GTK3の描画シグナルでスケールを無理やりオフにすると確かにスケールせずに描画できるけど、ウィンドウの高さと幅がスケール前の長さを返すので、変更が非常に面倒。Firefoxみたく内部でいろいろ計算しているアプリの場合は逆に自動スケールなんて機能が邪魔すぎる。

ということで、自動スケールをオフにするには、gdk_x11_display_set_window_scale()を呼び出してスケールを1にすればいいらしい。またGnome側が持ってるフォントサイズはスケールを考慮したサイズなので、gdk_screen_get_setting()で現在のスケール値を取得して、それを基してピクセルサイズを計算すればいいってことらしい。

昨日の夜中に突貫工事したヤツ。Work In Progress。


Firefoxだとスクロールバーなど各コントロールは自前で描画するんでその計算がまだ上手くいってない。そんな感じ。

0 件のコメント: