Avoiding keyboard flickering when focus out,reset and commit string 44/17544/1
authorHaifeng Deng <haifeng.deng@samsung.com>
Wed, 4 Sep 2013 09:12:14 +0000 (17:12 +0800)
committerJihoon Kim <jihoon48.kim@samsung.com>
Fri, 7 Mar 2014 02:27:22 +0000 (11:27 +0900)
Change-Id: I40022521efdc8e7f1743aae25a522e159a03edae

ism/extras/efl_immodule/isf_imf_context.cpp
ism/extras/gtk2_immodule/gtkimcontextscim.cpp

index 0fd5773..96e2dfd 100644 (file)
@@ -177,6 +177,7 @@ static void     initialize_modifier_bits                (Display *display);
 static unsigned int scim_x11_keymask_scim_to_x11        (Display *display, uint16 scimkeymask);
 static XKeyEvent createKeyEvent                         (bool press, int keycode, int modifiers, bool fake);
 static void     send_x_key_event                        (const KeyEvent &key, bool fake);
+static void     _hide_preedit_string                    (int context, bool update_preedit);
 
 static void     attach_instance                         (const IMEngineInstancePointer &si);
 
@@ -1338,7 +1339,7 @@ isf_imf_context_focus_out (Ecore_IMF_Context *ctx)
             ecore_imf_context_input_panel_hide (ctx);
 
         if (context_scim->impl->need_commit_preedit) {
-            panel_slot_hide_preedit_string (context_scim->id);
+            _hide_preedit_string (context_scim->id, false);
 
             if (wstr.length ()) {
                 ecore_imf_context_commit_event_add (context_scim->ctx, utf8_wcstombs (wstr).c_str ());
@@ -1389,7 +1390,7 @@ isf_imf_context_reset (Ecore_IMF_Context *ctx)
         _panel_client.send ();
 
         if (context_scim->impl->need_commit_preedit) {
-            panel_slot_hide_preedit_string (context_scim->id);
+            _hide_preedit_string (context_scim->id, false);
 
             if (wstr.length ()) {
                 ecore_imf_context_commit_event_add (context_scim->ctx, utf8_wcstombs (wstr).c_str ());
@@ -2194,7 +2195,7 @@ panel_slot_commit_string (int context, const WideString &wstr)
             autoperiod_insert (ic->ctx);
 
         if (ic->impl->need_commit_preedit)
-            panel_slot_hide_preedit_string (ic->id);
+            _hide_preedit_string (ic->id, false);
         ecore_imf_context_commit_event_add (ic->ctx, utf8_wcstombs (wstr).c_str ());
         ecore_imf_context_event_callback_call (ic->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs (wstr).c_str ());
     }
@@ -2263,7 +2264,7 @@ panel_slot_reset_keyboard_ise (int context)
     if (ic && ic->impl) {
         WideString wstr = ic->impl->preedit_string;
         if (ic->impl->need_commit_preedit) {
-            panel_slot_hide_preedit_string (ic->id);
+            _hide_preedit_string (ic->id, false);
 
             if (wstr.length ()) {
                 ecore_imf_context_commit_event_add (ic->ctx, utf8_wcstombs (wstr).c_str ());
@@ -2311,7 +2312,7 @@ panel_slot_show_preedit_string (int context)
 }
 
 static void
-panel_slot_hide_preedit_string (int context)
+_hide_preedit_string (int context, bool update_preedit)
 {
     SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
 
@@ -2329,7 +2330,7 @@ panel_slot_hide_preedit_string (int context)
             emit = true;
         }
         if (ic->impl->use_preedit) {
-            if (emit) {
+            if (update_preedit && emit) {
                 ecore_imf_context_preedit_changed_event_add (ic->ctx);
                 ecore_imf_context_event_callback_call (ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
             }
@@ -2348,6 +2349,14 @@ panel_slot_hide_preedit_string (int context)
 }
 
 static void
+panel_slot_hide_preedit_string (int context)
+{
+    SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+    _hide_preedit_string (context, true);
+}
+
+static void
 panel_slot_update_preedit_string (int context,
                                   const WideString    &str,
                                   const AttributeList &attrs,
index f85bcc5..06ccf47 100644 (file)
@@ -253,6 +253,8 @@ static void     open_specific_factory                   (GtkIMContextSCIM
                                                          const String           &uuid);
 
 static void     attach_instance                         (const IMEngineInstancePointer &si);
+static void     _hide_preedit_string                    (int                     context,
+                                                         bool                    update_preedit);
 
 /* slot functions */
 static void     slot_show_preedit_string                (IMEngineInstanceBase   *si);
@@ -843,7 +845,7 @@ gtk_im_context_scim_reset (GtkIMContext *context)
 
         if (context_scim->impl->need_commit_preedit)
         {
-            panel_slot_hide_preedit_string (context_scim->id);
+            _hide_preedit_string (context_scim->id, false);
 
             if (wstr.length ())
                 g_signal_emit_by_name (context_scim, "commit", utf8_wcstombs (wstr).c_str ());
@@ -1018,7 +1020,7 @@ gtk_im_context_scim_focus_out (GtkIMContext *context)
         //sehwan added
         if (context_scim->impl->need_commit_preedit)
         {
-            panel_slot_hide_preedit_string (context_scim->id);
+            _hide_preedit_string (context_scim->id, false);
 
             if (wstr.length ())
                 g_signal_emit_by_name (context_scim, "commit", utf8_wcstombs (wstr).c_str ());
@@ -1548,7 +1550,7 @@ panel_slot_reset_keyboard_ise (int context)
         WideString wstr = ic->impl->preedit_string;
         if (ic->impl->need_commit_preedit)
         {
-            panel_slot_hide_preedit_string (ic->id);
+            _hide_preedit_string (ic->id, false);
 
             if (wstr.length ())
                 g_signal_emit_by_name (ic, "commit", utf8_wcstombs (wstr).c_str ());
@@ -1585,7 +1587,7 @@ panel_slot_show_preedit_string (int context)
 }
 
 static void
-panel_slot_hide_preedit_string (int context)
+_hide_preedit_string (int context, bool update_preedit)
 {
     GtkIMContextSCIM *ic = find_ic (context);
     SCIM_DEBUG_FRONTEND(1) << "panel_slot_hide_preedit_string context=" << context << "\n";
@@ -1603,7 +1605,7 @@ panel_slot_hide_preedit_string (int context)
             emit = true;
         }
         if (ic->impl->use_preedit) {
-            if (emit) g_signal_emit_by_name (ic, "preedit-changed");
+            if (update_preedit && emit) g_signal_emit_by_name (ic, "preedit-changed");
             if (ic->impl->preedit_started) {
                 g_signal_emit_by_name (ic, "preedit-end");
                 ic->impl->preedit_started     = false;
@@ -1614,6 +1616,12 @@ panel_slot_hide_preedit_string (int context)
 }
 
 static void
+panel_slot_hide_preedit_string (int context)
+{
+    _hide_preedit_string (context, true);
+}
+
+static void
 panel_slot_update_preedit_string (int context,
                                   const WideString    &str,
                                   const AttributeList &attrs,