先日、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 の検出などの処理なのでこれ以上削ることはできません。