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

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



ほりぐちです. だめか..

At 28 Apr 1999 12:07:23 +0900, Miyashita Hisashi(宮下 尚:HIMI) <himi@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in <uhfq1v3x0.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
> kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI) writes:
> 
> > At Tue, 27 Apr 1999 22:57:14 +0900 (JST), kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI) wrote in <19990427225714I.kyota@xxxxxxxxxxxxx>
> うーんとですね。これは、IMMのContext切り替えを適切に行わないと
> どうしても正確には対処できない問題です。
> すなわち、IMM APIを使用する必要があります。
> 
> ## で、それなりにほうっていたというのが真相だったりして。^^;;;;
> >  w32_new_focus_frame (frame)
...
> > +
> > +      if(frame)
> > +	Fselect_window(FRAME_SELECTED_WINDOW (frame));
> >  }
> 
> で、これは、かなりAd-hocな解です。この時点でFselect_windowを呼ぶのは
> 少々危ういものがあります。(xterm.cでも消されてますなぁ。)

 をを, なんと. たしかに同じようなものが #if 0 されてますね.

> このあと、select-window-functions(Meadowだけのhook :-P)を経由し、
> Emacs Lisp Functionが起動されます。そのため、IMEの切り替え部分が
> 経由されるわけです。

 ええ, そのあたりを通過するのを確認して「まえになんか WndProc 方
面からの elisp 関数の呼び出しはいかんと聞いた覚えがあるな」などと
思いつつ(^^;)出してみましたがやはりダメですか:-p

# というかまたちょっと上を見たらちゃんと書いてありますね^^;;

> 現状のX Window System/Windowsでの実装は、Frameの切り替えだけを覚えておき、
> 次のイベントで、Qswitch_frameを発生させます。したがって、Emacsに
> とっては、次のイベントがくるまで、Frameの切り替えは起きない事
> になります。したがって、Fselect_windowも、その時点まで呼ばれない。
> 
> で、むかし、私は、擬似的なEvent, WM_EMACS_ACTIVATEを用意して、Emacsに
> Eventを送出するコードをいれてあり、今でも、その部分にはコードがあります。
> 
> Qswitch_frameをここで送出するというのも一つの手です。

 偶然見つけたのですが, lread.c の 453行目からこんなことが書いてあ
ります.

|  /* switch-frame events are put off until after the next ASCII
|     character.  This is better than signaling an error just because

 というわけで Qswitch_frame では現状と同じ動きになりそうですね.

 ちなみに以前わたしが提示した方法は frame にIMEの status を記録す
るメンバを追加して, フレーム切り替えのときにそれを使って 
w32_set_ime_status() すると言うものでした. これもまたあどほっくで
はありますがこの方が今回の方法よりもまだましということですか.

> まあ、私は、その前にIMM APIを片づけないと根本的に問題が解決しないと
> わかっていましたから、現状のコードのままなのです。^^;;;;

 了解です. とりあえず問題点と, この解決法はダメで根治は IMM API 
待ちだよというのをまとめて Meadow.plan 送りにすればいいのでしょう
か.

--
堀口恭太郎