Support the device name infomation for the KeyEvent 00/41100/1 accepted/tizen/common/20150612.070133 accepted/tizen/mobile/20150612.111428 accepted/tizen/tv/20150612.111459 accepted/tizen/wearable/20150612.111451 submit/tizen/20150611.124401
authorwonkeun oh <wonkeun.oh@samsung.com>
Sat, 14 Mar 2015 05:35:55 +0000 (14:35 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Thu, 11 Jun 2015 07:51:03 +0000 (16:51 +0900)
Change-Id: Ia0e94b9c9404ee336bb3a56d7824570543a30b86

ism/extras/efl_immodule/isf_imf_context.cpp
ism/src/scim_event.cpp
ism/src/scim_event.h
ism/src/scim_transaction.cpp

index 95e022d..07bbcc1 100644 (file)
@@ -2117,6 +2117,9 @@ isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type,
 
     if (type == ECORE_IMF_EVENT_KEY_DOWN) {
         Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
+        if (ev->dev_name) {
+            scim_set_device_name (key, ev->dev_name);
+        }
         timestamp = ev->timestamp;
 
         /* Hardware input detect code */
@@ -2161,12 +2164,18 @@ isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type,
         Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
         timestamp = ev->timestamp;
         scim_string_to_key (key, ev->key);
+        if (ev->dev_name) {
+            scim_set_device_name (key, ev->dev_name);
+        }
         key.mask |= _ecore_imf_modifier_to_scim_mask (ev->modifiers);
         key.mask |= _ecore_imf_lock_to_scim_mask (ev->locks);
     } else if (type == ECORE_IMF_EVENT_KEY_UP) {
         Ecore_IMF_Event_Key_Up *ev = (Ecore_IMF_Event_Key_Up *)event;
         timestamp = ev->timestamp;
         scim_string_to_key (key, ev->key);
+        if (ev->dev_name) {
+            scim_set_device_name (key, ev->dev_name);
+        }
         key.mask = SCIM_KEY_ReleaseMask;
         key.mask |= _ecore_imf_modifier_to_scim_mask (ev->modifiers);
         key.mask |= _ecore_imf_lock_to_scim_mask (ev->locks);
index 3eda874..077c0d5 100644 (file)
@@ -392,6 +392,11 @@ scim_set_default_keyboard_layout (KeyboardLayout layout)
     scim_global_config_write (SCIM_GLOBAL_CONFIG_DEFAULT_KEYBOARD_LAYOUT, layout_name);
 }
 
+EAPI void
+scim_set_device_name (KeyEvent &key, String str)
+{
+    key.dev_name = str;
+}
 } // namespace scim
 
 /*
index 47d85e1..3762f0b 100644 (file)
@@ -2079,6 +2079,12 @@ EAPI KeyboardLayout scim_get_default_keyboard_layout ();
 EAPI void scim_set_default_keyboard_layout (KeyboardLayout layout);
 
 /**
+ * @brief Set a device name of KeyEvent.
+ * @param key - the result KeyEvent will be stored here.
+ * @param str - the device name.
+ */
+EAPI void scim_set_device_name (KeyEvent &key, String str);
+/**
  * @brief The class to store a keyboard event.
  *
  * A keyboard event contains a key code and a set of key masks.
@@ -2093,6 +2099,7 @@ struct EAPI KeyEvent
     uint32 code;    /**< key code */
     uint16 mask;    /**< modifier keys' mask */
     uint16 layout;  /**< keyboard layout identifier */
+    String dev_name;  /**< The device name of the key pressed */
 
     /**
      * @brief Default constructor.
@@ -2100,8 +2107,8 @@ struct EAPI KeyEvent
      * @param m - the key masks.
      * @param l - the keyboard layout
      */
-    KeyEvent (uint32 c = 0, uint16 m = 0, uint16 l = 0)
-        : code (c), mask (m), layout (l) { }
+    KeyEvent (uint32 c = 0, uint16 m = 0, uint16 l = 0, String d = "")
+        : code (c), mask (m), layout (l), dev_name (d){ }
 
     /**
      * @brief Constructor, construct a key event from a string.
@@ -2109,7 +2116,7 @@ struct EAPI KeyEvent
      * @param str the key string, eg. "Control+space"
      */
     KeyEvent (const String &str)
-        : code (0), mask (0), layout (0) { scim_string_to_key (*this, str); }
+        : code (0), mask (0), layout (0) , dev_name (""){ scim_string_to_key (*this, str); }
 
     /**
      * @brief Check if this KeyEvent is empty.
index 67ff9b4..8d7de5a 100644 (file)
@@ -378,7 +378,7 @@ Transaction::put_data (const WideString &str)
 void
 Transaction::put_data (const KeyEvent &key)
 {
-    m_holder->request_buffer_size (1 + sizeof (uint32) + sizeof (uint16) * 2);
+    m_holder->request_buffer_size (1 + sizeof (uint32) + sizeof (uint16) * 2 + sizeof (uint32) + key.dev_name.length ());
 
     m_holder->m_buffer [m_holder->m_write_pos++] = (unsigned char) SCIM_TRANS_DATA_KEYEVENT;
 
@@ -393,6 +393,15 @@ Transaction::put_data (const KeyEvent &key)
     scim_uint16tobytes (m_holder->m_buffer + m_holder->m_write_pos, key.layout);
 
     m_holder->m_write_pos += sizeof (uint16);
+
+    scim_uint32tobytes (m_holder->m_buffer + m_holder->m_write_pos, key.dev_name.length ());
+
+    m_holder->m_write_pos += sizeof (uint32);
+
+    if (key.dev_name.length ())
+        memcpy (m_holder->m_buffer + m_holder->m_write_pos, key.dev_name.c_str (), key.dev_name.length ());
+
+    m_holder->m_write_pos += key.dev_name.length ();
 }
 
 void
@@ -947,7 +956,7 @@ TransactionReader::get_data (KeyEvent &key)
         m_impl->m_holder->m_write_pos > m_impl->m_read_pos &&
         m_impl->m_holder->m_buffer [m_impl->m_read_pos] == SCIM_TRANS_DATA_KEYEVENT) {
 
-        if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) * 2 + 1))
+        if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + sizeof (uint32) * 2 + sizeof (uint32) + 1))
             return false;
 
         m_impl->m_read_pos ++;
@@ -961,6 +970,23 @@ TransactionReader::get_data (KeyEvent &key)
         key.layout = scim_bytestouint16 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
         m_impl->m_read_pos += sizeof (uint16);
 
+         size_t len;
+         size_t old_read_pos = m_impl->m_read_pos;
+
+         len = scim_bytestouint32 (m_impl->m_holder->m_buffer + m_impl->m_read_pos);
+          m_impl->m_read_pos += sizeof (uint32);
+
+         if (m_impl->m_holder->m_write_pos < (m_impl->m_read_pos + len)) {
+             m_impl->m_read_pos = old_read_pos;
+             return false;
+         }
+
+        if (len)
+            key.dev_name = String (m_impl->m_holder->m_buffer + m_impl->m_read_pos, m_impl->m_holder->m_buffer + m_impl->m_read_pos + len);
+        else
+            key.dev_name = String ("");
+
+        m_impl->m_read_pos += len;
         return true;
     }
     return false;