«前の日記(2008-06-12 [木]) 最新 次の日記(2008-06-25 [水])» 編集
RSS: href="http://endoh-namazu.tierra.ne.jp/diary/index.rdf"


半期 四半期 全カテゴリ

新・なまず日記


2008-06-13 [金]

_ [デスクトップ][カスタマイズ][xfumble] xfumble - ウイジェット ディープ インサイド



相変わらずバラックコードのままのxfumbleだが、既にオイラにとって必須のツールになりつつある。

xfumbleを、デバッグログを常に吐かせつつ常駐させ、web閲覧をしたり、メールを書いたりする。不具合がおこったらすぐログ解析をやって問題を特定し、直ったらまた常駐させる。

おかげで、基本的なキーイベントとマウスイベントのフェイクについては、かなり完成度が上がった。

xfumbleのキモは、「現在使用中のウインドウに合わせて動的にキーバインドを変更する」ってことなんだけど、もちろん、この機能についても極めてうまくいってる。現在これを書いているのはemacsの上だけど、emacsと他のアプリ、例えばfirefoxで、キーバインドをクルクル切り替えている。この機能のおかげで、「どんなアプリでもemacs的なキーバインド」が実現できるってわけ。.emacsには、なんの変更を加えること無く。

そうなってくると、もう1歩先に進みたくなる。つまり、単にfirefoxってだけじゃなくて、現在入力を行っているのが、firefoxの中の検索バーなのか、アドレスバーなのかってことを見分けて、それによってキーバインドを変える、そういうことをしたいわけです。

検索バーやらアドレスバーやらってのは、X Windowではウイジェットっていいますな。MS Windowsではコントロールっていったけど、名前が違うだけで、概念はまったく同じ。で、現在入力中のウイジェットを特定すること。それが現在のミッション。

MS Windowsの場合は、コントロールにはクラス名ってのがついていて、簡単に見分けることができたんで、Xのウイジェットの場合も楽勝だろう、と、たかをくくってたんだが、じつはこいつは結構ハードだ。

Xのウインドウは、Xサーバにユーザ定義のプロパティを持てるから(ウインドウ名などはまさにこれで取得できる)、ウイジェットもクラス名みたいなもんがプロパティとして入ってるんじゃないかと調べてみたが、まるっきりダメ。

しかたがないので、Xのウイジェットシステムで代表的なものの一つ、GTK+2についての解析を始めた。なにしろ、ソースは見放題だもん。ruby-gtk、gtk2、glibと順番にソースをダウンロードして、上から下に降りていく...


ふー、今朝は4:00起きでがんばったんだが、イージーな方法じゃだめだってことはほぼ明確になった。GTK+2にはlabelってプロパティがあって、それで、ウイジェットを生成したアプリの中ではまったくイージーに当該ウイジェットが特定できるんだが、labelは、一番底の、glibライブラリの中の単なるデータで実現されている(g_object_new→g_object_new_valist:gobjet.c)。Xサーバを介していないので、他のプロセス(例えばxfumble)から盗み読みをするのは無理のようだ。


気分を変えて、別のやり方を考えますかね。
朝日がまぶしい。いい気分だ!
[]