From 5e3e27d3d9d90e8a56bc9d80ec28431d88d66d33 Mon Sep 17 00:00:00 2001 From: Inhong Han Date: Mon, 25 Feb 2019 18:35:31 +0900 Subject: [PATCH] Add keycode in the filter_key event Change-Id: I99272cb98ceb059c43f20ad8b22849abaa940912 --- ism/extras/wayland_immodule/wayland_imcontext.c | 6 ++++-- .../panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp | 5 +++-- ism/modules/panelagent/wayland/isf_wsc_context.h | 2 +- ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp | 8 ++++---- ism/src/isf_info_manager.cpp | 8 ++++---- ism/src/isf_info_manager.h | 2 +- ism/src/isf_message_queue.h | 7 +++++-- ism/src/isf_panel_agent_base.cpp | 2 +- ism/src/isf_panel_agent_base.h | 2 +- ism/src/isf_panel_agent_manager.cpp | 4 ++-- ism/src/isf_panel_agent_manager.h | 2 +- ism/src/scim_helper.cpp | 6 +++--- ism/src/scim_helper.h | 4 ++-- 13 files changed, 32 insertions(+), 26 deletions(-) diff --git a/ism/extras/wayland_immodule/wayland_imcontext.c b/ism/extras/wayland_immodule/wayland_imcontext.c index 822873a..d37b8eb 100644 --- a/ism/extras/wayland_immodule/wayland_imcontext.c +++ b/ism/extras/wayland_immodule/wayland_imcontext.c @@ -3296,6 +3296,7 @@ wayland_im_context_filter_event(Ecore_IMF_Context *ctx, key_dev_name = (char *)key_ev->dev_name; key_dev_class = key_ev->dev_class; key_dev_subclass = key_ev->dev_subclass; + ecore_key_ev.keycode = key_ev->keycode; } else if (type == ECORE_IMF_EVENT_KEY_DOWN) { Ecore_IMF_Event_Key_Down *key_ev = (Ecore_IMF_Event_Key_Down *)imf_event; @@ -3309,6 +3310,7 @@ wayland_im_context_filter_event(Ecore_IMF_Context *ctx, key_dev_name = (char *)key_ev->dev_name; key_dev_class = key_ev->dev_class; key_dev_subclass = key_ev->dev_subclass; + ecore_key_ev.keycode = key_ev->keycode; } if (type == ECORE_IMF_EVENT_KEY_UP || type == ECORE_IMF_EVENT_KEY_DOWN) { @@ -3357,11 +3359,11 @@ wayland_im_context_filter_event(Ecore_IMF_Context *ctx, if (ecore_key_ev.modifiers & ECORE_EVENT_LOCK_NUM) modifiers |= imcontext->num_mask; - SECURE_LOGD ("ev:modifiers=0x%x, modifiers=0x%x, shift_mask=0x%x, control_mask=0x%0x, alt_mask=0x%x, caps_mask=0x%x, num_mask=0x%x", ecore_key_ev.modifiers, modifiers, imcontext->shift_mask, imcontext->control_mask, imcontext->alt_mask, imcontext->caps_mask, imcontext->num_mask); + SECURE_LOGD ("ev:modifiers=0x%x, modifiers=0x%x, shift_mask=0x%x, control_mask=0x%0x, alt_mask=0x%x, caps_mask=0x%x, num_mask=0x%x, keycode=%u", ecore_key_ev.modifiers, modifiers, imcontext->shift_mask, imcontext->control_mask, imcontext->alt_mask, imcontext->caps_mask, imcontext->num_mask, ecore_key_ev.keycode); //Send key event to IME. wl_text_input_filter_key_event(imcontext->text_input, serial, ecore_key_ev.timestamp, ecore_key_ev.key, type == ECORE_IMF_EVENT_KEY_UP? WL_KEYBOARD_KEY_STATE_RELEASED : WL_KEYBOARD_KEY_STATE_PRESSED, - modifiers, (key_dev_name ? key_dev_name : ""), key_dev_class, key_dev_subclass); + modifiers, (key_dev_name ? key_dev_name : ""), key_dev_class, key_dev_subclass, ecore_key_ev.keycode); //Waiting for filter_key_event_done from IME. //This function should return IME filtering result with boolean type. Ecore_Wl2_Display *wl2_display = ecore_wl2_connected_display_get(NULL); diff --git a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp index c350992..0ac38db 100644 --- a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp +++ b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp @@ -860,7 +860,7 @@ private: m_send_trans.write_to_socket(client_socket); } - bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) { + bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode) { LOGD ("client id:%d", client); Socket client_socket(client); @@ -874,6 +874,7 @@ private: trans.put_command(SCIM_TRANS_CMD_PROCESS_KEY_EVENT); trans.put_data(key); trans.put_data(serial); + trans.put_data(keycode); if (trans.write_to_socket(client_socket)) { SCIM_DEBUG_MAIN(1) << __func__ << " success\n"; @@ -2187,7 +2188,7 @@ private: if (m_recv_trans.get_data(key)) { ret = true; - m_info_manager->process_key_event(key, result); + m_info_manager->process_key_event(key, result, 0); } else { LOGW ("wrong format of transaction"); } diff --git a/ism/modules/panelagent/wayland/isf_wsc_context.h b/ism/modules/panelagent/wayland/isf_wsc_context.h index 1380f0b..04df1d3 100644 --- a/ism/modules/panelagent/wayland/isf_wsc_context.h +++ b/ism/modules/panelagent/wayland/isf_wsc_context.h @@ -176,7 +176,7 @@ void isf_wsc_context_filter_key_event (WSCContextISF* wsc_ctx, uint32_t serial, uint32_t timestamp, const char *keyname, bool press, uint32_t modifiers, - const char *dev_name, uint32_t dev_class, uint32_t dev_subclass); + const char *dev_name, uint32_t dev_class, uint32_t dev_subclass, uint32_t keycode); #else void isf_wsc_context_filter_key_event (WSCContextISF* wsc_ctx, uint32_t serial, diff --git a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp index 6a11640..a7b03dc 100644 --- a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp +++ b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp @@ -460,14 +460,14 @@ _wsc_im_ctx_process_input_device_event (void *data, struct wl_input_method_conte } static void -_wsc_im_ctx_filter_key_event (void *data, struct wl_input_method_context *im_ctx, uint32_t serial, uint32_t time, const char *keyname, uint32_t state, uint32_t modifiers, const char *dev_name, uint32_t dev_class, uint32_t dev_subclass) +_wsc_im_ctx_filter_key_event (void *data, struct wl_input_method_context *im_ctx, uint32_t serial, uint32_t time, const char *keyname, uint32_t state, uint32_t modifiers, const char *dev_name, uint32_t dev_class, uint32_t dev_subclass, uint32_t keycode) { WSCContextISF *wsc_ctx = (WSCContextISF*)data; if (!wsc_ctx) return; #if !(ENABLE_GRAB_KEYBOARD) isf_wsc_context_filter_key_event (wsc_ctx, serial, time, keyname, - ((wl_keyboard_key_state)state) == WL_KEYBOARD_KEY_STATE_PRESSED, modifiers, dev_name, dev_class, dev_subclass); + ((wl_keyboard_key_state)state) == WL_KEYBOARD_KEY_STATE_PRESSED, modifiers, dev_name, dev_class, dev_subclass, keycode); #endif } @@ -1724,7 +1724,7 @@ isf_wsc_context_filter_key_event (WSCContextISF* wsc_ctx, uint32_t serial, uint32_t timestamp, const char *keysym, bool press, uint32_t modifiers, - const char *dev_name, uint32_t dev_class, uint32_t dev_subclass) + const char *dev_name, uint32_t dev_class, uint32_t dev_subclass, uint32_t keycode) { SCIM_DEBUG_FRONTEND (1) << __FUNCTION__ << "...\n"; LOGD (""); @@ -1808,7 +1808,7 @@ isf_wsc_context_filter_key_event (WSCContextISF* wsc_ctx, if (!ignore_key) { if (!_focused_ic || !_focused_ic->impl || !_focused_ic->impl->is_on) { LOGD ("ic is off"); - } else if (g_info_manager->process_key_event (key, serial)){ + } else if (g_info_manager->process_key_event (key, serial, keycode)){ return; } } diff --git a/ism/src/isf_info_manager.cpp b/ism/src/isf_info_manager.cpp index c2402fa..393f72a 100644 --- a/ism/src/isf_info_manager.cpp +++ b/ism/src/isf_info_manager.cpp @@ -1562,7 +1562,7 @@ public: m_should_shared_ise = should_shared_ise; } //SCIM_TRANS_CMD_PROCESS_KEY_EVENT - bool process_key_event (KeyEvent& key, uint32 serial) { + bool process_key_event (KeyEvent& key, uint32 serial, uint32 keycode) { HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid); if (it != m_helper_client_index.end ()) { @@ -1571,7 +1571,7 @@ public: uint32 ctx; get_focused_context (client, context); ctx = get_helper_ic (client, context); - return m_panel_agent_manager.process_key_event (it->second.id, ctx, m_current_helper_uuid, key, serial); + return m_panel_agent_manager.process_key_event (it->second.id, ctx, m_current_helper_uuid, key, serial, keycode); } return false; @@ -4722,9 +4722,9 @@ void InfoManager::prelaunch_helper_ise (void) } //SCIM_TRANS_CMD_PROCESS_KEY_EVENT -bool InfoManager::process_key_event (KeyEvent& key, uint32 serial) +bool InfoManager::process_key_event (KeyEvent& key, uint32 serial, uint32 keycode) { - return m_impl->process_key_event (key, serial); + return m_impl->process_key_event (key, serial, keycode); } //ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY diff --git a/ism/src/isf_info_manager.h b/ism/src/isf_info_manager.h index 2a83785..88751fa 100644 --- a/ism/src/isf_info_manager.h +++ b/ism/src/isf_info_manager.h @@ -622,7 +622,7 @@ public: void prelaunch_helper_ise (void); //SCIM_TRANS_CMD_PROCESS_KEY_EVENT - bool process_key_event (KeyEvent& key, uint32 serial); + bool process_key_event (KeyEvent& key, uint32 serial, uint32 keycode); //ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY void get_input_panel_geometry (int client_id, _OUT_ struct rectinfo& info); diff --git a/ism/src/isf_message_queue.h b/ism/src/isf_message_queue.h index 0619d2e..15e6d92 100644 --- a/ism/src/isf_message_queue.h +++ b/ism/src/isf_message_queue.h @@ -317,14 +317,16 @@ protected: class MessageItemProcessKeyEvent : public MessageItemHelper { public: - MessageItemProcessKeyEvent() : m_serial(0) {} + MessageItemProcessKeyEvent() : m_serial(0), m_keycode(0) {} virtual ~MessageItemProcessKeyEvent() {} KeyEvent& get_key_ref() { return m_key; } uint32& get_serial_ref() { return m_serial; } + uint32& get_keycode_ref() { return m_keycode; } protected: KeyEvent m_key; uint32 m_serial; + uint32 m_keycode; }; /* ISM_TRANS_CMD_SET_LAYOUT */ @@ -1199,7 +1201,8 @@ public: if (message) { message->get_command_ref() = cmd; if (transaction.get_data(message->get_key_ref()) && - transaction.get_data(message->get_serial_ref())) { + transaction.get_data(message->get_serial_ref()) && + transaction.get_data(message->get_keycode_ref())) { m_list_messages.push_back(message); } else { LOGW("wrong format of transaction"); diff --git a/ism/src/isf_panel_agent_base.cpp b/ism/src/isf_panel_agent_base.cpp index c50e338..549a373 100644 --- a/ism/src/isf_panel_agent_base.cpp +++ b/ism/src/isf_panel_agent_base.cpp @@ -283,7 +283,7 @@ void PanelAgentBase::set_helper_optimization_hint(int client, uint32 context, co { } -bool PanelAgentBase::process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) +bool PanelAgentBase::process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode) { return false; } diff --git a/ism/src/isf_panel_agent_base.h b/ism/src/isf_panel_agent_base.h index b83cabd..9ce3c0b 100644 --- a/ism/src/isf_panel_agent_base.h +++ b/ism/src/isf_panel_agent_base.h @@ -536,7 +536,7 @@ public: * * @return none. */ - virtual bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial); + virtual bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode); /** * @brief get_helper_geometry. diff --git a/ism/src/isf_panel_agent_manager.cpp b/ism/src/isf_panel_agent_manager.cpp index 3e7fbf9..29a16f2 100644 --- a/ism/src/isf_panel_agent_manager.cpp +++ b/ism/src/isf_panel_agent_manager.cpp @@ -546,12 +546,12 @@ void PanelAgentManager::set_helper_optimization_hint(int id, uint32 context_id, _p->set_helper_optimization_hint(id, context_id, uuid, hint); } -bool PanelAgentManager::process_key_event (int id, uint32 context_id, const String& uuid, KeyEvent& key, uint32 serial) +bool PanelAgentManager::process_key_event (int id, uint32 context_id, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode) { PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); if (!_p.null ()) - return _p->process_key_event (id, context_id, uuid, key, serial); + return _p->process_key_event (id, context_id, uuid, key, serial, keycode); return false; } diff --git a/ism/src/isf_panel_agent_manager.h b/ism/src/isf_panel_agent_manager.h index 2bf5d14..eef2830 100644 --- a/ism/src/isf_panel_agent_manager.h +++ b/ism/src/isf_panel_agent_manager.h @@ -313,7 +313,7 @@ public: void set_helper_optimization_hint (int id, uint32 context_id, const String& uuid, uint32 hint); void set_helper_mime_type (int client, uint32 context, const String& uuid, String& mime_type); void finalize_content_helper (int client, uint32 context, const String& uuid, String& text, uint32& cursor_pos); - bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial); + bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial, uint32 keycode); bool get_helper_geometry (int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info); void get_helper_imdata (int client, uint32 context, String& uuid, _OUT_ char** imdata, _OUT_ size_t& len); void get_helper_layout (int client, uint32 context, String& uuid, uint32& layout); diff --git a/ism/src/scim_helper.cpp b/ism/src/scim_helper.cpp index 673ea9c..6b45b65 100644 --- a/ism/src/scim_helper.cpp +++ b/ism/src/scim_helper.cpp @@ -130,7 +130,7 @@ typedef Signal2 &> typedef Signal2 HelperAgentSignalLookupTable; -typedef Signal3 +typedef Signal4 HelperAgentSignalKeyEventUint; typedef Signal5 @@ -1159,7 +1159,7 @@ HelperAgent::handle_message (MessageItem *message) { MessageItemProcessKeyEvent *subclass = static_cast(message); uint32 ret = 0; - m_impl->signal_process_key_event(this, subclass->get_key_ref(), ret); + m_impl->signal_process_key_event(this, subclass->get_key_ref(), ret, subclass->get_keycode_ref()); if (ret == 0) { if (!m_impl->si.null ()) { if (!(subclass->get_key_ref().get_key_string().compare("KeyRelease+XF86Back") == 0 || @@ -3051,7 +3051,7 @@ HelperAgent::signal_connect_set_return_key_disable (HelperAgentSlotUintVoid *slo * This signal is used to send keyboard key event to Helper ISE. * * The prototype of the slot is: - * void process_key_event (const HelperAgent *agent, KeyEvent &key, uint32 &ret); + * void process_key_event (const HelperAgent *agent, KeyEvent &key, uint32 &ret, uint32 keycode); */ Connection HelperAgent::signal_connect_process_key_event (HelperAgentSlotKeyEventUint *slot) diff --git a/ism/src/scim_helper.h b/ism/src/scim_helper.h index cb42967..24bb9a0 100644 --- a/ism/src/scim_helper.h +++ b/ism/src/scim_helper.h @@ -210,7 +210,7 @@ typedef Slot2 &> typedef Slot2 HelperAgentSlotLookupTable; -typedef Slot3 +typedef Slot4 HelperAgentSlotKeyEventUint; typedef Slot5 @@ -1307,7 +1307,7 @@ public: * @brief Connect a slot to Helper process key event signal. * * The prototype of the slot is: - * void process_key_event (const HelperAgent *, KeyEvent &key, uint32 &ret); + * void process_key_event (const HelperAgent *, KeyEvent &key, uint32 &ret, uint32 keycode); */ Connection signal_connect_process_key_event (HelperAgentSlotKeyEventUint *slot); -- 2.7.4