[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:1140]Problem in IME Control on moving focus between frames.
- X-ml-count: 1140
- Subject: [MD:1140]Problem in IME Control on moving focus between frames.
- From: Miyashita Hisashi(宮下 尚:HIMI) <himi@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: 28 Apr 1999 12:07:23 +0900
- User-agent: T-gnus/6.10.058 (based on Pterodactyl Gnus v0.76) SEMI/1.13.3 (Komaiko) FLIM/1.12.6 (Family-Kōenmae) Emacs/20.3.8 (i386-*-nt4.0) MULE/4.0 (HANANOEN) Meadow/1.04 Alpha1 (TSUTSUJI)
kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI) writes:
> At Tue, 27 Apr 1999 22:57:14 +0900 (JST), kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI) wrote in <19990427225714I.kyota@xxxxxxxxxxxxx>
> > IMEの状態が違う別のフレームからフォーカスが移って来た時に元のフ
> > レームのIMEの状態を引きずってしまって, その後は変換ウインドウでな
> > いところにに1文字でも入力されれば正しい状態に戻るという現象が起き
> > ています.
うーんとですね。これは、IMMのContext切り替えを適切に行わないと
どうしても正確には対処できない問題です。
すなわち、IMM APIを使用する必要があります。
## で、それなりにほうっていたというのが真相だったりして。^^;;;;
> フレーム切り替えの際にフレームの selected_window を
> select-window してやることでフレーム切り替えの際にIMEを正しく切り
> 替えることができるようになります.
>
> 以下変更箇所を示します.
>
> src/mw32term.c:
> void
> w32_new_focus_frame (frame)
> struct frame *frame;
> {
> struct frame *old_focus = w32_focus_frame;
> ....
> pending_autoraise_frame = w32_focus_frame;
> else
> pending_autoraise_frame = 0;
> +
> + if(frame)
> + Fselect_window(FRAME_SELECTED_WINDOW (frame));
> }
>
> W32frame_rehighlight (frame);
> }
で、これは、かなりAd-hocな解です。この時点でFselect_windowを呼ぶのは
少々危ういものがあります。(xterm.cでも消されてますなぁ。)
このあと、select-window-functions(Meadowだけのhook :-P)を経由し、
Emacs Lisp Functionが起動されます。そのため、IMEの切り替え部分が
経由されるわけです。
現状のX Window System/Windowsでの実装は、Frameの切り替えだけを覚えておき、
次のイベントで、Qswitch_frameを発生させます。したがって、Emacsに
とっては、次のイベントがくるまで、Frameの切り替えは起きない事
になります。したがって、Fselect_windowも、その時点まで呼ばれない。
で、むかし、私は、擬似的なEvent, WM_EMACS_ACTIVATEを用意して、Emacsに
Eventを送出するコードをいれてあり、今でも、その部分にはコードがあります。
Qswitch_frameをここで送出するというのも一つの手です。
まあ、私は、その前にIMM APIを片づけないと根本的に問題が解決しないと
わかっていましたから、現状のコードのままなのです。^^;;;;
from himi