はじめてのSIMBLプラグインを書こうと思ったけど、Dockの気持ちがわからなくて退散

Snow Leopard でも SIMBL が動くというので、かねてより書きたかったプラグインを作ろうと思って見ていた。

やりたいことは、マウスが画面の端に来たときに Dock が一々現れてきてウザイので、「一番端でクリックしたとき」または「ドラッグしながら一番端に動いたとき」のみ Dock を出現させること。

(ちなみに僕は Objective-C は構文ぐらいしか知りません)


SIMBL の公式はここらへん。


調べてみると、どうやら SIMBL プラグインを書くにあたっては、宿主のアプリのバイナリを覗いてフックしたいクラスを調べ、IMP、フォワーディング、ポージングなどという手法を使ってメソッドを乗っ取るのが基本らしい。

で、肝心のバイナリを調べるのに使うのが class-dump というコマンドラインプログラムらしい。


今回僕がフックしたいアプリは Dock.app なので、とりあえず class-dump で見てみることにした。

% class-dump /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock                                                  
/*
 *     Generated by class-dump 3.3 (64 bit).
 *
 *     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2009 by Steve Nygard.
 */

#pragma mark -

/*
 * File: /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock
 * Arch: Intel x86-64 (x86_64)
 *
 *       Objective-C Garbage Collection: Unsupported
 *       This file has protected segments that can't be decrypted:
 *           Load command 1, segment encryption: Protected Segment Type 2 (10.6)
 */

あれ? これはもしかして、お手上げ状態? MacPorts 版の class-dump 3.2 を使うと大量にエラーが出るし、class-dump-x だと

2009-09-09 00:31:48.912 class-dump-x[3591:903] We don't support 64-bit Mach-O files.

とか言われる。

何か良い手はないんだろうか。


ここらへんのソースコードも参考にさせてもらっている。