マウスポインターは通常、先端にしか当たり判定がないので、多少透過していた方がよいのではないかと考えた。特に僕はポインターを通常より大きくしているので、リンクなどにポインターを乗せると、下の文字が見えなくて困ることがある。
もしポインターが半透明であれば、マウスポインターをこのように巨大なものにしていたとしても下の文字が読めて快適になると考えた。
マウスポインターを半透明にするための全体的な流れは次のようになっている。
- Mousecapeで、現在のマウスポインターのデータをダンプする
- Pythonスクリプトでマウスポインターのデータを読み込み、半透明にする
- Pythonで処理したデータを読み込む
- Mousecapeをコンピュータの起動時に有効化するため、Helper Toolをインストールする
- Mousecapeのバグを補うAppleScriptをスタートアップに登録する
準備
この記事の内容を実行するにあたり、次のものが必要になる。
- Mousecape
- Python
Mousecapeはマウスポインターを簡単に変更するためのツールである。現在の最新版である0.0.5をダウンロードして使うことにする。
ダウンロードしたものを解凍して出てきた app ファイルを開くと次のようなウィンドウが現われる。
現在のマウスポインターをダンプする
ツールバーの Capes -> Dump Cusros.. をクリックして、現在の設定をダンプする。完了すると次のようになる。
この青くなっている部分を右クリックし、 Show in Finder を選択すると、ダンプされた cape ファイルがFinderで表示されるので、それをコピーして cape ファイルを入手する。これはテキストエディタで開くなどすると明らかになるが、内部にはマウスポインターの画像をBase64エンコードして格納した巨大なXMLファイルである。
マウスポインターを半透明にする
先ほど入手した cape ファイルを処理するPythonスクリプトを実行する。ただし、このPythonスクリプトは次のライブラリが必要になる。
$ pip install Pillow
などとするとインストールできる。
そして、次のスクリプトをどこかに保存する。
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)
次のようにして実行する。
$ python convert.py /path/to/dumpfile.cape output.cape 0.5
このスクリプトは次のようなコマンドライン引数を取る。
- 第一引数
- ダンプしたcapeファイル
- 第二引数
- 出力先のファイルパス
- 第三引数
- 透過率(0〜1)
しばらく待つと output.cape といったファイルができる。
処理したデータをMousecapeで読み込む
ツールバーの File -> Import Cape をクリックし、先ほど生成した cape ファイルを読み込む。次のようになる。
この時点でダンプしたものは消しても構わない。右クリックして Remove で消すことができる。
そして、透過している方を選択し、右クリックして Apply で適用する。
Helper Toolのインストール
コンピュータの起動時にマウスポインターを透過させるために、Helper Toolをインストールする。Mousecapeを起動して、ツールバーから Mousecape -> Install Helper Tool でインストールができる。
Mousecapeのバグとその補完
マウスポインターを大きくしているのだが、再起動するとポインターのサイズが元に戻ってしまった。今からソースコードを解析してバグを発見するのは大変そうだったので、サイズを大きくするAppleScriptを作り、コンピュータへのログイン時にそのスクリプトを起動するようにして回避する。
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では次のように権限を要求される。
システムの環境設定を開き、権限を与える。
そして、このアプリケーションが起動時に実行されるように、 システム環境設定 -> ユーザとグループ -> ログイン項目 を選び、アプリケーションを登録する。
まとめ
これでマウスポインターを半透明にすることができると思う。まだYosemiteでしか試していないので、もしかしたら他のバージョンでは上手くいかないかもしれない。