この喜びと馬鹿馬鹿しさを記念に記す。
この一週間ずーっと悩んでいた事が、X を使って Squeak から他のアプリにドロップ出来ないという事だった。まずは C の小さなプログラムを作って動作確認を行うんだけど、それがさっぱり動かない。いや、Squeak にドロップする事だけは出来る(なぜならそこは私が作ったから)。しかし、ほかのアプリに全くドロップ出来ない。
これは困った。そして悪い事に、参考になるプログラムが全く無い。と言うのも今私が使ってる Fedora Core 6 でドラッグアンドドロップが出来るプログラムは全部 Gtk で出来ているからだ。Gtk は、X の標準ドラッグプロトコルである Xdnd に一皮被せて簡単な API を提供しているが、Squeak では Gtk を使ってないので参考にならない。では Gtk 自体のソースを参考にすれば良いのだが、これがまたこんがらがっていて読めない(ちなみに、Xdnd に依存したコードは gdk/gdkdnd-x11.c にある)。
私は疑心暗鬼になって、きっと Gtk が Xdnd を守ってないのだ!と考えた。
しかし根気良く Gtk を読んでいて、ふとある部分を書き換えるとすんなり動いたのでした。ガク。俺の一週間を返せ!
間違えた一番の理由は、私が Ian さんのコードをコピペしてサンプルコードを書いたからだった。
X では、ClientMessage というイベントを使ってプロセスをまたいだ通信を行う。その window メンバに、通信先のウインドウ ID を入れないと行けなかったのに通信元の ID を入れていたのでした。なぜなら Ian さんのソースにそう書いてあったから!悪い事に、XSendMessage のマニュアルでは window メンバ の使い方はユーザ定義となっていて、何を入れても良い事になっている。そして Xdnd の規格では、window メンバについては触れられていないのだ。多分 ClientMessage 以外のイベントで window というと通信先と決まっているからだと思う。馬鹿!馬鹿!馬鹿!イアンの馬鹿!