MacOSX で w3mimgdisplay

w3m が画像表示してくれないと死んでしまうので、風邪で死にながら作りました。

http://shinh.skr.jp/koneta/w3mimg_cocoa.tgz

スクリーンショット

http://shinh.skr.jp/koneta/w3mimg.png

んーと透明の Window を端末のピッタリ上にはるって設計なので、画像出てる時に screen 切り替わったり他の Window がかぶってたりすると嬉しくないことになるけど、まーそのへんは適当に。そもそも screen 動いてるとちょっとズレるけどまーそのへん細かいことは気にしない子なので大丈夫。むしろ screen 切り替えた時のフックとして現在の Window を上に上げる、っていうようなコマンド書いてやるといいかな(TODO)。

そういや画像ファイル読んだ時の NSImage は 24bpp か 32bpp になってると仮定してるのはマズそうだけどまぁ動いてるぽいので良し。なんかたまにおかしい画像見かけるような気もするけど大勢に影響無いしいいです。誰かきちんと仕上げてください。てか本家に入れてもらうようにすべきなのかなー。

あと現在の Window 位置を取得するのに CoreGraphics の隠し API 使ってるので、そのへんで互換性に難がある可能性高いです。そもそも CGSGetOnScreenWindowList でフォーカス順に帰ってくるって気付いたからそれ利用してるけど、 undocumented なだけにそれ頼ったらあかんやろと。もっといい方法あったらいいんだけど。 Apple 的には Accessibility API 使えって話らしいです。

なんかさっそく G4 iBook でうまいこと動いてないぽい話を聞きました。まぁとりあえず自分とこで動けばいいけど。

Core Graphics Services について

そのへんの API については隠しつーだけあって解析してる人もいる、って程度みたいだけど、私はこのへんとか参考にしつつ。

http://dev.lipidity.com/wp-content/uploads/2006/11/coregraphicsservices.h

API 一覧は nm でサックリ取れる。

nm /System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/CoreGraphics

CGSGetWindowProperty とかに渡す文字列定数とかは strings とかでそれなりにわかった気がする。あとは otool -tv よりもうちょいいい逆アセンブラがあるといいんだけど。

んで CGS ってのは何かっていうと(出てくるの遅いな)よくわからんけど、 Window Manager を作るための機構ですね。 API 見てる限りでは、 X なんかよりはるかにやりやすそうです。

例えば仮想デスクトップなんつーのは X だと普通全 Window に対して見せるか見せないかを把握しておいて…とかするわけですが、なんか CGS は自前で workspace って概念を持っているみたい。それどころかたぶん、仮想デスクトップ切り替え時のエフェクトとかも既に実装されてて、 VirtueDesktop の切り替え時のかっこいいエフェクトはなんかそれ使ってるだけみたいだなーと。ソース斜め読みした感じだけど。

こんなとこばっか眺めてる理由ってのはつまり sevilwm のウィンドウスイッチングが無いと俺は死ぬ明日死ぬって感じなので作りたいなぁということですはい。っていうか MacOSX の Alt+Tab ありえんですね。あと Expose が便利とか言ってる人がやはり信じられません。

あとまーまくぶく買って 5 日とかの子が書いてる戯言なので全然間違っててたり常識だったりしても知ったことじゃないという感じで。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h