[Anthy-dev 2742] Re: uim-gtk

Back to archive index

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);
 


Anthy-dev メーリングリストの案内
Back to archive index