[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:1140]Problem in IME Control on moving focus between frames.



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