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 */
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);
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
/*
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.
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.
* @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.
* @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.
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;
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
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 ++;
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;