Masanari Yamamoto
h0131****@ice*****
2005年 12月 20日 (火) 23:51:44 JST
On Tue, Dec 20, 2005 at 11:44:49PM +0900, Etsushi Kato wrote: > こんばんは。 > > On Tue, Dec 20, 2005 at 07:50:37PM +0900, > Masanari Yamamoto <h0131****@ice*****> wrote: > > > anthy-use-with-vi?を#tにしていると、gvimでundoがおかしくなるという問題 > > があります。 > > > > vimのソースを読むと、xim_has_preeditingがTRUEのときundoするといけない > > ようです。xim_has_preeditingがFALSEになる条件は、preedit_endが一回、ま > > たは、プリエディットの長さが0の状態でpreedit_changedが二回発生すること > > です。 > > > > r2658でESCを押したときにもim-update-preeditを呼んで、preedit_changedを > > 発生させるようにしました。 > > r2658の変更なしでも、preedit_endを発生させるようにすれば解決できます。 > > なるほど。解説ありがとうございます。こちらでも vim のコードみてみ > ましたが、よく理解できました。 > > では、r2658 については uim-skk と同様に、必要な場合のみ、preedit > update させるようにして、普通の commit-raw では、preedit update > しないようにして変更してもいいでしょうか? なるべく無駄は省きたい > と思います。 r2658をrevertしてpreedit_startとpreedit_endを発生させるという手もある のですが、この方法も何か問題があるのでしょうか。パッチを添付します。 -- 山本将也 -------------- next part -------------- Index: gtk-im-uim.c =================================================================== --- gtk-im-uim.c (revision 2658) +++ gtk-im-uim.c (working copy) @@ -81,6 +81,7 @@ gboolean cwin_is_active; int nr_psegs; struct preedit_segment *pseg; + int mode; GtkWidget *menu; GdkWindow *win; @@ -744,6 +745,19 @@ } static void +mode_update_cb(void *ptr, int mode) +{ + IMUIMContext *uic = (IMUIMContext *)ptr; + + if (mode == 0 && uic->mode != 0) { + g_signal_emit_by_name(uic, "preedit_end"); + } else if (mode != 0 && uic->mode == 0) { + g_signal_emit_by_name(uic, "preedit_start"); + } + uic->mode = mode; +} + +static void im_uim_send_im_list(void) { int nr, i; @@ -957,6 +971,7 @@ uim_set_preedit_cb(uic->uc, clear_cb, pushback_cb, update_cb); uim_set_prop_list_update_cb(uic->uc, update_prop_list_cb); uim_set_prop_label_update_cb(uic->uc, update_prop_label_cb); + uim_set_mode_cb(uic->uc, mode_update_cb); uim_set_candidate_selector_cb(uic->uc, cand_activate_cb, cand_select_cb, cand_shift_page_cb, cand_deactivate_cb);