macOSの解像度をコマンドラインツールで変更する displayplacer の対応解像度一覧表示を改修する
先日、macOSの解像度をコマンドラインツールで変更する displayplacer の記事を投稿しましたが、このツールの微妙な欠点は、対応解像度を一覧表示する形式と、実際に解像度を指定する際の形式が似ているようで違っていて、本当に微妙なところで使いづらい点だと思います。
そこで、一覧表示の形式にパッチを当てることにしました。displayplacer.c の下記の2箇所を修正するだけです。
--- displayplacer.c.orig  2020-07-24 16:517.000000000 +0900
+++ displayplacer.c 2020-07-24 17:23:29.000000000 +0900
@@ -283,9 +283,10 @@
 
         printf("Resolutions for rotation %i:\n", (int) CGDisplayRotation(curScreen));
         for (int i = 0; i < modeCount; i++) {
+            printf("id:%i ", curScreen);
             modes_D4 mode = modes[i];
 
-            printf("  mode %i: res:%dx%d", i, mode.derived.width, mode.derived.height);
+            printf("  mode:%i res:%dx%d", i, mode.derived.width, mode.derived.height);
 
             if (mode.derived.freq) {
                 printf(" hz:%i", mode.derived.freq);
そして改修したバージョンのdisplayplacerを使って解像増度設定を対話的に行うラッパースクリプトは次のようになります。
#!/bin/bash
which -s percol
if [ $? -eq 0 ]; then
    interactive_helper="percol"
fi
which -s peco
if [ $? -eq "0" ]; then
    interactive_helper="peco"
fi
if [ ${interactive_helper} == "" ]; then
    echo "abort: peco or percol requires to run"
    exit 1
fi
displayresolutionselect=$(
    displayplacer.new list |
    awk '$0 ~ /^id:/ { print }' |
    $interactive_helper
)
displayplacerparam=$(
    echo $displayresolutionselect |
    /usr/bin/awk '{ print $1" "$2 }'
)
displayplacer "${displayplacerparam}"
echo "change to \"${displayresolutionselect}\""
昨日、こちらの記事に投稿したスクリプトに比べて、さほど実装量は減りませんでした。 pslabo.hatenablog.com
ただし awk の文字列処理部分はシンプルになったので、これでよいのではと思っています。awk の処理が2箇所残っているのは、1箇所は displayplacer list の出力結果から解像度一覧だけを取得するための処理ですし、もう1箇所は id と mode だけを抽出するための処理です。その他の部分は peco や percol の検出などの処理なのでこれ以上削ることはできません。