〔Mac〕 ShiftItのメニューをビジュアル化する 

# ShiftItとは

[ShiftIt](https://github.com/fikovnik/ShiftIt/blob/master/README.md)とは、MacOSでウィンドウのサイズと位置を管理する、ウィンドウ配置ツールのことです。

ShiftItは[当Qiitaでも多くの方が記事にしている](https://qiita.com/search?sort=&q=mac+shiftit)ので、Macでは定番のユティリティソフトと思われますが、自分はつい最近知って使い始めたばかりです。

_当初、このようなツールを自作しようと、アクティブウィンドウの求め方や外部プログラムからアクティブウィンドウのサイズや位置の設定方法を調べようとネットサーフィンしていて、ShiftItの存在を知りました。_

起動するとメニューバーに常駐し、クリックすると↓このようなメニューが現れます。
`Left`や`Right`、`Top`や`Bottom`など、英単語で位置を表現しているので パッと見で分かりません。これにアイコンを付加して見やすくビジュアル化しようというのが、この記事の主旨です

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/75f99826-309d-d75a-cde8-ccb7043c49d9.png)



# ビジュアル化したメニュー

↓このようなアイコンを付加しました。字面を追わずとも視覚的に分かるようになったと思います。
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e6d306cb-392e-84dd-f771-73511bfc212c.png)

これには、コードの変更は不要で、XcodeでMainMenu.xibを開き、Interface BuilderでMenuItemにImageを指定するだけで実現できます。

[ShiftItのソースコードはGitHubに公開されている](https://github.com/fikovnik/ShiftIt/releases)ので、それをダウンロードしてXcodeでMenuItemを加工してビルドします。

使用したアイコンのイメージファイルは、今回自分でデザインしたものです。稚拙なデザインですがこれでよいという方はご自由にご使用ください。（72x72のアルファチャンネル無しPNGファイル）

![left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/77c7a88a-ed6c-75dd-7ad4-b67db3f3eb1d.png) ![right.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/d6690d2b-b86e-673f-047e-d2bbb63d5f01.png) ![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/bbf0f8ee-bb82-84a7-29f5-e358bb6be5df.png) ![bottom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/75a49e76-d3a3-61fc-c477-07574c65d266.png) 
![topleft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e756665e-81bf-b74a-cd14-79bb2bce6024.png) ![topright.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6c760ae5-9ffe-38d8-105c-a547fa0892a0.png) ![bottomleft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/63927b89-421d-7425-f8e2-4b7de96a00d0.png) ![bottomright.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/03a53d36-e80d-eb63-16b4-b60234a01b84.png) 
![lefttrirdtop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/90a5035b-5d63-f309-76c4-35b060c2ddd4.png) ![lefttrirdbottom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/3b6ef4a7-df2e-d10c-bfc9-1448235baedf.png) ![centertrirdtop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/87fb2075-9597-732b-d7fc-c9d068c96220.png) ![centertrirdbottom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/cdad3115-9e7b-b938-f20d-3f4b0dfed9d6.png) ![righttrirdtop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0bc69e02-4b8d-75a2-1a31-cc535c47bb8c.png) ![righttrirdbottom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/05a67d54-3e78-e847-c42e-07e8e9131152.png) 
![Lefttrird.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/254fa065-9619-d5cf-7139-98e0a5d43294.png) ![centertrird.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/cc1e3a25-74f4-4f5f-ed55-83b545d99b15.png) ![righttrird.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/dac8fb25-9d81-f352-1041-73f41cfa1016.png) 
![center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/3a15e7f4-476c-6e49-ff81-d061356ceae7.png) ![togglezoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/25308c1f-a85c-8f30-5644-4bf57b5da5e4.png) ![maximize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7b15c640-0047-f159-4a13-b05ff088e98e.png) ![togglefullscreen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b8e70135-41d6-6240-68c8-fa4d316649a9.png)
![increase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a937384a-bf9e-7d3c-819b-3cad3532dc5a.png) ![reduce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/81c89ee8-a8a3-c32f-f906-7f7834d72acf.png) 

「もっとよいアイコンがあるよ」という方がいらしたらイメージファイルを共有してください。



# コンパイルエラーが出る

自分の今回の環境は、Intel Mac / macOS 11.6.1 (20G224) / Xcode 13.1 (13A1030d) / Swift 5.5.1 ですが、ShiftItのプロジェクトは数年前の古いXcodeのバージョンです。Xcodeで開くと古いプロジェクトをマイグレーションしてくれますが、下記の1箇所だけコンパイルエラーが残ります。

```swift:FMTHotKeyManager.m
objc_msgSend([hotKeyReg provider], [hotKeyReg handler], [hotKeyReg userData]);  
==> Too many arguments to function call, expected 0, have 3
```

どうやら現在の<b>[objc_msgSend](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)</b>には引数が無いことが原因です。ここで行き詰まったのですが、[「こちらの記事」](https://qiita.com/hotpepsi/items/50e9da1e309f0d7b9670)に解決策がありました。

`Build Settings`の`Enable Strict Checking of objc_msgSend Calls`の値を<b><font color=red>No</font></b>に変更することでコンパイルが通り無事にビルドすることができます。ワーニングは多数出たままですが動作します。
![objc_msgSend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6f32a88b-4cbb-9e00-9697-bbbcc92da098.png)



# おわりに

ShiftItはメニューバーにShiftItアイコンを表示しないオプションがあるぐらいなので、ショートカットキーによりウィンドウ配置を指示するのが普通で、メニュー項目にアイコンなど不要という考えなんでしょうかね。しかし、メニューから選択する使い方もあるので、最初からアイコンがあってもいいと思うのですがどうでしょうか。
でも、まあ、よく使う配置はショートカットキーを覚えるでしょうけど。


ちなみに、`Toggle Zoom`と`Toggle Full Screen`が同じ動作に思えます。OSのバージョンが上がって動作が同じになったのでしょうか？ 元の機能がよく分かっていないので、勘違いかも知れません。


今回の記事は<b>以上</b>です。何かの参考になれば幸いです。

### 追伸

メニューが日本語ローカライズされていませんでした。リソースがターゲットから外れていたことが原因でした。

<hr>

なお、個人的には、

$左\frac{2}{3}$と$右\frac{2}{3}$の配置パターンも欲しいので、次はこれを追加しようと思います。