OS Xのマウスポインターを半透明にする

マウスポインターは通常、先端にしか当たり判定がないので、多少透過していた方がよいのではないかと考えた。特に僕はポインターを通常より大きくしているので、リンクなどにポインターを乗せると、下の文字が見えなくて困ることがある。

![non-transparent.png](https://qiita-image-store.s3.amazonaws.com/0/10815/fce0794a-2ef6-47d3-b468-5ae447257315.png)

もしポインターが半透明であれば、マウスポインターをこのように巨大なものにしていたとしても下の文字が読めて快適になると考えた。

マウスポインターを半透明にするための全体的な流れは次のようになっている。

1. Mousecapeで、現在のマウスポインターのデータをダンプする
2. Pythonスクリプトでマウスポインターのデータを読み込み、半透明にする
3. Pythonで処理したデータを読み込む
4. Mousecapeをコンピュータの起動時に有効化するため、Helper Toolをインストールする
5. Mousecapeのバグを補うAppleScriptをスタートアップに登録する

# 準備

この記事の内容を実行するにあたり、次のものが必要になる。

- [Mousecape](https://github.com/alexzielenski/Mousecape/releases)
- Python

[Mousecape](https://github.com/alexzielenski/Mousecape/releases)はマウスポインターを簡単に変更するためのツールである。現在の最新版である[0.0.5](https://github.com/alexzielenski/Mousecape/releases/tag/0.0.5)をダウンロードして使うことにする。

ダウンロードしたものを解凍して出てきた _app_ ファイルを開くと次のようなウィンドウが現われる。

![スクリーンショット 2015-03-16 17.08.10.png](https://qiita-image-store.s3.amazonaws.com/0/10815/8b1f5ae4-e4fd-b2a6-7ba0-9b024f21bb33.png)

# 現在のマウスポインターをダンプする

ツールバーの **Capes -> Dump Cusros..** をクリックして、現在の設定をダンプする。完了すると次のようになる。

![スクリーンショット 2015-03-16 17.15.43.png](https://qiita-image-store.s3.amazonaws.com/0/10815/b266e7cb-ae6b-d40e-cd03-c1ac3557754d.png)

この青くなっている部分を右クリックし、 **Show in Finder** を選択すると、ダンプされた _cape_ ファイルがFinderで表示されるので、それをコピーして _cape_ ファイルを入手する。これはテキストエディタで開くなどすると明らかになるが、内部にはマウスポインターの画像をBase64エンコードして格納した巨大なXMLファイルである。

# マウスポインターを半透明にする

先ほど入手した _cape_ ファイルを処理するPythonスクリプトを実行する。ただし、このPythonスクリプトは次のライブラリが必要になる。

- [Pillow](https://pillow.readthedocs.org/)

```console
$ pip install Pillow
```

などとするとインストールできる。

そして、次のスクリプトをどこかに保存する。

```py:convert.py
from base64 import decodestring, encodestring
from xml.etree.ElementTree import ElementTree
import sys
import io
from PIL import Image

inputfile  = sys.argv[1].strip()
outputfile = sys.argv[2].strip()
opacity    = sys.argv[3].strip()

tree = ElementTree()
tree.parse(inputfile)

imagedata = tree.findall("dict/dict/dict/array/data")

for i in imagedata:
    img = decodestring(i.text)
   
    img  = Image.open(io.BytesIO(img))
    img  = img.convert('RGBA')
    data = img.getdata()

    new = []
    for p in data:
        new.append((p[0], p[1], p[2], int(p[3] * opacity)))

    img.putdata(new)
    img.save('temp.png', 'PNG')
    
    result = open('temp.png', 'r')
    base64 = encodestring(result.read())
    result.close()

    i.text = base64

tree.write(outputfile)
```

次のようにして実行する。

```console
$ python convert.py /path/to/dumpfile.cape output.cape 0.5
```

このスクリプトは次のようなコマンドライン引数を取る。

<dl>
  <dt>第一引数</dt>
  <dd>ダンプした<em>cape</em>ファイル</dd>
  <dt>第二引数</dt>
  <dd>出力先のファイルパス</dd>
  <dt>第三引数</dt>
  <dd>透過率（0〜1）</dd>
</dl>

しばらく待つと _output.cape_ といったファイルができる。

# 処理したデータをMousecapeで読み込む

ツールバーの **File -> Import Cape** をクリックし、先ほど生成した _cape_ ファイルを読み込む。次のようになる。

![スクリーンショット 2015-03-16 17.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/10815/f5f3689f-a9dc-763a-7fcd-1522b5f2e115.png)

この時点でダンプしたものは消しても構わない。右クリックして **Remove** で消すことができる。
そして、透過している方を選択し、右クリックして **Apply** で適用する。

# Helper Toolのインストール

コンピュータの起動時にマウスポインターを透過させるために、Helper Toolをインストールする。Mousecapeを起動して、ツールバーから **Mousecape -> Install Helper Tool** でインストールができる。

# Mousecapeのバグとその補完

マウスポインターを大きくしているのだが、再起動するとポインターのサイズが元に戻ってしまった。今からソースコードを解析してバグを発見するのは大変そうだったので、サイズを大きくするAppleScriptを作り、コンピュータへのログイン時にそのスクリプトを起動するようにして回避する。

```applescript:set_cursor_size.scpt
tell application "Mousecape"
	activate
end tell

delay 0.1

tell application "System Events" to tell application process "Mousecape"
	click (menu item 3 of menu 1 of menu bar item 2 of menu bar 1)
	set theSlider to slider 1 of window 1
	set value of theSlider to 3.0
end tell

quit application "Mousecape"
```

`3.0`の部分を好きな数字に書き換えれば、大きさを変更できる。
このコードをスクリプトエディタへ貼り付けて、ツールバーから **ファイル -> 書き出す** でアプリケーションとして書き出して適当な場所に保存する。
実行すると、Yosemiteでは次のように権限を要求される。

![スクリーンショット 2015-03-16 17.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/10815/ed7c9586-3b7e-a5ef-736b-25d4c574efbc.png)

システムの環境設定を開き、権限を与える。

![スクリーンショット 2015-03-16 17.56.55.png](https://qiita-image-store.s3.amazonaws.com/0/10815/518ddc73-5890-0ad6-6d71-001e46210d9a.png)

そして、このアプリケーションが起動時に実行されるように、 **システム環境設定 -> ユーザとグループ -> ログイン項目** を選び、アプリケーションを登録する。

![スクリーンショット 2015-03-16 18.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/10815/325acfb3-bd24-5e9f-2369-4bf592169ed7.png)

# まとめ

これでマウスポインターを半透明にすることができると思う。まだYosemiteでしか試していないので、もしかしたら他のバージョンでは上手くいかないかもしれない。

![semi-transparent.png](https://qiita-image-store.s3.amazonaws.com/0/10815/7c3f2a3f-e79d-484e-0859-ed171b4b2c6d.png)