2006年01月18日

skkinput

徹底本への質問メールを期に。

OpenOffice.orgやmlterm、あるいは一般的なGTK+2アプリケーションをGNOME上で使っており、これにskkinputで入力している場合、OvertheSpotやOntheSpotで変換時に表示されるポップアップウィンドウが後ろに隠れてしまうという問題がある。ちなみにkinput2ではちゃんと最上段に表示される。

IMmoduleなuimやscimを使うというのもまぁ解決の1つなのだが、kinput2でできてskkinputにできないというのはちょっと妙ではある。ということで、tagohさんに最上段に表示するにあたってのアドバイスを頂き、昨日ハックしてみた。

deb http://kmuto.jp/debian/mtu debian_dic main
deb-src http://kmuto.jp/debian/mtu debian_dic main

解法はわりあい簡潔で、要は_NET_WM_STATE_ABOVEにしてやれば最上段にウィンドウがやってくる。

Atom net_wm_state = XInternAtom(XtDisplay(gw), "_NET_WM_STATE", False);
Atom state_above = XInternAtom(XtDisplay(gw), "_NET_WM_STATE_ABOVE", False);
Atom prop[1];
prop[0] = state_above;
XChangeProperty(dpy, win, net_wm_state, XA_ATOM, 32, PropModeReplace, (unsigned char*)prop, 1);

ただ、skkinputのウィンドウ作成箇所はけっこう入り組んでいて、Spotごとにコード分かれてる(デフォルトはOnなのだがmltermではOver)し、デバッガがなぜか落ちちゃうので思わぬ苦戦。fprintfでひたすら当たりをつけていく。Raise&updateしているところでコードをうまく入れてやることで、なんとか希望の動作になった。XChangePropertyの2つめの引数もちょっとトラップが存在。詳しくはdiff.gzにて。