char* m_ise_context_buffer;
size_t m_ise_context_length;
+ char* m_imdata_buffer;
+ size_t m_imdata_length;
ClientRepository m_client_repository;
/*
PanelAgentManager m_panel_agent_manager;
+ void delete_ise_context_buffer (void) {
+ if (m_ise_context_buffer != NULL) {
+ delete[] m_ise_context_buffer;
+ m_ise_context_buffer = NULL;
+ m_ise_context_length = 0;
+ }
+ }
+
+ void delete_imdata_buffer (void) {
+ if (m_imdata_buffer != NULL) {
+ delete[] m_imdata_buffer;
+ m_imdata_buffer = NULL;
+ m_imdata_length = 0;
+ }
+ }
public:
InfoManagerImpl ()
m_ise_exiting (false), m_is_imengine_aux (false), m_is_imengine_candidate (false),
m_reshow_needed (false),
m_last_socket_client (-1), m_last_client_context (0),
- m_ise_context_buffer (NULL), m_ise_context_length (0) {
+ m_ise_context_buffer (NULL), m_ise_context_length (0),
+ m_imdata_buffer (NULL), m_imdata_length (0) {
m_current_ise_name = String (_ ("English Keyboard"));
m_imcontrol_repository.clear ();
m_imcontrol_map.clear ();
~InfoManagerImpl () {
delete_ise_context_buffer ();
- }
-
- void delete_ise_context_buffer (void) {
- if (m_ise_context_buffer != NULL) {
- delete[] m_ise_context_buffer;
- m_ise_context_buffer = NULL;
- m_ise_context_length = 0;
- }
+ delete_imdata_buffer ();
}
bool initialize (InfoManager* info_manager, const ConfigPointer& config, const String& display, bool resident) {
}
/* Save ISE context for ISE panel re-showing */
+ /* The size of data can be bigger than Ise_Context size if there is IMDATA. */
if (data && len > 0) {
+ delete_imdata_buffer ();
delete_ise_context_buffer ();
m_ise_context_buffer = new char [len];
-
if (m_ise_context_buffer) {
m_ise_context_length = len;
memcpy (m_ise_context_buffer, data, m_ise_context_length);
m_signal_hide_ise ();
}
- /* Release ISE context buffer */
+ /* Release ISE context & IMDATA buffer */
+ delete_imdata_buffer ();
delete_ise_context_buffer ();
}
void set_ise_imdata (int client_id, const char* imdata, size_t len) {
SCIM_DEBUG_MAIN (4) << "InfoManager::set_ise_imdata ()\n";
+ delete_imdata_buffer ();
+ m_imdata_buffer = new char [len];
+ if (m_imdata_buffer) {
+ m_imdata_length = len;
+ memcpy (m_imdata_buffer, imdata, m_imdata_length);
+ }
if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode || m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
set_helper_imdata (m_current_helper_uuid, imdata, len);
}
m_panel_agent_manager.update_entry_metadata (focused_client, focused_context);
uint32 ctx = get_helper_ic (focused_client, focused_context);
bool ret = show_helper (m_current_helper_uuid, m_ise_context_buffer, m_ise_context_length, ctx);
- if (ret)
+ if (ret) {
m_signal_show_ise ();
+
+ if (m_imdata_buffer && m_imdata_length > 0 && m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
+ set_helper_imdata (m_current_helper_uuid, m_imdata_buffer, m_imdata_length);
+ }
}
}