macOSの解像度を秒で切り替える

解像度変更めんどくさい

十年ぐらい前から老眼になってしまったので、ディスプレイの解像度によっては裸眼だと見づらいことがある。なので、ディスプレイに向かうとき、眼鏡をかけたり、解像度を調整したりすることがある。

解像度の調整は、macOSだと、システム設定を出して、ディスプレイを選んで…… という操作になる。複数回のタップ操作が必要で、時間も数秒はかかってしまい、面倒くさい。

ノッチやだ

おまけに、会社支給端末も私物端末もM2 MacBook Airなので、カメラがスクリーンに食い込んでノッチになっている。面白い作りだと思うけど、使いづらい。なので、表示領域のheightを少し犠牲にし、ノッチが発生しないような解像度を使っているが、このようなノッチなしの解像度はデフォルトの選択肢には出てこない。望ましいものを選ぶには余計な1タップが必要だ。うっとうしい。

EasyResが隠れてしまう

なので、解像度を簡単に切り替えるためEasyResというツールを使っていた。macOSのメニューバーに常駐し、プルダウンからグラフィカルに解像度を選択できる。 デフォルトだと選択肢に選択可能な解像度が全て出てしまってうっとうしいのだが、選択肢を必要なものだけに絞り込むこともできる。

EasyRes

EasyRes

  • Chris Miles
  • ユーティリティ
  • 無料
apps.apple.com

しばらくこれを使っていたのだが、解像度を粗めに、つまり表示内容すくなめに設定したあとは、メニューバーが短くなりすぎてEasyResが隠れて出てこなくなってしまう。
こんな場合はシステム設定のほうを使えばいいのだが、なんだか負けた気持ちになる。

displayplacerは引数がめんどう

もっとぱっぱと解像度を切り替えたい人にはdisplayplacerというコマンドがある。 github.com

M2 MacBook Airの場合、内蔵スクリーンに反映できる解像度指定は以下の通り。これは displayplacer list で得られる。

  mode 0: res:960x600 hz:60 color_depth:8 scaling:on
  mode 1: res:1024x640 hz:60 color_depth:8 scaling:on
  mode 2: res:1024x666 hz:60 color_depth:8 scaling:on
  mode 3: res:1280x800 hz:60 color_depth:8 scaling:on
  mode 4: res:1280x832 hz:60 color_depth:8 scaling:on
  mode 5: res:1470x918 hz:60 color_depth:8 scaling:on
  mode 6: res:1470x956 hz:60 color_depth:8 scaling:on
  mode 7: res:1710x1068 hz:60 color_depth:8 scaling:on
  mode 8: res:1710x1112 hz:60 color_depth:8 scaling:on
  mode 9: res:1920x1200 hz:60 color_depth:8
  mode 10: res:2048x1280 hz:60 color_depth:8
  mode 11: res:2048x1332 hz:60 color_depth:8
  mode 12: res:2560x1600 hz:60 color_depth:8
  mode 13: res:2560x1664 hz:60 color_depth:8

また、どのディスプレイに対して操作を行うのかも引数で指定しないとならない。かつ、これはディスプレイごとのユニーク識別子で指定しないとならない。さらにその識別子はディスプレイを繋いだり外したりするたびに動的に変わってしまうようだ。ここはmacOSの仕様らしい。X Window Systemみたいに、このホストの最初のディスプレイは :0.0 に決まっている、といったような作法がないようだ。

displayplacerには、これら動的かつマジックナンバーな文字列を引数として与えないといけないのだが、面倒くさすぎる。自分が使いたい解像度は以下の4種類だけなので、

mode 1: res:1024x640 hz:60 color_depth:8 scaling:on
mode 3: res:1280x800 hz:60 color_depth:8 scaling:on
mode 5: res:1470x918 hz:60 color_depth:8 scaling:on
mode 7: res:1710x1068 hz:60 color_depth:8 scaling:on

こんなscriptをpathのどこかに d1 d2 d3 d4 の名前でsymlinkで複製でもして置いておく。

#!/bin/bash
BUILTIN_SCREEN_ID=$(displayplacer list | grep 'Persistent screen id:' | sed 's/.* //')
case $(basename $0) in
    d1) displayplacer "id:${BUILTIN_SCREEN_ID} mode:1" ;;
    d2) displayplacer "id:${BUILTIN_SCREEN_ID} mode:3" ;;
    d3) displayplacer "id:${BUILTIN_SCREEN_ID} mode:5" ;;
    d4) displayplacer "id:${BUILTIN_SCREEN_ID} mode:7" ;;
    *) echo 'Usage: d1|d2|d3|d4'; exit 1;;
esac

実際にはさらにAlfredのWorkflowに仕込んでいるので、 操作を意識しない程度に気軽に解像度を変更できるようになった。