pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


macOSの解像度をコマンドラインツールで変更する displayplacer の対応解像度一覧表示を改修する

先日、macOSの解像度をコマンドラインツールで変更する displayplacer の記事を投稿しましたが、このツールの微妙な欠点は、対応解像度を一覧表示する形式と、実際に解像度を指定する際の形式が似ているようで違っていて、本当に微妙なところで使いづらい点だと思います。

pslabo.hatenablog.com

そこで、一覧表示の形式にパッチを当てることにしました。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 の検出などの処理なのでこれ以上削ることはできません。