Revision: 6811
Author: ek.kato
Date: Thu Nov 11 04:49:20 2010
Log: - Commit remaining input before deactivating uim-chewing (#31545,
  Kan-Ru Chen)

* scm/chewing.scm
  - (chewing-press-key-handler) : Commit remaining input upon
    chewing-off-key?
* src/chewing.c
  - (chewing_context) : Add has_pending_input member.
  - (chewing_context_new) : Init has_pending_input.
  - (press_key_internal) : Set has_pending_input when key press is
    handled.
  - (flush) : New.  Commit remaining input if has_pending_input is
    set.
  - (uim_plugin_instance_init) : Export chewing-lib-flush for
    scheme side.

http://code.google.com/p/uim/source/detail?r=6811

Modified:
 /uim-chewing-trunk/scm/chewing.scm
 /uim-chewing-trunk/src/chewing.c

=======================================
--- /uim-chewing-trunk/scm/chewing.scm  Wed Jan 14 21:38:12 2009
+++ /uim-chewing-trunk/scm/chewing.scm  Thu Nov 11 04:49:20 2010
@@ -256,7 +256,8 @@
        (if (chewing-press-key mc key key-state #t)
            #f
            (if (chewing-off-key? key key-state)
-               (begin
+               (let ((mid (chewing-context-mc-id mc)))
+                 (chewing-lib-flush mid)
                  (chewing-reset-handler mc)
                  (im-clear-preedit mc)
                  (im-deactivate-candidate-selector mc)
=======================================
--- /uim-chewing-trunk/src/chewing.c    Thu Jan  8 17:56:26 2009
+++ /uim-chewing-trunk/src/chewing.c    Thu Nov 11 04:49:20 2010
@@ -70,6 +70,7 @@
   int prev_page;
   int prev_cursor;
   int has_active_candwin;
+  int has_pending_input;
 } uim_chewing_context;

 static struct context {
@@ -184,6 +185,7 @@
     ucc->prev_page = -1;
     ucc->prev_cursor = -1;
     ucc->has_active_candwin = 0;
+    ucc->has_pending_input = 0;
   }

   return ucc;
@@ -550,6 +552,7 @@
   } else {
       return uim_scm_f();
   }
+  ucc->has_pending_input = 1;

   return check_output(ucc);
 }
@@ -653,6 +656,27 @@

   return uim_scm_f();
 }
+
+static uim_lisp
+flush(uim_lisp id_)
+{
+  int id;
+  uim_chewing_context *ucc;
+
+  id = uim_scm_c_int(id_);
+  ucc = get_chewing_context(id);
+
+  if (!ucc)
+    return uim_scm_f();
+
+  if (ucc->has_pending_input) {
+      chewing_handle_Enter(ucc->cc);
+      check_output(ucc);
+      ucc->has_pending_input = 0;
+  }
+
+  return uim_scm_t();
+}

 static uim_lisp
 get_nr_candidates(uim_lisp id_)
@@ -843,6 +867,7 @@
   uim_scm_init_subr_1("chewing-lib-reset-context", reset_context);
   uim_scm_init_subr_1("chewing-lib-focus-in-context", focus_in_context);
   uim_scm_init_subr_1("chewing-lib-focus-out-context", focus_out_context);
+  uim_scm_init_subr_1("chewing-lib-flush", flush);
   uim_scm_init_subr_1("chewing-lib-get-nr-candidates", get_nr_candidates);
   uim_scm_init_subr_2("chewing-lib-get-nth-candidate", get_nth_candidate);
   uim_scm_init_subr_1("chewing-lib-get-nr-candidates-per-page",

Reply via email to