026c9d
From e995acb046c9e6bd3ee48cb0cf1ccf9d754546e7 Mon Sep 17 00:00:00 2001
026c9d
From: Daiki Ueno <ueno@unixuser.org>
026c9d
Date: Thu, 6 Nov 2014 16:05:52 +0900
026c9d
Subject: [PATCH] engine: Disable key processing on password input
026c9d
026c9d
---
026c9d
 src/engine.c | 35 +++++++++++++++++++++++++++++++++++
026c9d
 1 file changed, 35 insertions(+)
026c9d
026c9d
Index: ibus-m17n-1.3.4/src/engine.c
026c9d
===================================================================
026c9d
--- ibus-m17n-1.3.4.orig/src/engine.c
026c9d
+++ ibus-m17n-1.3.4/src/engine.c
026c9d
@@ -24,6 +24,7 @@ struct _IBusM17NEngine {
026c9d
 #endif  /* HAVE_SETUP */
026c9d
     IBusPropList    *prop_list;
026c9d
     IBusKeymap      *us_keymap;
026c9d
+    gboolean         has_focus;
026c9d
 };
026c9d
 
026c9d
 struct _IBusM17NEngineClass {
026c9d
@@ -75,6 +76,10 @@ static void ibus_m17n_engine_property_ac
026c9d
                                             (IBusEngine             *engine,
026c9d
                                              const gchar            *prop_name,
026c9d
                                              guint                   prop_state);
026c9d
+static void ibus_m17n_engine_set_content_type
026c9d
+                                            (IBusEngine             *engine,
026c9d
+                                             IBusInputPurpose        purpose,
026c9d
+                                             IBusInputHints          hints);
026c9d
 
026c9d
 static void ibus_m17n_engine_commit_string
026c9d
                                             (IBusM17NEngine         *m17n,
026c9d
@@ -226,6 +231,8 @@ ibus_m17n_engine_class_init (IBusM17NEng
026c9d
 
026c9d
     engine_class->property_activate = ibus_m17n_engine_property_activate;
026c9d
 
026c9d
+    engine_class->set_content_type = ibus_m17n_engine_set_content_type;
026c9d
+
026c9d
     if (!ibus_m17n_scan_class_name (G_OBJECT_CLASS_NAME (klass),
026c9d
                                     &lang, &name)) {
026c9d
         g_free (lang);
026c9d
@@ -667,6 +674,9 @@ ibus_m17n_engine_process_key_event (IBus
026c9d
         (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
026c9d
     guint original_keyval = keyval;
026c9d
 
026c9d
+    if (!m17n->has_focus)
026c9d
+        return FALSE;
026c9d
+
026c9d
     if (modifiers & IBUS_RELEASE_MASK)
026c9d
         return FALSE;
026c9d
 
026c9d
@@ -704,6 +714,7 @@ ibus_m17n_engine_focus_in (IBusEngine *e
026c9d
 
026c9d
     ibus_engine_register_properties (engine, m17n->prop_list);
026c9d
     ibus_m17n_engine_process_key (m17n, Minput_focus_in);
026c9d
+    m17n->has_focus = TRUE;
026c9d
 
026c9d
     parent_class->focus_in (engine);
026c9d
 }
026c9d
@@ -717,6 +728,7 @@ ibus_m17n_engine_focus_out (IBusEngine *
026c9d
        properly, we just reset the IC instead of passing Mfocus_out to
026c9d
        m17n-lib. */
026c9d
     minput_reset_ic (m17n->context);
026c9d
+    m17n->has_focus = FALSE;
026c9d
 
026c9d
     parent_class->focus_out (engine);
026c9d
 }
026c9d
@@ -812,6 +824,29 @@ ibus_m17n_engine_property_activate (IBus
026c9d
 }
026c9d
 
026c9d
 static void
026c9d
+ibus_m17n_engine_set_content_type (IBusEngine      *engine,
026c9d
+                                   IBusInputPurpose purpose,
026c9d
+                                   IBusInputHints   hints)
026c9d
+{
026c9d
+    IBusM17NEngine *m17n = (IBusM17NEngine *) engine;
026c9d
+
026c9d
+    /* For password and PIN input, disable key processing by emulating
026c9d
+       'focus-out'.  */
026c9d
+    switch (purpose) {
026c9d
+    case IBUS_INPUT_PURPOSE_PASSWORD:
026c9d
+    case IBUS_INPUT_PURPOSE_PIN:
026c9d
+        ibus_m17n_engine_process_key (m17n, Minput_focus_out);
026c9d
+        m17n->has_focus = FALSE;
026c9d
+        break;
026c9d
+
026c9d
+    default:
026c9d
+        ibus_m17n_engine_process_key (m17n, Minput_focus_in);
026c9d
+        m17n->has_focus = TRUE;
026c9d
+        break;
026c9d
+    }
026c9d
+}
026c9d
+
026c9d
+static void
026c9d
 ibus_m17n_engine_update_lookup_table (IBusM17NEngine *m17n)
026c9d
 {
026c9d
     ibus_lookup_table_clear (m17n->table);