2014年12月11日木曜日

CGDisplayIOServicePort()を使わずモニタ名を取得する。

モニタ名の取得に使っていたCGDisplayIOServicePort()がdeprecatedになってしまったので、
その代替案を探していました。
Stack Overflowでも同様の質問がありました。
objective c - CGDisplayIOServicePort is deprecated in OS X >= 10.9, how to replace? - Stack Overflow

この質問のコメントによると、GitHubのとあるレポジトリに別の実装方法があるとのことでした。
どのような変更を行ったかはdiffを見ると分かりやすいです。
Replace CGDisplayIOServicePort with a workaround implementation · 8101d7a · glfw/glfw

具体的にはIOServicePortFromCGDisplayID()という関数を追加し、getDisplayName()で使用していたCGDisplayIOServicePort()の代わりに使っているようです。

最新のソースから、IOServicePortFromCGDisplayID()とgetDisplayName()を自分のソースにコピーすれば、ひとまず使えるようになります。(IOKit未使用だった場合はIOKit.frameworkの追加とIOGraphicsLib.hのインクルードは最低限必要だと思います)

ただし、NSStringへの変換やロケールの指定など、ある程度自分用にカスタムする必要はありそうです。