1 /** @file scim_panel.cpp
2 * @brief Implementation of class PanelAgent.
5 /* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
8 * Smart Common Input Method
10 * Copyright (c) 2005 James Su <suzhe@tsinghua.org.cn>
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this program; if not, write to the
25 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
26 * Boston, MA 02111-1307 USA
28 * $Id: scim_panel_agent.cpp,v 1.8.2.1 2006/01/09 14:32:18 suzhe Exp $
32 #define Uses_SCIM_TRANSACTION
33 #define Uses_SCIM_TRANS_COMMANDS
34 #define Uses_SCIM_PANEL_AGENT
35 #define Uses_SCIM_HELPER
36 #define Uses_SCIM_SOCKET
37 #define Uses_SCIM_EVENT
38 #define Uses_SCIM_CONFIG
39 #define Uses_SCIM_CONFIG_MODULE
40 #define Uses_SCIM_CONFIG_PATH
41 #define Uses_SCIM_UTILITY
44 #include <sys/types.h>
46 #include "scim_private.h"
48 #include "scim_stl_map.h"
51 scim::CommonLookupTable g_isf_candidate_table;
59 typedef Signal1<void, int>
62 typedef Signal1<void, const String &>
63 PanelAgentSignalString;
65 typedef Signal2<void, const String &, bool>
66 PanelAgentSignalStringBool;
68 typedef Signal2<void, String &, String &>
69 PanelAgentSignalString2;
71 typedef Signal2<void, int, const String &>
72 PanelAgentSignalIntString;
74 typedef Signal1<void, const PanelFactoryInfo &>
75 PanelAgentSignalFactoryInfo;
77 typedef Signal1<void, const std::vector <PanelFactoryInfo> &>
78 PanelAgentSignalFactoryInfoVector;
80 typedef Signal1<void, const LookupTable &>
81 PanelAgentSignalLookupTable;
83 typedef Signal1<void, const Property &>
84 PanelAgentSignalProperty;
86 typedef Signal1<void, const PropertyList &>
87 PanelAgentSignalPropertyList;
89 typedef Signal2<void, int, int>
90 PanelAgentSignalIntInt;
92 typedef Signal2<void, int &, int &>
93 PanelAgentSignalIntInt2;
95 typedef Signal3<void, int, int, int>
96 PanelAgentSignalIntIntInt;
98 typedef Signal2<void, int, const Property &>
99 PanelAgentSignalIntProperty;
101 typedef Signal2<void, int, const PropertyList &>
102 PanelAgentSignalIntPropertyList;
104 typedef Signal2<void, int, const HelperInfo &>
105 PanelAgentSignalIntHelperInfo;
107 typedef Signal2<void, const String &, const AttributeList &>
108 PanelAgentSignalAttributeString;
110 typedef Signal1<void, std::vector <String> &>
111 PanelAgentSignalStringVector;
113 typedef Signal1<bool, std::vector <String> &>
114 PanelAgentSignalBoolStringVector;
116 typedef Signal2<void, char *, std::vector <String> &>
117 PanelAgentSignalStrStringVector;
119 typedef Signal2<bool, const String &, ISE_INFO &>
120 PanelAgentSignalStringISEINFO;
122 typedef Signal1<void, const KeyEvent &>
123 PanelAgentSignalKeyEvent;
125 typedef Signal1<void, struct rectinfo &>
126 PanelAgentSignalRect;
133 IMCONTROL_ACT_CLIENT,
142 struct HelperClientStub {
146 HelperClientStub (int i = 0, int r = 0) : id (i), ref (r) { }
149 struct IMControlStub {
150 std::vector<ISE_INFO> info;
151 std::vector<int> count;
154 static int _id_count = -4;
156 #define DEFAULT_CONTEXT_VALUE 0xfff
158 #if SCIM_USE_STL_EXT_HASH_MAP
159 typedef __gnu_cxx::hash_map <int, ClientInfo, __gnu_cxx::hash <int> > ClientRepository;
160 typedef __gnu_cxx::hash_map <int, HelperInfo, __gnu_cxx::hash <int> > HelperInfoRepository;
161 typedef __gnu_cxx::hash_map <uint32, String, __gnu_cxx::hash <unsigned int> > ClientContextUUIDRepository;
162 typedef __gnu_cxx::hash_map <String, HelperClientStub, scim_hash_string> HelperClientIndex;
163 typedef __gnu_cxx::hash_map <String, std::vector < std::pair <uint32, String> >, scim_hash_string> StartHelperICIndex;
164 #elif SCIM_USE_STL_HASH_MAP
165 typedef std::hash_map <int, ClientInfo, std::hash <int> > ClientRepository;
166 typedef std::hash_map <int, HelperInfo, std::hash <int> > HelperInfoRepository;
167 typedef std::hash_map <uint32, String, std::hash <unsigned int> > ClientContextUUIDRepository;
168 typedef std::hash_map <String, HelperClientStub, scim_hash_string> HelperClientIndex;
169 typedef std::hash_map <String, std::vector < std::pair <uint32, String> >, scim_hash_string> StartHelperICIndex;
171 typedef std::map <int, ClientInfo> ClientRepository;
172 typedef std::map <int, HelperInfo> HelperInfoRepository;
173 typedef std::map <uint32, String> ClientContextUUIDRepository;
174 typedef std::map <String, HelperClientStub> HelperClientIndex;
175 typedef std::map <String, std::vector < std::pair <uint32, String> > > StartHelperICIndex;
178 typedef std::map <String, uint32> UUIDCountRepository;
179 typedef std::map <String, enum HelperState> UUIDStateRepository;
180 typedef std::map <String, int> StringIntRepository;
181 typedef std::map <int, struct IMControlStub> IMControlRepository;
182 typedef std::map <int, int> IntIntRepository;
185 get_helper_ic (int client, uint32 context)
187 return (uint32) (client & 0xFFFF) | ((context & 0x7FFF) << 16);
191 get_imengine_client_context (uint32 helper_ic, int &client, uint32 &context)
193 client = (int) (helper_ic & 0xFFFF);
194 context = ((helper_ic >> 16) & 0x7FFF);
197 //==================================== PanelAgent ===========================
198 class PanelAgent::PanelAgentImpl
201 bool m_should_resident;
203 int m_current_screen;
205 String m_config_name;
206 String m_display_name;
208 int m_socket_timeout;
209 String m_socket_address;
210 SocketServer m_socket_server;
212 Transaction m_send_trans;
213 Transaction m_recv_trans;
214 Transaction m_nest_trans;
216 int m_current_socket_client;
217 uint32 m_current_client_context;
218 String m_current_context_uuid;
219 TOOLBAR_MODE_T m_current_toolbar_mode;
220 String m_current_factory_icon;
221 String m_current_helper_uuid;
222 String m_last_helper_uuid;
223 String m_current_ise_name;
224 uint32 m_current_ise_style;
225 int m_current_active_imcontrol_id;
226 int m_pending_active_imcontrol_id;
227 IntIntRepository m_imcontrol_map;
228 DEFAULT_ISE_T m_default_ise;
229 bool m_should_shared_ise;
230 char * m_ise_settings;
231 size_t m_ise_settings_len;
235 int m_last_socket_client;
236 uint32 m_last_client_context;
237 String m_last_context_uuid;
239 ClientRepository m_client_repository;
241 * Each Helper ISE has two socket connect between PanelAgent and HelperAgent.
242 * m_helper_info_repository records the active connection.
243 * m_helper_active_info_repository records the passive connection.
245 HelperInfoRepository m_helper_info_repository;
246 HelperInfoRepository m_helper_active_info_repository;
247 HelperClientIndex m_helper_client_index;
249 /* when helper register, notify imcontrol client */
250 StringIntRepository m_ise_pending_repository;
251 IMControlRepository m_imcontrol_repository;
253 StartHelperICIndex m_start_helper_ic_index;
256 ClientContextUUIDRepository m_client_context_uuids;
259 ClientContextUUIDRepository m_client_context_helper;
260 UUIDCountRepository m_helper_uuid_count;
261 UUIDStateRepository m_helper_uuid_state;
263 HelperManager m_helper_manager;
265 PanelAgentSignalVoid m_signal_reload_config;
266 PanelAgentSignalVoid m_signal_turn_on;
267 PanelAgentSignalVoid m_signal_turn_off;
268 PanelAgentSignalVoid m_signal_show_panel;
269 PanelAgentSignalVoid m_signal_hide_panel;
270 PanelAgentSignalInt m_signal_update_screen;
271 PanelAgentSignalIntIntInt m_signal_update_spot_location;
272 PanelAgentSignalFactoryInfo m_signal_update_factory_info;
273 PanelAgentSignalVoid m_signal_start_default_ise;
274 PanelAgentSignalIntInt m_signal_set_candidate_ui;
275 PanelAgentSignalIntInt2 m_signal_get_candidate_ui;
276 PanelAgentSignalIntInt m_signal_set_candidate_position;
277 PanelAgentSignalRect m_signal_get_candidate_geometry;
278 PanelAgentSignalIntString m_signal_set_keyboard_ise;
279 PanelAgentSignalString2 m_signal_get_keyboard_ise;
280 PanelAgentSignalString m_signal_show_help;
281 PanelAgentSignalFactoryInfoVector m_signal_show_factory_menu;
282 PanelAgentSignalVoid m_signal_show_preedit_string;
283 PanelAgentSignalVoid m_signal_show_aux_string;
284 PanelAgentSignalVoid m_signal_show_lookup_table;
285 PanelAgentSignalVoid m_signal_show_associate_table;
286 PanelAgentSignalVoid m_signal_hide_preedit_string;
287 PanelAgentSignalVoid m_signal_hide_aux_string;
288 PanelAgentSignalVoid m_signal_hide_lookup_table;
289 PanelAgentSignalVoid m_signal_hide_associate_table;
290 PanelAgentSignalAttributeString m_signal_update_preedit_string;
291 PanelAgentSignalInt m_signal_update_preedit_caret;
292 PanelAgentSignalAttributeString m_signal_update_aux_string;
293 PanelAgentSignalLookupTable m_signal_update_lookup_table;
294 PanelAgentSignalLookupTable m_signal_update_associate_table;
295 PanelAgentSignalPropertyList m_signal_register_properties;
296 PanelAgentSignalProperty m_signal_update_property;
297 PanelAgentSignalIntPropertyList m_signal_register_helper_properties;
298 PanelAgentSignalIntProperty m_signal_update_helper_property;
299 PanelAgentSignalIntHelperInfo m_signal_register_helper;
300 PanelAgentSignalInt m_signal_remove_helper;
301 PanelAgentSignalStringBool m_signal_set_active_ise_by_uuid;
302 PanelAgentSignalString m_signal_set_active_ise_by_name;
303 PanelAgentSignalVoid m_signal_focus_in;
304 PanelAgentSignalVoid m_signal_focus_out;
305 PanelAgentSignalBoolStringVector m_signal_get_ise_list;
306 PanelAgentSignalBoolStringVector m_signal_get_keyboard_ise_list;
307 PanelAgentSignalInt m_signal_launch_helper_ise_list_selection;
308 PanelAgentSignalStringVector m_signal_get_language_list;
309 PanelAgentSignalStringVector m_signal_get_all_language;
310 PanelAgentSignalStrStringVector m_signal_get_ise_language;
311 PanelAgentSignalString m_signal_set_isf_language;
312 PanelAgentSignalStringISEINFO m_signal_get_ise_info_by_uuid;
313 PanelAgentSignalStringISEINFO m_signal_get_ise_info_by_name;
314 PanelAgentSignalKeyEvent m_signal_send_key_event;
316 PanelAgentSignalInt m_signal_accept_connection;
317 PanelAgentSignalInt m_signal_close_connection;
318 PanelAgentSignalVoid m_signal_exit;
320 PanelAgentSignalVoid m_signal_transaction_start;
321 PanelAgentSignalVoid m_signal_transaction_end;
323 PanelAgentSignalVoid m_signal_lock;
324 PanelAgentSignalVoid m_signal_unlock;
328 : m_should_exit (false),
329 m_should_resident (false),
330 m_current_screen (0),
331 m_socket_timeout (scim_get_default_socket_timeout ()),
332 m_current_socket_client (-1), m_current_client_context (0),
333 m_current_toolbar_mode (TOOLBAR_KEYBOARD_MODE),
334 m_current_ise_style (0),
335 m_current_active_imcontrol_id (-1), m_pending_active_imcontrol_id (-1),
336 m_should_shared_ise (false),
337 m_ise_settings (NULL), m_ise_settings_len (0),
338 m_ise_changing (false), m_ise_exiting (false),
339 m_last_socket_client (-1), m_last_client_context (0)
341 m_current_ise_name = String (_("English/Keyboard"));
342 m_imcontrol_repository.clear ();
343 m_imcontrol_map.clear ();
344 m_socket_server.signal_connect_accept (slot (this, &PanelAgentImpl::socket_accept_callback));
345 m_socket_server.signal_connect_receive (slot (this, &PanelAgentImpl::socket_receive_callback));
346 m_socket_server.signal_connect_exception (slot (this, &PanelAgentImpl::socket_exception_callback));
349 bool initialize (const String &config, const String &display, bool resident)
351 m_config_name = config;
352 m_display_name = display;
353 m_should_resident = resident;
355 m_socket_address = scim_get_default_panel_socket_address (display);
357 m_socket_server.shutdown ();
359 return m_socket_server.create (SocketAddress (m_socket_address));
362 bool valid (void) const
364 return m_socket_server.valid ();
370 SCIM_DEBUG_MAIN (1) << "PanelAgent::run ()\n";
372 return m_socket_server.run ();
377 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop ()\n";
380 m_should_exit = true;
385 if (client.connect (SocketAddress (m_socket_address))) {
390 int get_helper_list (std::vector <HelperInfo> & helpers) const
392 SCIM_DEBUG_MAIN (1) << "PanelAgent::get_helper_list ()\n";
396 m_helper_manager.get_helper_list ();
397 unsigned int num = m_helper_manager.number_of_helpers ();
400 SCIM_DEBUG_MAIN (2) << "Found " << num << " Helper objects\n";
402 for (unsigned int i = 0; i < num; ++i) {
403 if (m_helper_manager.get_helper_info (i, info) && info.uuid.length ()
404 && (info.option & SCIM_HELPER_STAND_ALONE))
405 helpers.push_back (info);
407 SCIM_DEBUG_MAIN (3) << "Helper " << i << " : " << info.uuid << " : " << info.name << " : "
408 << ((info.option & SCIM_HELPER_STAND_ALONE) ? "SA " : "")
409 << ((info.option & SCIM_HELPER_AUTO_START) ? "AS " : "")
410 << ((info.option & SCIM_HELPER_AUTO_RESTART) ? "AR " : "") << "\n";
413 return (int)(helpers.size ());
416 TOOLBAR_MODE_T get_current_toolbar_mode () const
418 return m_current_toolbar_mode;
421 String get_current_ise_name () const
423 return m_current_ise_name;
426 String get_current_factory_icon () const
428 return m_current_factory_icon;
431 String get_current_helper_uuid () const
433 return m_current_helper_uuid;
436 String get_current_helper_name () const
438 std::vector<HelperInfo> helpers;
440 get_helper_list (helpers);
442 std::vector<HelperInfo>::iterator iter;
444 for (iter = helpers.begin (); iter != helpers.end (); iter++) {
445 if (iter->uuid == m_current_helper_uuid)
452 void set_current_ise_name (String &name)
454 m_current_ise_name = name;
457 void set_current_ise_style (uint32 &style)
459 m_current_ise_style = style;
462 void set_current_toolbar_mode (TOOLBAR_MODE_T mode)
464 m_current_toolbar_mode = mode;
467 void update_ise_name (String &name)
469 ClientRepository::iterator iter = m_client_repository.begin ();
471 for (; iter != m_client_repository.end (); iter++)
473 if (IMCONTROL_CLIENT == iter->second.type
474 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
476 Socket client_socket (iter->first);
480 trans.put_command (SCIM_TRANS_CMD_REQUEST);
481 trans.put_command (ISM_TRANS_CMD_ISE_CHANGED);
482 trans.put_data (name);
484 trans.write_to_socket (client_socket);
490 void update_ise_style (uint32 &style)
492 ClientRepository::iterator iter = m_client_repository.begin ();
494 for (; iter != m_client_repository.end (); iter++)
496 if (IMCONTROL_CLIENT == iter->second.type &&
497 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
499 Socket client_socket (iter->first);
503 trans.put_command (SCIM_TRANS_CMD_REQUEST);
504 trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_STYLE);
505 trans.put_data (style);
507 trans.write_to_socket (client_socket);
513 void update_candidate_panel_event (uint32 nType, uint32 nValue)
515 SCIM_DEBUG_MAIN(1) << __func__ << " (" << nType << ", " << nValue << ")\n";
516 ClientRepository::iterator iter = m_client_repository.begin ();
518 for (; iter != m_client_repository.end (); iter++)
520 if (IMCONTROL_CLIENT == iter->second.type &&
521 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
523 Socket client_socket (iter->first);
527 trans.put_command (SCIM_TRANS_CMD_REQUEST);
528 trans.put_command (ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL);
529 trans.put_data (nType);
530 trans.put_data (nValue);
532 trans.write_to_socket (client_socket);
538 void set_current_factory_icon (String &icon)
540 m_current_factory_icon = icon;
543 bool move_preedit_caret (uint32 position)
545 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
552 get_focused_context (client, context);
555 Socket client_socket (client);
556 m_send_trans.clear ();
557 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
558 m_send_trans.put_data ((uint32) context);
559 m_send_trans.put_command (SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
560 m_send_trans.put_data ((uint32) position);
561 m_send_trans.write_to_socket (client_socket);
569 bool request_help (void)
571 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
578 get_focused_context (client, context);
581 Socket client_socket (client);
582 m_send_trans.clear ();
583 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
584 m_send_trans.put_data ((uint32) context);
585 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
586 m_send_trans.write_to_socket (client_socket);
594 bool request_factory_menu (void)
596 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_factory_menu ()\n";
603 get_focused_context (client, context);
606 Socket client_socket (client);
607 m_send_trans.clear ();
608 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
609 m_send_trans.put_data ((uint32) context);
610 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU);
611 m_send_trans.write_to_socket (client_socket);
619 bool reset_keyboard_ise (void)
621 SCIM_DEBUG_MAIN(1) << "PanelAgent::reset_keyboard_ise ()\n";
627 get_focused_context (client, context);
629 Socket client_socket (client);
630 m_send_trans.clear ();
631 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
632 m_send_trans.put_data ((uint32) context);
633 m_send_trans.put_command (ISM_TRANS_CMD_PANEL_REQUEST_RESET_ISE);
634 m_send_trans.write_to_socket (client_socket);
642 bool update_keyboard_ise_list (void)
644 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_keyboard_ise_list ()\n";
650 get_focused_context (client, context);
652 Socket client_socket (client);
653 m_send_trans.clear ();
654 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
655 m_send_trans.put_data ((uint32) context);
656 m_send_trans.put_command (ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
657 m_send_trans.write_to_socket (client_socket);
665 bool change_factory (const String &uuid)
667 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
674 get_focused_context (client, context);
677 Socket client_socket (client);
678 m_send_trans.clear ();
679 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
680 m_send_trans.put_data ((uint32) context);
681 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
682 m_send_trans.put_data (uuid);
683 m_send_trans.write_to_socket (client_socket);
691 bool candidate_more_window_show (void)
693 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
695 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
697 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
699 if (it != m_helper_client_index.end ())
703 Socket client_socket (it->second.id);
706 get_focused_context (client, context);
707 ctx = get_helper_ic (client, context);
709 m_send_trans.clear ();
710 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
711 m_send_trans.put_data (ctx);
712 m_send_trans.put_data (m_current_helper_uuid);
713 m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
714 m_send_trans.write_to_socket (client_socket);
723 bool candidate_more_window_hide (void)
725 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
727 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
729 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
731 if (it != m_helper_client_index.end ())
735 Socket client_socket (it->second.id);
738 get_focused_context (client, context);
739 ctx = get_helper_ic (client, context);
741 m_send_trans.clear ();
742 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
743 m_send_trans.put_data (ctx);
744 m_send_trans.put_data (m_current_helper_uuid);
745 m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
746 m_send_trans.write_to_socket (client_socket);
755 bool select_aux (uint32 item)
757 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
764 get_focused_context (client, context);
767 Socket client_socket (client);
768 m_send_trans.clear ();
769 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
770 m_send_trans.put_data ((uint32) context);
771 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_AUX);
772 m_send_trans.put_data ((uint32)item);
773 m_send_trans.write_to_socket (client_socket);
778 helper_select_aux (item);
783 bool select_candidate (uint32 item)
785 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_candidate (" << item << ")\n";
792 get_focused_context (client, context);
795 Socket client_socket (client);
796 m_send_trans.clear ();
797 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
798 m_send_trans.put_data ((uint32) context);
799 m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
800 m_send_trans.put_data ((uint32)item);
801 m_send_trans.write_to_socket (client_socket);
806 helper_select_candidate (item);
811 bool lookup_table_page_up (void)
813 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
820 get_focused_context (client, context);
823 Socket client_socket (client);
824 m_send_trans.clear ();
825 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
826 m_send_trans.put_data ((uint32) context);
827 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
828 m_send_trans.write_to_socket (client_socket);
833 helper_lookup_table_page_up ();
838 bool lookup_table_page_down (void)
840 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_down ()\n";
847 get_focused_context (client, context);
850 Socket client_socket (client);
851 m_send_trans.clear ();
852 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
853 m_send_trans.put_data ((uint32) context);
854 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
855 m_send_trans.write_to_socket (client_socket);
860 helper_lookup_table_page_down ();
865 bool update_lookup_table_page_size (uint32 size)
867 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_lookup_table_page_size (" << size << ")\n";
874 get_focused_context (client, context);
877 Socket client_socket (client);
878 m_send_trans.clear ();
879 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
880 m_send_trans.put_data ((uint32) context);
881 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
882 m_send_trans.put_data (size);
883 m_send_trans.write_to_socket (client_socket);
888 helper_update_lookup_table_page_size (size);
893 bool select_associate (uint32 item)
895 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_associate (" << item << ")\n";
902 get_focused_context (client, context);
905 Socket client_socket (client);
906 m_send_trans.clear ();
907 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
908 m_send_trans.put_data ((uint32) context);
909 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
910 m_send_trans.put_data ((uint32)item);
911 m_send_trans.write_to_socket (client_socket);
916 helper_select_associate (item);
921 bool associate_table_page_up (void)
923 SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_up ()\n";
930 get_focused_context (client, context);
933 Socket client_socket (client);
934 m_send_trans.clear ();
935 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
936 m_send_trans.put_data ((uint32) context);
937 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
938 m_send_trans.write_to_socket (client_socket);
943 helper_associate_table_page_up ();
948 bool associate_table_page_down (void)
950 SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_down ()\n";
957 get_focused_context (client, context);
960 Socket client_socket (client);
961 m_send_trans.clear ();
962 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
963 m_send_trans.put_data ((uint32) context);
964 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
965 m_send_trans.write_to_socket (client_socket);
970 helper_associate_table_page_down ();
975 bool update_associate_table_page_size (uint32 size)
977 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_associate_table_page_size (" << size << ")\n";
984 get_focused_context (client, context);
987 Socket client_socket (client);
988 m_send_trans.clear ();
989 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
990 m_send_trans.put_data ((uint32) context);
991 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
992 m_send_trans.put_data (size);
993 m_send_trans.write_to_socket (client_socket);
998 helper_update_associate_table_page_size (size);
1003 bool trigger_property (const String &property)
1005 SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_property (" << property << ")\n";
1012 get_focused_context (client, context);
1015 Socket client_socket (client);
1016 m_send_trans.clear ();
1017 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1018 m_send_trans.put_data ((uint32) context);
1019 m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
1020 m_send_trans.put_data (property);
1021 m_send_trans.write_to_socket (client_socket);
1029 bool trigger_helper_property (int client,
1030 const String &property)
1032 SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_helper_property (" << client << "," << property << ")\n";
1036 ClientInfo info = socket_get_client_info (client);
1038 if (client >= 0 && info.type == HELPER_CLIENT) {
1043 fe_uuid = get_focused_context (fe_client, fe_context);
1045 Socket client_socket (client);
1046 m_send_trans.clear ();
1047 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1049 /* FIXME: We presume that client and context are both less than 65536.
1050 * Hopefully, it should be true in any UNIXs.
1051 * So it's ok to combine client and context into one uint32.*/
1052 m_send_trans.put_data (get_helper_ic (fe_client, fe_context));
1053 m_send_trans.put_data (fe_uuid);
1054 m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
1055 m_send_trans.put_data (property);
1056 m_send_trans.write_to_socket (client_socket);
1061 return client >= 0 && info.type == HELPER_CLIENT;
1064 bool start_helper (const String &uuid, int client, uint32 context)
1066 SCIM_DEBUG_MAIN(1) << "PanelAgent::start_helper (" << uuid << ")\n";
1067 if (uuid.length () <= 0)
1072 if (m_current_toolbar_mode != TOOLBAR_HELPER_MODE || m_current_helper_uuid.compare (uuid) != 0)
1074 SCIM_DEBUG_MAIN(1) << uuid.c_str () << ".....enter run_helper ..............\n";
1075 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
1077 m_current_helper_uuid = uuid;
1078 #ifdef ONE_HELPER_ISE_PROCESS
1080 get_focused_context (client, context);
1082 SCIM_DEBUG_MAIN(1) << "[start helper] client : " << client << " context : " << context << "\n";
1083 uint32 ctx = get_helper_ic (client, context);
1085 /*HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1086 if (it == m_helper_client_index.end ())*/
1087 if (m_helper_uuid_count.find (uuid) == m_helper_uuid_count.end ())
1089 m_client_context_helper[ctx] = uuid;
1090 m_current_helper_uuid = uuid;
1091 m_helper_uuid_count[uuid] = 1;
1092 m_helper_uuid_state[uuid] = HELPER_HIDED;
1094 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
1095 SCIM_DEBUG_MAIN(1) << "Start HelperISE " << uuid << " ...\n";
1099 ClientContextUUIDRepository::iterator it2 = m_client_context_helper.find (ctx);
1100 if (it2 == m_client_context_helper.end ())
1102 m_client_context_helper[ctx] = uuid;
1103 m_current_helper_uuid = uuid;
1104 m_helper_uuid_count[uuid] = m_helper_uuid_count[uuid] + 1;
1107 if (m_current_active_imcontrol_id != -1
1108 && m_ise_settings != NULL && m_ise_changing)
1110 show_helper (uuid, m_ise_settings, m_ise_settings_len);
1111 m_ise_changing = false;
1114 SCIM_DEBUG_MAIN(1) << "Increment usage count of HelperISE " << uuid << " to "
1115 << m_helper_uuid_count[uuid] << "\n";
1123 bool stop_helper (const String &helper_uuid, int client, uint32 context)
1125 String uuid = helper_uuid;
1126 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop_helper (" << uuid << ")\n";
1127 if (uuid.length () <= 0)
1132 uint32 ctx = get_helper_ic (client, context);
1133 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1134 if (it != m_helper_client_index.end ())
1136 Socket client_socket (it->second.id);
1137 m_send_trans.clear ();
1138 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1139 m_send_trans.put_data (ctx);
1140 m_send_trans.put_data (uuid);
1142 m_ise_exiting = true;
1143 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
1144 m_send_trans.write_to_socket (client_socket);
1145 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
1147 #ifdef ONE_HELPER_ISE_PROCESS
1149 get_focused_context (client, context);
1151 SCIM_DEBUG_MAIN(1) << "[stop helper] client : " << client << " context : " << context << "\n";
1152 uint32 ctx = get_helper_ic (client, context);
1154 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1155 /*if (it != m_helper_client_index.end ())*/
1156 if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ())
1158 m_client_context_helper.erase (ctx);
1160 uint32 count = m_helper_uuid_count[uuid];
1163 m_helper_uuid_count.erase (uuid);
1165 if (it != m_helper_client_index.end ())
1167 Socket client_socket (it->second.id);
1168 m_send_trans.clear ();
1169 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1170 m_send_trans.put_data (ctx);
1171 m_send_trans.put_data (uuid);
1172 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
1173 m_send_trans.write_to_socket (client_socket);
1174 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
1179 m_helper_uuid_count[uuid] = count - 1;
1180 SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
1181 << " to " << m_helper_uuid_count[uuid] << "\n";
1190 void focus_out_helper (const String &uuid, int client, uint32 context)
1192 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1194 if (it != m_helper_client_index.end ())
1196 Socket client_socket (it->second.id);
1197 uint32 ctx = get_helper_ic (client, context);
1199 m_send_trans.clear ();
1200 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1201 m_send_trans.put_data (ctx);
1202 m_send_trans.put_data (uuid);
1203 m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
1204 m_send_trans.write_to_socket (client_socket);
1208 void focus_in_helper (const String &uuid, int client, uint32 context)
1210 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1212 if (it != m_helper_client_index.end ())
1214 Socket client_socket (it->second.id);
1215 uint32 ctx = get_helper_ic (client, context);
1217 m_send_trans.clear ();
1218 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1219 m_send_trans.put_data (ctx);
1220 m_send_trans.put_data (uuid);
1221 m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
1222 m_send_trans.write_to_socket (client_socket);
1226 void show_helper (const String &uuid, char *data, size_t &len)
1228 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1230 if (it != m_helper_client_index.end ())
1234 Socket client_socket (it->second.id);
1237 m_helper_uuid_state[uuid] = HELPER_SHOWED;
1239 get_focused_context (client, context);
1240 ctx = get_helper_ic (client, context);
1242 m_send_trans.clear ();
1243 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1244 m_send_trans.put_data (ctx);
1245 m_send_trans.put_data (uuid);
1246 m_send_trans.put_command (ISM_TRANS_CMD_SHOW_ISE);
1247 m_send_trans.put_data (data, len);
1248 m_send_trans.write_to_socket (client_socket);
1253 void hide_helper (const String &uuid)
1255 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1257 if (it != m_helper_client_index.end ())
1261 Socket client_socket (it->second.id);
1264 m_helper_uuid_state[uuid] = HELPER_HIDED;
1266 get_focused_context (client, context);
1267 ctx = get_helper_ic (client, context);
1269 m_send_trans.clear ();
1270 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1271 m_send_trans.put_data (ctx);
1272 m_send_trans.put_data (uuid);
1273 m_send_trans.put_command (ISM_TRANS_CMD_HIDE_ISE);
1274 m_send_trans.write_to_socket (client_socket);
1278 bool set_helper_mode (const String &uuid, uint32 &mode)
1280 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1282 if (it != m_helper_client_index.end ())
1286 Socket client_socket (it->second.id);
1289 get_focused_context (client, context);
1290 ctx = get_helper_ic (client, context);
1292 m_send_trans.clear ();
1293 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1294 m_send_trans.put_data (ctx);
1295 m_send_trans.put_data (uuid);
1296 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_MODE);
1297 m_send_trans.put_data (mode);
1298 m_send_trans.write_to_socket (client_socket);
1305 bool set_helper_language (const String &uuid, uint32 &language)
1307 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1309 if (it != m_helper_client_index.end ())
1313 Socket client_socket (it->second.id);
1316 get_focused_context (client, context);
1317 ctx = get_helper_ic (client, context);
1319 m_send_trans.clear ();
1320 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1321 m_send_trans.put_data (ctx);
1322 m_send_trans.put_data (uuid);
1323 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_LANGUAGE);
1324 m_send_trans.put_data (language);
1325 m_send_trans.write_to_socket (client_socket);
1331 bool set_helper_imdata (const String &uuid, char *imdata, size_t &len)
1333 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1335 if (it != m_helper_client_index.end ())
1339 Socket client_socket (it->second.id);
1342 get_focused_context (client, context);
1343 ctx = get_helper_ic (client, context);
1345 m_send_trans.clear ();
1346 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1347 m_send_trans.put_data (ctx);
1348 m_send_trans.put_data (uuid);
1349 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
1350 m_send_trans.put_data (imdata, len);
1351 m_send_trans.write_to_socket (client_socket);
1357 bool set_helper_return_key_type (const String &uuid, int type)
1359 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1361 if (it != m_helper_client_index.end ())
1365 Socket client_socket (it->second.id);
1368 get_focused_context (client, context);
1369 ctx = get_helper_ic (client, context);
1371 m_send_trans.clear ();
1372 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1373 m_send_trans.put_data (ctx);
1374 m_send_trans.put_data (uuid);
1375 m_send_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
1376 m_send_trans.put_data (type);
1377 m_send_trans.write_to_socket (client_socket);
1385 bool get_helper_return_key_type (const String &uuid, uint32 &type)
1387 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1389 if (it != m_helper_client_index.end ()) {
1393 Socket client_socket (it->second.id);
1397 get_focused_context (client, context);
1398 ctx = get_helper_ic (client, context);
1401 trans.put_command (SCIM_TRANS_CMD_REPLY);
1402 trans.put_data (ctx);
1403 trans.put_data (uuid);
1404 trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
1407 if (trans.write_to_socket (client_socket)
1408 && trans.read_from_socket (client_socket)
1409 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1410 && trans.get_data (type)) {
1411 SCIM_DEBUG_MAIN (1) << __func__ << " success\n";
1414 std::cerr << __func__ << " failed\n";
1420 bool set_helper_return_key_disable (const String &uuid, bool disabled)
1422 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1424 if (it != m_helper_client_index.end ())
1428 Socket client_socket (it->second.id);
1431 get_focused_context (client, context);
1432 ctx = get_helper_ic (client, context);
1434 m_send_trans.clear ();
1435 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1436 m_send_trans.put_data (ctx);
1437 m_send_trans.put_data (uuid);
1438 m_send_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
1439 m_send_trans.put_data (disabled);
1440 m_send_trans.write_to_socket (client_socket);
1448 bool get_helper_return_key_disable (const String &uuid, uint32 &disabled)
1450 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1452 if (it != m_helper_client_index.end ()) {
1456 Socket client_socket (it->second.id);
1460 get_focused_context (client, context);
1461 ctx = get_helper_ic (client, context);
1464 trans.put_command (SCIM_TRANS_CMD_REPLY);
1465 trans.put_data (ctx);
1466 trans.put_data (uuid);
1467 trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
1470 if (trans.write_to_socket (client_socket)
1471 && trans.read_from_socket (client_socket)
1472 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1473 && trans.get_data (disabled)) {
1474 SCIM_DEBUG_MAIN (1) << __func__ << " success\n";
1477 std::cerr << __func__ << " failed\n";
1483 bool set_helper_layout (const String &uuid, uint32 &layout)
1485 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1487 if (it != m_helper_client_index.end ())
1491 Socket client_socket (it->second.id);
1494 get_focused_context (client, context);
1495 ctx = get_helper_ic (client, context);
1497 m_send_trans.clear ();
1498 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1499 m_send_trans.put_data (ctx);
1500 m_send_trans.put_data (uuid);
1501 m_send_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
1502 m_send_trans.put_data (layout);
1503 m_send_trans.write_to_socket (client_socket);
1510 bool set_helper_caps_mode (const String &uuid, uint32 &mode)
1512 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1514 if (it != m_helper_client_index.end ())
1518 Socket client_socket (it->second.id);
1521 get_focused_context (client, context);
1522 ctx = get_helper_ic (client, context);
1524 m_send_trans.clear ();
1525 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1526 m_send_trans.put_data (ctx);
1527 m_send_trans.put_data (uuid);
1528 m_send_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
1529 m_send_trans.put_data (mode);
1530 m_send_trans.write_to_socket (client_socket);
1537 void show_isf_panel (int client_id)
1539 SCIM_DEBUG_MAIN(4) << "PanelAgent::show_isf_panel ()\n";
1541 Socket client_socket (client_id);
1543 m_signal_show_panel ();
1546 void hide_isf_panel (int client_id)
1548 SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_isf_panel ()\n";
1550 Socket client_socket (client_id);
1552 m_signal_hide_panel ();
1555 void show_ise_panel (int client_id)
1557 SCIM_DEBUG_MAIN(4) << "PanelAgent::show_ise_panel ()\n";
1561 m_current_active_imcontrol_id = client_id;
1563 if (m_recv_trans.get_data (&data, len))
1565 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1566 show_helper (m_current_helper_uuid, data, len);
1571 if (m_ise_settings != NULL)
1572 delete [] m_ise_settings;
1573 m_ise_settings = data;
1574 m_ise_settings_len = len;
1578 void hide_ise_panel (int client_id)
1580 SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_ise_panel ()\n";
1581 TOOLBAR_MODE_T mode;
1583 mode = m_current_toolbar_mode;
1585 if (client_id == m_current_active_imcontrol_id &&
1586 TOOLBAR_HELPER_MODE == mode)
1588 hide_helper (m_current_helper_uuid);
1592 void set_default_ise (const DEFAULT_ISE_T &ise)
1594 m_default_ise.type = ise.type;
1595 m_default_ise.uuid = ise.uuid;
1596 m_default_ise.name = ise.name;
1598 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE), (int)m_default_ise.type);
1599 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), m_default_ise.uuid);
1600 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME), m_default_ise.name);
1601 scim_global_config_flush ();
1604 void set_should_shared_ise (const bool should_shared_ise)
1606 m_should_shared_ise = should_shared_ise;
1609 bool get_helper_geometry (String &uuid, struct rectinfo &info)
1611 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1613 if (it != m_helper_client_index.end ()) {
1616 Socket client_socket (it->second.id);
1620 get_focused_context (client, context);
1621 ctx = get_helper_ic (client, context);
1624 trans.put_command (SCIM_TRANS_CMD_REPLY);
1625 trans.put_data (ctx);
1626 trans.put_data (uuid);
1627 trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
1629 if (trans.write_to_socket (client_socket)) {
1633 if (trans.read_from_socket (client_socket)
1634 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1635 && trans.get_data (info.pos_x)
1636 && trans.get_data (info.pos_y)
1637 && trans.get_data (info.width)
1638 && trans.get_data (info.height)) {
1639 SCIM_DEBUG_MAIN (1) << __func__ << " is successful\n";
1642 std::cerr << __func__ << " is failed!!!\n";
1650 bool get_helper_imdata (String &uuid, char **imdata, size_t &len)
1652 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1654 if (it != m_helper_client_index.end ()) {
1658 Socket client_socket (it->second.id);
1662 get_focused_context (client, context);
1663 ctx = get_helper_ic (client, context);
1666 trans.put_command (SCIM_TRANS_CMD_REPLY);
1667 trans.put_data (ctx);
1668 trans.put_data (uuid);
1669 trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
1672 if (trans.write_to_socket (client_socket)
1673 && trans.read_from_socket (client_socket)
1674 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1675 && trans.get_data (imdata, len))
1677 SCIM_DEBUG_MAIN (1) << "get_helper_imdata success\n";
1682 std::cerr << "get_helper_imdata failed\n";
1688 bool get_helper_layout (String &uuid, uint32 &layout)
1690 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1692 if (it != m_helper_client_index.end ()) {
1696 Socket client_socket (it->second.id);
1700 get_focused_context (client, context);
1701 ctx = get_helper_ic (client, context);
1704 trans.put_command (SCIM_TRANS_CMD_REPLY);
1705 trans.put_data (ctx);
1706 trans.put_data (uuid);
1707 trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
1710 if (trans.write_to_socket (client_socket)
1711 && trans.read_from_socket (client_socket)
1712 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1713 && trans.get_data (layout))
1715 SCIM_DEBUG_MAIN (1) << "get_helper_layout success\n";
1720 std::cerr << "get_helper_layout failed\n";
1726 bool get_helper_layout_list (String &uuid, std::vector<uint32> &list)
1728 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1730 if (it != m_helper_client_index.end ()) {
1734 Socket client_socket (it->second.id);
1738 get_focused_context (client, context);
1739 ctx = get_helper_ic (client, context);
1742 trans.put_command (SCIM_TRANS_CMD_REPLY);
1743 trans.put_data (ctx);
1744 trans.put_data (uuid);
1745 trans.put_command (ISM_TRANS_CMD_GET_LAYOUT_LIST);
1748 if (trans.write_to_socket (client_socket)
1749 && trans.read_from_socket (client_socket, 500)
1750 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1751 && trans.get_data (list))
1753 SCIM_DEBUG_MAIN (1) << "get_helper_layout_list success\n";
1758 std::cerr << "get_helper_layout_list failed\n";
1764 void get_ise_geometry (int client_id)
1766 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_size ()\n";
1767 struct rectinfo info;
1770 TOOLBAR_MODE_T mode;
1772 mode = m_current_toolbar_mode;
1774 if (TOOLBAR_HELPER_MODE == mode)
1775 ret = get_helper_geometry (m_current_helper_uuid, info);
1778 Socket client_socket (client_id);
1781 trans.put_command (SCIM_TRANS_CMD_REPLY);
1785 trans.put_command (SCIM_TRANS_CMD_OK);
1786 trans.put_data (info.pos_x);
1787 trans.put_data (info.pos_y);
1788 trans.put_data (info.width);
1789 trans.put_data (info.height);
1793 std::cerr << "get_ise_size failed\n";
1794 trans.put_command (SCIM_TRANS_CMD_FAIL);
1797 trans.write_to_socket (client_socket);
1800 void get_candidate_window_geometry (int client_id)
1802 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
1804 struct rectinfo info;
1809 m_signal_get_candidate_geometry (info);
1812 Socket client_socket (client_id);
1815 trans.put_command (SCIM_TRANS_CMD_REPLY);
1816 trans.put_command (SCIM_TRANS_CMD_OK);
1817 trans.put_data (info.pos_x);
1818 trans.put_data (info.pos_y);
1819 trans.put_data (info.width);
1820 trans.put_data (info.height);
1821 trans.write_to_socket (client_socket);
1824 void get_ise_language_locale (int client_id)
1826 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
1833 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode) {
1834 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1836 if (it != m_helper_client_index.end ()) {
1839 get_focused_context (client, context);
1841 uint32 ctx = get_helper_ic (client, context);
1844 trans.put_command (SCIM_TRANS_CMD_REPLY);
1845 trans.put_data (ctx);
1846 trans.put_data (m_current_helper_uuid);
1847 trans.put_command (ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
1850 Socket client_socket (it->second.id);
1851 if (trans.write_to_socket (client_socket)
1852 && trans.read_from_socket (client_socket)
1853 && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY
1854 && trans.get_data (&data, len)) {
1857 std::cerr << "Get ISE language locale is failed!!!\n";
1863 trans.put_command (SCIM_TRANS_CMD_REPLY);
1864 if (data != NULL && len > 0) {
1865 trans.put_command (SCIM_TRANS_CMD_OK);
1866 trans.put_data (data, len);
1868 trans.put_command (SCIM_TRANS_CMD_FAIL);
1871 Socket client_socket (client_id);
1872 trans.write_to_socket (client_socket);
1878 void get_current_ise_geometry (rectinfo &rect)
1880 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
1881 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
1884 if (TOOLBAR_HELPER_MODE == mode)
1885 ret = get_helper_geometry (m_current_helper_uuid, rect);
1895 void set_ise_mode (int client_id)
1897 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_mode ()\n";
1900 if (m_recv_trans.get_data (mode))
1902 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1903 set_helper_mode (m_current_helper_uuid, mode);
1907 void set_ise_layout (int client_id)
1909 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_layout ()\n";
1912 if (m_recv_trans.get_data (layout))
1914 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1915 set_helper_layout (m_current_helper_uuid, layout);
1919 void set_ise_language (int client_id)
1921 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_language ()\n";
1924 if (m_recv_trans.get_data (language))
1926 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1927 set_helper_language (m_current_helper_uuid, language);
1931 void set_isf_language (int client_id)
1933 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_isf_language ()\n";
1937 if (m_recv_trans.get_data (&buf, len))
1940 m_signal_set_isf_language (lang);
1947 void set_ise_imdata (int client_id)
1949 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_imdata ()\n";
1950 char *imdata = NULL;
1953 if (m_recv_trans.get_data (&imdata, len))
1955 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1956 set_helper_imdata (m_current_helper_uuid, imdata, len);
1963 void get_ise_imdata (int client_id)
1965 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_imdata ()\n";
1966 char *imdata = NULL;
1970 TOOLBAR_MODE_T mode;
1972 mode = m_current_toolbar_mode;
1974 if (TOOLBAR_HELPER_MODE == mode)
1976 ret = get_helper_imdata (m_current_helper_uuid, &imdata, len);
1980 Socket client_socket (client_id);
1983 trans.put_command (SCIM_TRANS_CMD_REPLY);
1986 trans.put_command (SCIM_TRANS_CMD_OK);
1987 trans.put_data (imdata, len);
1990 trans.put_command (SCIM_TRANS_CMD_FAIL);
1992 trans.write_to_socket (client_socket);
1998 void get_ise_layout (int client_id)
2000 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_layout ()\n";
2004 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2006 if (TOOLBAR_HELPER_MODE == mode)
2007 ret = get_helper_layout (m_current_helper_uuid, layout);
2010 Socket client_socket (client_id);
2013 trans.put_command (SCIM_TRANS_CMD_REPLY);
2015 trans.put_command (SCIM_TRANS_CMD_OK);
2016 trans.put_data (layout);
2018 trans.put_command (SCIM_TRANS_CMD_FAIL);
2021 trans.write_to_socket (client_socket);
2024 bool get_ise_layout_list (std::vector<uint32> &list)
2028 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2030 if (TOOLBAR_HELPER_MODE == mode)
2031 ret = get_helper_layout_list (m_current_helper_uuid, list);
2036 void get_active_ise_name (int client_id)
2038 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_active_ise_name ()\n";
2040 Socket client_socket (client_id);
2041 char *name = const_cast<char *> (m_current_ise_name.c_str ());
2042 size_t len = strlen (name) + 1;
2045 trans.put_command (SCIM_TRANS_CMD_REPLY);
2046 trans.put_command (SCIM_TRANS_CMD_OK);
2047 trans.put_data (name, len);
2048 trans.write_to_socket (client_socket);
2051 void get_ise_list (int client_id)
2053 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_list ()\n";
2054 std::vector<String> strlist;
2055 m_signal_get_ise_list (strlist);
2058 Socket client_socket (client_id);
2064 trans.put_command (SCIM_TRANS_CMD_REPLY);
2065 trans.put_command (SCIM_TRANS_CMD_OK);
2067 num = strlist.size ();
2068 trans.put_data (num);
2069 for (unsigned int i = 0; i < num; i++)
2071 buf = const_cast<char *>(strlist[i].c_str ());
2072 len = strlen (buf) + 1;
2073 trans.put_data (buf, len);
2076 trans.write_to_socket (client_socket);
2079 void get_language_list (int client_id)
2081 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_language_list ()\n";
2082 std::vector<String> strlist;
2084 m_signal_get_language_list (strlist);
2087 Socket client_socket (client_id);
2093 trans.put_command (SCIM_TRANS_CMD_REPLY);
2094 trans.put_command (SCIM_TRANS_CMD_OK);
2096 num = strlist.size ();
2097 trans.put_data (num);
2098 for (unsigned int i = 0; i < num; i++)
2100 buf = const_cast<char *>(strlist[i].c_str ());
2101 len = strlen (buf) + 1;
2102 trans.put_data (buf, len);
2105 trans.write_to_socket (client_socket);
2108 void get_all_language (int client_id)
2110 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_all_language ()\n";
2111 std::vector<String> strlist;
2113 m_signal_get_all_language (strlist);
2116 Socket client_socket (client_id);
2122 trans.put_command (SCIM_TRANS_CMD_REPLY);
2123 trans.put_command (SCIM_TRANS_CMD_OK);
2125 num = strlist.size ();
2126 trans.put_data (num);
2127 for (unsigned int i = 0; i < num; i++)
2129 buf = const_cast<char *>(strlist[i].c_str ());
2130 len = strlen (buf) + 1;
2131 trans.put_data (buf, len);
2134 trans.write_to_socket (client_socket);
2137 void get_ise_language (int client_id)
2139 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_language ()\n";
2140 std::vector<String> strlist;
2144 Socket client_socket (client_id);
2146 if (!(m_recv_trans.get_data (&buf, len)))
2149 trans.put_command (SCIM_TRANS_CMD_REPLY);
2150 trans.put_command (SCIM_TRANS_CMD_FAIL);
2151 trans.write_to_socket (client_socket);
2157 m_signal_get_ise_language (buf, strlist);
2168 trans.put_command (SCIM_TRANS_CMD_REPLY);
2169 trans.put_command (SCIM_TRANS_CMD_OK);
2171 num = strlist.size ();
2172 trans.put_data (num);
2173 for (unsigned int i = 0; i < num; i++)
2175 buf = const_cast<char *>(strlist[i].c_str ());
2176 len = strlen (buf) + 1;
2177 trans.put_data (buf, len);
2180 trans.write_to_socket (client_socket);
2183 bool reset_ise_option (int client_id)
2185 SCIM_DEBUG_MAIN(1) << "PanelAgent::resect_ise_option ()\n";
2192 ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
2193 if (it != m_client_context_uuids.end ()) {
2194 get_imengine_client_context (it->first, client, context);
2198 Socket client_socket (client);
2199 m_send_trans.clear ();
2200 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2201 m_send_trans.put_data ((uint32) context);
2202 m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
2203 m_send_trans.write_to_socket (client_socket);
2210 trans.put_command (SCIM_TRANS_CMD_REPLY);
2211 trans.put_command (SCIM_TRANS_CMD_OK);
2212 Socket client_socket (client_id);
2213 trans.write_to_socket (client_socket);
2218 bool find_active_ise_by_uuid (String uuid)
2220 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
2221 for (; iter != m_helper_info_repository.end (); iter++)
2223 if (!uuid.compare (iter->second.uuid))
2230 void set_active_ise_by_uuid (int client_id)
2232 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_active_ise_by_uuid ()\n";
2236 Socket client_socket (client_id);
2237 m_current_active_imcontrol_id = client_id;
2240 trans.put_command (SCIM_TRANS_CMD_REPLY);
2241 if (!(m_recv_trans.get_data (&buf, len)))
2243 trans.put_command (SCIM_TRANS_CMD_FAIL);
2244 trans.write_to_socket (client_socket);
2253 if (!m_signal_get_ise_info_by_uuid (uuid, info))
2255 trans.put_command (SCIM_TRANS_CMD_FAIL);
2256 trans.write_to_socket (client_socket);
2262 if (info.type == TOOLBAR_KEYBOARD_MODE)
2264 m_signal_set_active_ise_by_uuid (uuid, 1);
2265 trans.put_command (SCIM_TRANS_CMD_OK);
2266 trans.write_to_socket (client_socket);
2271 else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
2273 int count = _id_count--;
2274 if (info.type == TOOLBAR_HELPER_MODE)
2276 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
2277 if (uuid != m_current_helper_uuid)
2278 m_last_helper_uuid = m_current_helper_uuid;
2279 start_helper (uuid, count, DEFAULT_CONTEXT_VALUE);
2280 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
2281 if (iter == m_imcontrol_repository.end ())
2283 struct IMControlStub stub;
2284 stub.count.clear ();
2286 stub.info.push_back (info);
2287 stub.count.push_back (count);
2288 m_imcontrol_repository[client_id] = stub;
2292 iter->second.info.push_back (info);
2293 iter->second.count.push_back (count);
2298 m_signal_set_active_ise_by_uuid (uuid, 1);
2300 if (find_active_ise_by_uuid (uuid))
2302 trans.put_command (SCIM_TRANS_CMD_OK);
2303 trans.write_to_socket (client_socket);
2306 m_ise_pending_repository[uuid] = client_id;
2312 bool find_active_ise_by_name (String name)
2314 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
2315 for (; iter != m_helper_info_repository.end (); iter++)
2317 if (!name.compare (iter->second.name))
2324 void set_active_ise_by_name (int client_id)
2329 Socket client_socket (client_id);
2330 m_current_active_imcontrol_id = client_id;
2333 trans.put_command (SCIM_TRANS_CMD_REPLY);
2334 if (!(m_recv_trans.get_data (&buf, len)))
2336 trans.put_command (SCIM_TRANS_CMD_FAIL);
2337 trans.write_to_socket (client_socket);
2346 if (!m_signal_get_ise_info_by_name (name, info))
2348 trans.put_command (SCIM_TRANS_CMD_FAIL);
2349 trans.write_to_socket (client_socket);
2355 if (info.type == TOOLBAR_KEYBOARD_MODE)
2357 m_signal_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME, name);
2358 trans.put_command (SCIM_TRANS_CMD_OK);
2359 trans.write_to_socket (client_socket);
2364 else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
2366 int count = _id_count--;
2367 if (info.type == TOOLBAR_HELPER_MODE)
2369 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
2370 if (info.uuid != m_current_helper_uuid)
2371 m_last_helper_uuid = m_current_helper_uuid;
2372 start_helper (info.uuid, count, DEFAULT_CONTEXT_VALUE);
2373 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
2374 if (iter == m_imcontrol_repository.end ())
2376 struct IMControlStub stub;
2377 stub.count.clear ();
2379 stub.info.push_back (info);
2380 stub.count.push_back (count);
2381 m_imcontrol_repository[client_id] = stub;
2385 iter->second.info.push_back (info);
2386 iter->second.count.push_back (count);
2391 m_signal_set_active_ise_by_name (name);
2393 if (find_active_ise_by_name (name))
2395 trans.put_command (SCIM_TRANS_CMD_OK);
2396 trans.write_to_socket (client_socket);
2399 m_ise_pending_repository[name] = client_id;
2405 void update_isf_control_status (const bool showed)
2407 for (ClientRepository::iterator iter = m_client_repository.begin ();
2408 iter != m_client_repository.end (); ++iter)
2410 if (IMCONTROL_CLIENT == iter->second.type
2411 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
2413 Socket client_socket (iter->first);
2417 trans.put_command (SCIM_TRANS_CMD_REQUEST);
2419 trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_SHOWED);
2421 trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_HIDED);
2422 trans.write_to_socket (client_socket);
2429 void set_ise_return_key_type (int client_id)
2431 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
2434 if (m_recv_trans.get_data (type)) {
2435 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2436 set_helper_return_key_type (m_current_helper_uuid, type);
2440 void get_ise_return_key_type (int client_id)
2442 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
2446 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2448 if (TOOLBAR_HELPER_MODE == mode)
2449 ret = get_helper_return_key_type (m_current_helper_uuid, type);
2452 Socket client_socket (client_id);
2455 trans.put_command (SCIM_TRANS_CMD_REPLY);
2457 trans.put_command (SCIM_TRANS_CMD_OK);
2458 trans.put_data (type);
2460 trans.put_command (SCIM_TRANS_CMD_FAIL);
2463 trans.write_to_socket (client_socket);
2466 void set_ise_return_key_disable (int client_id)
2468 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
2471 if (m_recv_trans.get_data (disabled)) {
2472 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2473 set_helper_return_key_disable (m_current_helper_uuid, disabled);
2477 void get_ise_return_key_disable (int client_id)
2479 SCIM_DEBUG_MAIN(4) << __func__ << "\n";
2480 uint32 disabled = 0;
2483 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2485 if (TOOLBAR_HELPER_MODE == mode)
2486 ret = get_helper_return_key_disable (m_current_helper_uuid, disabled);
2489 Socket client_socket (client_id);
2492 trans.put_command (SCIM_TRANS_CMD_REPLY);
2494 trans.put_command (SCIM_TRANS_CMD_OK);
2495 trans.put_data (disabled);
2497 trans.put_command (SCIM_TRANS_CMD_FAIL);
2500 trans.write_to_socket (client_socket);
2503 int get_active_ise_list (std::vector<String> &strlist)
2506 m_helper_manager.get_active_ise_list (strlist);
2507 return (int)(strlist.size ());
2510 void reset_helper_context (const String &uuid)
2512 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
2514 if (it != m_helper_client_index.end ())
2518 Socket client_socket (it->second.id);
2521 get_focused_context (client, context);
2522 ctx = get_helper_ic (client, context);
2524 m_send_trans.clear ();
2525 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2526 m_send_trans.put_data (ctx);
2527 m_send_trans.put_data (uuid);
2528 m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_CONTEXT);
2529 m_send_trans.write_to_socket (client_socket);
2533 void reset_ise_context (int client_id)
2535 SCIM_DEBUG_MAIN(4) << "PanelAgent::reset_ise_context ()\n";
2536 TOOLBAR_MODE_T mode;
2538 mode = m_current_toolbar_mode;
2540 if (TOOLBAR_HELPER_MODE == mode)
2542 reset_helper_context (m_current_helper_uuid);
2546 void set_ise_caps_mode (int client_id)
2548 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_caps_mode ()\n";
2551 if (m_recv_trans.get_data (mode))
2553 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2554 set_helper_caps_mode (m_current_helper_uuid, mode);
2558 int send_display_name (String &name)
2560 return m_helper_manager.send_display_name (name);
2563 bool reload_config (void)
2565 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
2569 m_send_trans.clear ();
2570 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2571 m_send_trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
2573 for (ClientRepository::iterator it = m_client_repository.begin ();
2574 it != m_client_repository.end (); ++it) {
2576 if (it->second.type == IMCONTROL_ACT_CLIENT
2577 || it->second.type == IMCONTROL_CLIENT
2578 || it->second.type == HELPER_ACT_CLIENT)
2581 Socket client_socket (it->first);
2582 m_send_trans.write_to_socket (client_socket);
2591 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
2595 m_send_trans.clear ();
2596 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2597 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
2599 for (ClientRepository::iterator it = m_client_repository.begin ();
2600 it != m_client_repository.end (); ++it) {
2601 Socket client_socket (it->first);
2602 m_send_trans.write_to_socket (client_socket);
2612 bool filter_event (int fd)
2614 SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_event ()\n";
2616 return m_socket_server.filter_event (fd);
2619 bool filter_exception_event (int fd)
2621 SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_exception_event ()\n";
2623 return m_socket_server.filter_exception_event (fd);
2626 int get_server_id ()
2628 SCIM_DEBUG_MAIN (1) << "PanelAgent::get_server_id ()\n";
2630 return m_socket_server.get_id ();
2633 void set_ise_changing (bool changing)
2635 SCIM_DEBUG_MAIN (1) << "PanelAgent::set_ise_changing ()\n";
2636 m_ise_changing = changing;
2639 void update_ise_list (std::vector<String> &strList)
2641 /* send ise list to frontend */
2642 String dst_str = scim_combine_string_list (strList);
2643 m_helper_manager.send_ise_list (dst_str);
2645 /* request PanelClient to update keyboard ise list */
2646 update_keyboard_ise_list ();
2649 Connection signal_connect_reload_config (PanelAgentSlotVoid *slot)
2651 return m_signal_reload_config.connect (slot);
2654 Connection signal_connect_turn_on (PanelAgentSlotVoid *slot)
2656 return m_signal_turn_on.connect (slot);
2659 Connection signal_connect_turn_off (PanelAgentSlotVoid *slot)
2661 return m_signal_turn_off.connect (slot);
2664 Connection signal_connect_show_panel (PanelAgentSlotVoid *slot)
2666 return m_signal_show_panel.connect (slot);
2669 Connection signal_connect_hide_panel (PanelAgentSlotVoid *slot)
2671 return m_signal_hide_panel.connect (slot);
2674 Connection signal_connect_update_screen (PanelAgentSlotInt *slot)
2676 return m_signal_update_screen.connect (slot);
2679 Connection signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
2681 return m_signal_update_spot_location.connect (slot);
2684 Connection signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
2686 return m_signal_update_factory_info.connect (slot);
2689 Connection signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
2691 return m_signal_start_default_ise.connect (slot);
2694 Connection signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
2696 return m_signal_set_candidate_ui.connect (slot);
2699 Connection signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
2701 return m_signal_get_candidate_ui.connect (slot);
2704 Connection signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
2706 return m_signal_set_candidate_position.connect (slot);
2709 Connection signal_connect_get_candidate_geometry (PanelAgentSlotRect *slot)
2711 return m_signal_get_candidate_geometry.connect (slot);
2714 Connection signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
2716 return m_signal_set_keyboard_ise.connect (slot);
2719 Connection signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
2721 return m_signal_get_keyboard_ise.connect (slot);
2724 Connection signal_connect_show_help (PanelAgentSlotString *slot)
2726 return m_signal_show_help.connect (slot);
2729 Connection signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
2731 return m_signal_show_factory_menu.connect (slot);
2734 Connection signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
2736 return m_signal_show_preedit_string.connect (slot);
2739 Connection signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
2741 return m_signal_show_aux_string.connect (slot);
2744 Connection signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
2746 return m_signal_show_lookup_table.connect (slot);
2749 Connection signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
2751 return m_signal_show_associate_table.connect (slot);
2754 Connection signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
2756 return m_signal_hide_preedit_string.connect (slot);
2759 Connection signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
2761 return m_signal_hide_aux_string.connect (slot);
2764 Connection signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
2766 return m_signal_hide_lookup_table.connect (slot);
2769 Connection signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
2771 return m_signal_hide_associate_table.connect (slot);
2774 Connection signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
2776 return m_signal_update_preedit_string.connect (slot);
2779 Connection signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
2781 return m_signal_update_preedit_caret.connect (slot);
2784 Connection signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
2786 return m_signal_update_aux_string.connect (slot);
2789 Connection signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
2791 return m_signal_update_lookup_table.connect (slot);
2794 Connection signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
2796 return m_signal_update_associate_table.connect (slot);
2799 Connection signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
2801 return m_signal_register_properties.connect (slot);
2804 Connection signal_connect_update_property (PanelAgentSlotProperty *slot)
2806 return m_signal_update_property.connect (slot);
2809 Connection signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
2811 return m_signal_register_helper_properties.connect (slot);
2814 Connection signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
2816 return m_signal_update_helper_property.connect (slot);
2819 Connection signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
2821 return m_signal_register_helper.connect (slot);
2824 Connection signal_connect_remove_helper (PanelAgentSlotInt *slot)
2826 return m_signal_remove_helper.connect (slot);
2829 Connection signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
2831 return m_signal_set_active_ise_by_uuid.connect (slot);
2834 Connection signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
2836 return m_signal_set_active_ise_by_name.connect (slot);
2839 Connection signal_connect_focus_in (PanelAgentSlotVoid *slot)
2841 return m_signal_focus_in.connect (slot);
2844 Connection signal_connect_focus_out (PanelAgentSlotVoid *slot)
2846 return m_signal_focus_out.connect (slot);
2849 Connection signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
2851 return m_signal_get_ise_list.connect (slot);
2854 Connection signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
2856 return m_signal_get_keyboard_ise_list.connect (slot);
2858 Connection signal_connect_launch_helper_ise_list_selection (PanelAgentSlotInt *slot)
2860 return m_signal_launch_helper_ise_list_selection.connect (slot);
2863 Connection signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
2865 return m_signal_get_language_list.connect (slot);
2868 Connection signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
2870 return m_signal_get_all_language.connect (slot);
2873 Connection signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
2875 return m_signal_get_ise_language.connect (slot);
2878 Connection signal_connect_set_isf_language (PanelAgentSlotString *slot)
2880 return m_signal_set_isf_language.connect (slot);
2883 Connection signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
2885 return m_signal_get_ise_info_by_uuid.connect (slot);
2888 Connection signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
2890 return m_signal_get_ise_info_by_name.connect (slot);
2893 Connection signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
2895 return m_signal_send_key_event.connect (slot);
2898 Connection signal_connect_accept_connection (PanelAgentSlotInt *slot)
2900 return m_signal_accept_connection.connect (slot);
2903 Connection signal_connect_close_connection (PanelAgentSlotInt *slot)
2905 return m_signal_close_connection.connect (slot);
2908 Connection signal_connect_exit (PanelAgentSlotVoid *slot)
2910 return m_signal_exit.connect (slot);
2913 Connection signal_connect_transaction_start (PanelAgentSlotVoid *slot)
2915 return m_signal_transaction_start.connect (slot);
2918 Connection signal_connect_transaction_end (PanelAgentSlotVoid *slot)
2920 return m_signal_transaction_end.connect (slot);
2923 Connection signal_connect_lock (PanelAgentSlotVoid *slot)
2925 return m_signal_lock.connect (slot);
2928 Connection signal_connect_unlock (PanelAgentSlotVoid *slot)
2930 return m_signal_unlock.connect (slot);
2934 bool socket_check_client_connection (const Socket &client)
2936 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_check_client_connection (" << client.get_id () << ")\n";
2938 unsigned char buf [sizeof(uint32)];
2940 int nbytes = client.read_with_timeout (buf, sizeof(uint32), m_socket_timeout);
2942 if (nbytes == sizeof (uint32))
2946 SCIM_DEBUG_MAIN (4) << "Error occurred when reading socket: " << client.get_error_message () << ".\n";
2948 SCIM_DEBUG_MAIN (4) << "Timeout when reading socket.\n";
2954 void socket_accept_callback (SocketServer *server,
2955 const Socket &client)
2957 SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_accept_callback (" << client.get_id () << ")\n";
2960 if (m_should_exit) {
2961 SCIM_DEBUG_MAIN (3) << "Exit Socket Server Thread.\n";
2962 server->shutdown ();
2964 m_signal_accept_connection (client.get_id ());
2968 void socket_receive_callback (SocketServer *server,
2969 const Socket &client)
2971 int client_id = client.get_id ();
2976 bool current = false;
2979 ClientInfo client_info;
2981 SCIM_DEBUG_MAIN (1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
2983 /* If the connection is closed then close this client. */
2984 if (!socket_check_client_connection (client)) {
2985 socket_close_connection (server, client);
2989 client_info = socket_get_client_info (client_id);
2991 /* If it's a new client, then request to open the connection first. */
2992 if (client_info.type == UNKNOWN_CLIENT) {
2993 socket_open_connection (server, client);
2997 /* If can not read the transaction,
2998 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
2999 * or the key is mismatch,
3001 if (!m_recv_trans.read_from_socket (client, m_socket_timeout) ||
3002 !m_recv_trans.get_command (cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
3003 !m_recv_trans.get_data (key) || key != (uint32) client_info.key)
3006 if (client_info.type == FRONTEND_CLIENT) {
3007 if (m_recv_trans.get_data (context)) {
3008 SCIM_DEBUG_MAIN (1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
3009 socket_transaction_start();
3010 while (m_recv_trans.get_command (cmd)) {
3011 SCIM_DEBUG_MAIN (3) << "PanelAgent::cmd = " << cmd << "\n";
3013 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
3014 if (m_recv_trans.get_data (uuid)) {
3015 SCIM_DEBUG_MAIN (2) << "PanelAgent::register_input_context (" << client_id << "," << "," << context << "," << uuid << ")\n";
3016 uint32 ctx = get_helper_ic (client_id, context);
3017 m_client_context_uuids [ctx] = uuid;
3022 if (cmd == ISM_TRANS_CMD_PANEL_START_DEFAULT_ISE) {
3023 if ((m_default_ise.type == TOOLBAR_HELPER_MODE) && (m_default_ise.uuid.length () > 0))
3025 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
3026 start_helper (m_default_ise.uuid, client_id, context);
3028 else if (m_default_ise.type == TOOLBAR_KEYBOARD_MODE)
3030 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
3035 if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
3036 uint32 ctx = get_helper_ic (client_id, context);
3037 m_client_context_uuids.erase (ctx);
3038 #ifdef ONE_HELPER_ISE_PROCESS
3039 if (m_client_context_helper.find (ctx) != m_client_context_helper.end ())
3040 stop_helper (m_client_context_helper[ctx], client_id, context);
3042 if (ctx == get_helper_ic (m_current_socket_client, m_current_client_context))
3045 m_current_socket_client = m_last_socket_client;
3046 m_current_client_context = m_last_client_context;
3047 m_current_context_uuid = m_last_context_uuid;
3048 m_last_socket_client = -1;
3049 m_last_client_context = 0;
3050 m_last_context_uuid = String ("");
3051 if (m_current_socket_client == -1)
3054 socket_update_control_panel ();
3059 else if (ctx == get_helper_ic (m_last_socket_client, m_last_client_context))
3062 m_last_socket_client = -1;
3063 m_last_client_context = 0;
3064 m_last_context_uuid = String ("");
3070 if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
3071 socket_reset_input_context (client_id, context);
3075 if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
3076 get_helper_ic (client_id, context);
3077 m_signal_focus_in ();
3078 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3079 focus_in_helper (m_current_helper_uuid, client_id, context);
3080 #ifdef ONE_HELPER_ISE_PROCESS
3081 uint32 ctx = get_helper_ic (client_id, context);
3082 ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
3083 if (it != m_client_context_helper.end ())
3085 if (m_should_shared_ise)
3087 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3089 if (m_current_helper_uuid != it->second)
3091 stop_helper (it->second, client_id, context);
3092 start_helper (m_current_helper_uuid, client_id, context);
3094 focus_in_helper (m_current_helper_uuid, client_id, context);
3096 else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
3097 stop_helper (it->second, client_id, context);
3101 /* focus in the helper if the context is associated with some helper */
3102 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
3103 m_current_helper_uuid = it->second;
3104 focus_in_helper (m_current_helper_uuid, client_id, context);
3109 if (m_should_shared_ise)
3111 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3113 start_helper (m_current_helper_uuid, client_id, context);
3114 focus_in_helper (m_current_helper_uuid, client_id, context);
3119 /* come here if the context is associated with some imengine */
3120 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
3124 if (m_recv_trans.get_data (uuid)) {
3125 SCIM_DEBUG_MAIN (2) << "PanelAgent::focus_in (" << client_id << "," << "," << context << "," << uuid << ")\n";
3127 if (m_current_socket_client >= 0) {
3128 m_last_socket_client = m_current_socket_client;
3129 m_last_client_context = m_current_client_context;
3130 m_last_context_uuid = m_current_context_uuid;
3132 m_current_socket_client = client_id;
3133 m_current_client_context = context;
3134 m_current_context_uuid = uuid;
3140 if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
3141 socket_turn_on_log ();
3145 current = last = false;
3148 /* Get the context uuid from the client context registration table. */
3150 ClientContextUUIDRepository::iterator it = m_client_context_uuids.find (get_helper_ic (client_id, context));
3151 if (it != m_client_context_uuids.end ())
3155 if (m_current_socket_client == client_id && m_current_client_context == context) {
3157 if (!uuid.length ()) uuid = m_current_context_uuid;
3158 } else if (m_last_socket_client == client_id && m_last_client_context == context) {
3160 if (!uuid.length ()) uuid = m_last_context_uuid;
3163 /* Skip to the next command and continue, if it's not current or last focused. */
3164 if (!uuid.length ()) {
3165 SCIM_DEBUG_MAIN (3) << "PanelAgent:: Couldn't find context uuid.\n";
3166 while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
3167 m_recv_trans.skip_data ();
3171 if (cmd == SCIM_TRANS_CMD_START_HELPER) {
3172 socket_start_helper (client_id, context, uuid);
3175 else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
3176 socket_send_helper_event (client_id, context, uuid);
3179 else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
3180 socket_stop_helper (client_id, context, uuid);
3184 /* If it's not focused, just continue. */
3185 if ((!current && !last) || (last && m_current_socket_client >= 0)) {
3186 SCIM_DEBUG_MAIN (3) << "PanelAgent::Not current focused.\n";
3187 while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
3188 m_recv_trans.skip_data ();
3192 /* Client must focus in before do any other things. */
3193 if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
3195 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
3197 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN)
3198 socket_update_screen ();
3199 else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION)
3200 socket_update_spot_location ();
3201 else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION)
3202 socket_update_cursor_position ();
3203 else if (cmd == ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT)
3204 socket_update_surrounding_text ();
3205 else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO)
3206 socket_update_factory_info ();
3207 else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
3208 socket_show_preedit_string ();
3209 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
3210 socket_show_aux_string ();
3211 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
3212 socket_show_lookup_table ();
3213 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
3214 socket_show_associate_table ();
3215 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
3216 socket_hide_preedit_string ();
3217 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
3218 socket_hide_aux_string ();
3219 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
3220 socket_hide_lookup_table ();
3221 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
3222 socket_hide_associate_table ();
3223 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING)
3224 socket_update_preedit_string ();
3225 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET)
3226 socket_update_preedit_caret ();
3227 else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING)
3228 socket_update_aux_string ();
3229 else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE)
3230 socket_update_lookup_table ();
3231 else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE)
3232 socket_update_associate_table ();
3233 else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES)
3234 socket_register_properties ();
3235 else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY)
3236 socket_update_property ();
3237 else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP)
3238 socket_show_help ();
3239 else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU)
3240 socket_show_factory_menu ();
3241 else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
3242 m_signal_focus_out ();
3244 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
3246 if (TOOLBAR_HELPER_MODE == mode)
3247 focus_out_helper (m_current_helper_uuid, client_id, context);
3249 if (m_current_socket_client >= 0) {
3250 m_last_socket_client = m_current_socket_client;
3251 m_last_client_context = m_current_client_context;
3252 m_last_context_uuid = m_current_context_uuid;
3254 m_current_socket_client = -1;
3255 m_current_client_context = 0;
3256 m_current_context_uuid = String ("");
3260 socket_transaction_end ();
3262 } else if (client_info.type == HELPER_CLIENT) {
3263 socket_transaction_start ();
3264 while (m_recv_trans.get_command (cmd)) {
3265 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
3266 socket_helper_register_helper (client_id);
3269 socket_transaction_end ();
3270 }else if (client_info.type == HELPER_ACT_CLIENT) {
3271 socket_transaction_start ();
3272 while (m_recv_trans.get_command (cmd)) {
3273 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
3274 socket_helper_register_helper_passive (client_id);
3275 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
3276 socket_helper_commit_string (client_id);
3277 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
3278 socket_helper_show_preedit_string (client_id);
3279 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
3280 socket_show_aux_string ();
3281 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
3282 socket_show_lookup_table ();
3283 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
3284 socket_show_associate_table ();
3285 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
3286 socket_helper_hide_preedit_string (client_id);
3287 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
3288 socket_hide_aux_string ();
3289 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
3290 socket_hide_lookup_table ();
3291 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
3292 socket_hide_associate_table ();
3293 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
3294 socket_helper_update_preedit_string (client_id);
3295 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
3296 socket_update_aux_string ();
3297 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
3298 socket_update_lookup_table ();
3299 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
3300 socket_update_associate_table ();
3301 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
3302 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
3303 socket_helper_send_key_event (client_id);
3304 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
3305 socket_helper_forward_key_event (client_id);
3306 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
3307 socket_helper_send_imengine_event (client_id);
3308 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
3309 socket_helper_register_properties (client_id);
3310 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
3311 socket_helper_update_property (client_id);
3312 } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
3314 m_signal_reload_config ();
3315 } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_HIDED) {
3316 socket_helper_update_state_hided (client_id);
3317 } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_SHOWED) {
3318 socket_helper_update_state_showed (client_id);
3319 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
3320 socket_helper_update_input_context (client_id);
3321 } else if (cmd == ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL) {
3322 socket_helper_commit_ise_result_to_imcontrol (client_id);
3323 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
3324 socket_get_keyboard_ise_list ();
3325 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
3326 socket_set_candidate_ui ();
3327 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
3328 socket_get_candidate_ui ();
3329 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
3330 socket_set_candidate_position ();
3331 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
3332 socket_hide_candidate ();
3333 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
3334 socket_get_candidate_geometry ();
3335 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME) {
3336 socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME);
3337 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
3338 socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID);
3339 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
3340 socket_get_keyboard_ise ();
3341 } else if (cmd == ISM_TRANS_CMD_LAUNCH_HELPER_ISE_LIST_SELECTION) {
3342 socket_helper_launch_helper_ise_list_selection ();
3343 } else if (cmd == SCIM_TRANS_CMD_GET_SURROUNDING_TEXT) {
3344 socket_helper_get_surrounding_text (client_id);
3345 } else if (cmd == SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT) {
3346 socket_helper_delete_surrounding_text (client_id);
3349 socket_transaction_end ();
3351 else if (client_info.type == IMCONTROL_ACT_CLIENT)
3353 socket_transaction_start ();
3355 while (m_recv_trans.get_command (cmd))
3357 if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL)
3358 show_isf_panel (client_id);
3359 else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL)
3360 hide_isf_panel (client_id);
3361 else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL)
3362 show_ise_panel (client_id);
3363 else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL)
3364 hide_ise_panel (client_id);
3365 else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY)
3366 get_ise_geometry (client_id);
3367 else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY)
3368 get_candidate_window_geometry (client_id);
3369 else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE)
3370 get_ise_language_locale (client_id);
3371 else if (cmd == ISM_TRANS_CMD_SET_ISE_MODE)
3372 set_ise_mode (client_id);
3373 else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE)
3374 set_ise_language (client_id);
3375 else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA)
3376 set_ise_imdata (client_id);
3377 else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA)
3378 get_ise_imdata (client_id);
3379 else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_NAME)
3380 get_active_ise_name (client_id);
3381 else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_NAME)
3382 set_active_ise_by_name (client_id);
3383 else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID)
3384 set_active_ise_by_uuid (client_id);
3385 else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE)
3386 set_ise_return_key_type (client_id);
3387 else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE)
3388 get_ise_return_key_type (client_id);
3389 else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE)
3390 set_ise_return_key_disable (client_id);
3391 else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE)
3392 get_ise_return_key_disable (client_id);
3393 else if (cmd == ISM_TRANS_CMD_GET_LAYOUT)
3394 get_ise_layout (client_id);
3395 else if (cmd == ISM_TRANS_CMD_SET_LAYOUT)
3396 set_ise_layout (client_id);
3397 else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE)
3398 set_ise_caps_mode (client_id);
3399 else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST)
3400 get_ise_list (client_id);
3401 else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION)
3402 reset_ise_option (client_id);
3403 else if (cmd == ISM_TRANS_CMD_GET_LANGUAGE_LIST)
3404 get_language_list (client_id);
3405 else if (cmd == ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST)
3406 get_all_language (client_id);
3407 else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE)
3408 get_ise_language (client_id);
3409 else if (cmd == ISM_TRANS_CMD_SET_ISF_LANGUAGE)
3410 set_isf_language (client_id);
3411 else if (cmd == ISM_TRANS_CMD_RESET_ISE_CONTEXT)
3412 reset_ise_context (client_id);
3415 socket_transaction_end ();
3419 void socket_exception_callback (SocketServer *server,
3420 const Socket &client)
3422 SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_exception_callback (" << client.get_id () << ")\n";
3424 socket_close_connection (server, client);
3427 bool socket_open_connection (SocketServer *server,
3428 const Socket &client)
3430 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_open_connection (" << client.get_id () << ")\n";
3433 String type = scim_socket_accept_connection (key,
3435 String ("FrontEnd,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
3439 if (type.length ()) {
3442 info.type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3443 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3444 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3445 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT))));
3447 SCIM_DEBUG_MAIN (4) << "Add client to repository. Type=" << type << " key=" << key << "\n";
3449 m_client_repository [client.get_id ()] = info;
3451 if (info.type == IMCONTROL_ACT_CLIENT)
3453 m_pending_active_imcontrol_id = client.get_id ();
3455 else if (info.type == IMCONTROL_CLIENT)
3457 m_imcontrol_map [m_pending_active_imcontrol_id] = client.get_id();
3458 m_pending_active_imcontrol_id = -1;
3461 const_cast<Socket &>(client).set_nonblock_mode ();
3467 SCIM_DEBUG_MAIN (4) << "Close client connection " << client.get_id () << "\n";
3468 server->close_connection (client);
3472 void socket_close_connection (SocketServer *server,
3473 const Socket &client)
3475 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_close_connection (" << client.get_id () << ")\n";
3479 m_signal_close_connection (client.get_id ());
3481 ClientInfo client_info = socket_get_client_info (client.get_id ());
3483 m_client_repository.erase (client.get_id ());
3485 server->close_connection (client);
3487 /* Exit panel if there is no connected client anymore. */
3488 if (client_info.type != UNKNOWN_CLIENT && m_client_repository.size () == 0 && !m_should_resident) {
3489 SCIM_DEBUG_MAIN (4) << "Exit Socket Server Thread.\n";
3490 server->shutdown ();
3491 m_signal_exit.emit ();
3496 if (client_info.type == FRONTEND_CLIENT) {
3497 SCIM_DEBUG_MAIN(4) << "It's a FrontEnd client.\n";
3498 /* The focused client is closed. */
3499 if (m_current_socket_client == client.get_id ()) {
3501 m_current_socket_client = -1;
3502 m_current_client_context = 0;
3503 m_current_context_uuid = String ("");
3506 socket_transaction_start ();
3508 socket_transaction_end ();
3511 if (m_last_socket_client == client.get_id ()) {
3513 m_last_socket_client = -1;
3514 m_last_client_context = 0;
3515 m_last_context_uuid = String ("");
3519 /* Erase all associated Client Context UUIDs. */
3520 std::vector <uint32> ctx_list;
3521 ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
3522 for (; it != m_client_context_uuids.end (); ++it) {
3523 if ((it->first & 0xFFFF) == (client.get_id () & 0xFFFF))
3524 ctx_list.push_back (it->first);
3527 for (size_t i = 0; i < ctx_list.size (); ++i)
3528 m_client_context_uuids.erase (ctx_list [i]);
3530 int client_id = client.get_id ();
3532 /* Erase all helperise info associated with the client */
3534 it = m_client_context_helper.begin ();
3535 for (; it != m_client_context_helper.end (); ++it) {
3536 if ((it->first & 0xFFFF) == (client_id & 0xFFFF)) {
3537 ctx_list.push_back (it->first);
3539 /* similar to stop_helper except that it will not call get_focused_context() */
3540 String uuid = it->second;
3541 if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ()) {
3542 uint32 count = m_helper_uuid_count[uuid];
3544 m_helper_uuid_count.erase (uuid);
3546 HelperClientIndex::iterator pise = m_helper_client_index.find (uuid);
3547 if (pise != m_helper_client_index.end ())
3549 m_send_trans.clear ();
3550 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
3551 m_send_trans.put_data (it->first);
3552 m_send_trans.put_data (uuid);
3553 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
3554 m_send_trans.write_to_socket (pise->second.id);
3556 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
3560 m_helper_uuid_count[uuid] = count - 1;
3561 focus_out_helper (uuid, (it->first & 0xFFFF), ((it->first >> 16) & 0x7FFF));
3562 SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
3563 << " to " << m_helper_uuid_count[uuid] << "\n";
3569 for (size_t i = 0; i < ctx_list.size (); ++i)
3570 m_client_context_helper.erase (ctx_list [i]);
3572 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
3573 for (; iter != m_helper_info_repository.end (); iter++)
3575 if (!m_current_helper_uuid.compare (iter->second.uuid))
3576 if (!(iter->second.option & ISM_ISE_HIDE_IN_CONTROL_PANEL))
3577 socket_update_control_panel ();
3579 } else if (client_info.type == HELPER_CLIENT) {
3580 SCIM_DEBUG_MAIN(4) << "It's a Helper client.\n";
3584 HelperInfoRepository::iterator hiit = m_helper_info_repository.find (client.get_id ());
3586 if (hiit != m_helper_info_repository.end ()) {
3587 bool restart = false;
3588 String uuid = hiit->second.uuid;
3590 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
3591 if ((hiit->second.option & SCIM_HELPER_AUTO_RESTART) &&
3592 (it != m_helper_client_index.end () && it->second.ref > 0))
3595 m_helper_manager.stop_helper (hiit->second.name);
3597 m_helper_client_index.erase (uuid);
3598 m_helper_info_repository.erase (hiit);
3600 if (restart && !m_ise_exiting)
3601 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
3604 m_ise_exiting = false;
3607 socket_transaction_start ();
3608 m_signal_remove_helper (client.get_id ());
3609 socket_transaction_end ();
3610 } else if (client_info.type == HELPER_ACT_CLIENT) {
3611 SCIM_DEBUG_MAIN(4) << "It's a Helper passive client.\n";
3615 HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client.get_id ());
3616 if (hiit != m_helper_active_info_repository.end ())
3617 m_helper_active_info_repository.erase (hiit);
3620 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
3621 SCIM_DEBUG_MAIN(4) << "It's a IMCONTROL_ACT_CLIENT client.\n";
3622 int client_id = client.get_id ();
3624 if (client_id == m_current_active_imcontrol_id
3625 && TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3626 hide_helper (m_current_helper_uuid);
3628 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
3629 if (iter != m_imcontrol_repository.end ())
3631 int size = iter->second.info.size ();
3634 stop_helper ((iter->second.info)[i].uuid, (iter->second.count)[i], DEFAULT_CONTEXT_VALUE);
3635 if ((iter->second.info)[i].option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
3636 m_current_helper_uuid = m_last_helper_uuid;
3639 m_imcontrol_repository.erase (iter);
3642 IntIntRepository::iterator iter2 = m_imcontrol_map.find (client_id);
3643 if (iter2 != m_imcontrol_map.end ())
3644 m_imcontrol_map.erase (iter2);
3648 const ClientInfo & socket_get_client_info (int client)
3650 static ClientInfo null_client = { 0, UNKNOWN_CLIENT };
3652 ClientRepository::iterator it = m_client_repository.find (client);
3654 if (it != m_client_repository.end ())
3661 void socket_turn_on (void)
3663 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on ()\n";
3665 m_signal_turn_on ();
3668 void socket_turn_off (void)
3670 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_off ()\n";
3672 m_signal_turn_off ();
3675 void socket_update_screen (void)
3677 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_screen ()\n";
3680 if (m_recv_trans.get_data (num) && ((int) num) != m_current_screen) {
3681 SCIM_DEBUG_MAIN(4) << "New Screen number = " << num << "\n";
3682 m_signal_update_screen ((int) num);
3683 helper_all_update_screen ((int) num);
3684 m_current_screen = (num);
3688 void socket_update_spot_location (void)
3690 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_spot_location ()\n";
3693 if (m_recv_trans.get_data (x) && m_recv_trans.get_data (y) && m_recv_trans.get_data (top_y)) {
3694 SCIM_DEBUG_MAIN(4) << "New Spot location x=" << x << " y=" << y << "\n";
3695 m_signal_update_spot_location ((int)x, (int)y, (int)top_y);
3696 helper_all_update_spot_location ((int)x, (int)y);
3700 void socket_update_cursor_position (void)
3702 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_cursor_position ()\n";
3705 if (m_recv_trans.get_data (cursor_pos)) {
3706 SCIM_DEBUG_MAIN(4) << "New cursor position pos=" << cursor_pos << "\n";
3707 helper_all_update_cursor_position ((int)cursor_pos);
3711 void socket_update_surrounding_text (void)
3713 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
3717 if (m_recv_trans.get_data (text) && m_recv_trans.get_data (cursor)) {
3718 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
3720 if (it != m_helper_client_index.end ())
3724 Socket client_socket (it->second.id);
3729 get_focused_context (client, context);
3730 ctx = get_helper_ic (client, context);
3732 m_send_trans.clear ();
3733 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
3734 m_send_trans.put_data (ctx);
3735 m_send_trans.put_data (m_current_helper_uuid);
3736 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT);
3737 m_send_trans.put_data (text);
3738 m_send_trans.put_data (cursor);
3739 m_send_trans.write_to_socket (client_socket);
3746 void socket_update_factory_info (void)
3748 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_factory_info ()\n";
3750 PanelFactoryInfo info;
3751 if (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
3752 m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
3753 SCIM_DEBUG_MAIN(4) << "New Factory info uuid=" << info.uuid << " name=" << info.name << "\n";
3754 info.lang = scim_get_normalized_language (info.lang);
3755 m_signal_update_factory_info (info);
3759 void socket_show_help (void)
3761 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_help ()\n";
3764 if (m_recv_trans.get_data (help))
3765 m_signal_show_help (help);
3768 void socket_show_factory_menu (void)
3770 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_factory_menu ()\n";
3772 PanelFactoryInfo info;
3773 std::vector <PanelFactoryInfo> vec;
3775 while (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
3776 m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
3777 info.lang = scim_get_normalized_language (info.lang);
3778 vec.push_back (info);
3782 m_signal_show_factory_menu (vec);
3785 void socket_turn_on_log (void)
3787 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on_log ()\n";
3790 if (m_recv_trans.get_data (isOn)) {
3792 DebugOutput::enable_debug (SCIM_DEBUG_AllMask);
3793 DebugOutput::set_verbose_level (7);
3795 DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
3796 DebugOutput::set_verbose_level (0);
3800 uint32 focused_context;
3802 get_focused_context (focused_client, focused_context);
3804 if (focused_client == -1 || focused_context == 0)
3807 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3809 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
3811 if (it != m_helper_client_index.end ())
3813 Socket client_socket (it->second.id);
3816 ctx = get_helper_ic (focused_client, focused_context);
3818 m_send_trans.clear ();
3819 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
3820 m_send_trans.put_data (ctx);
3821 m_send_trans.put_data (m_current_helper_uuid);
3822 m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
3823 m_send_trans.put_data (isOn);
3824 m_send_trans.write_to_socket (client_socket);
3828 ClientInfo client_info = socket_get_client_info (focused_client);
3829 if (client_info.type == FRONTEND_CLIENT) {
3830 Socket socket_client (focused_client);
3832 m_send_trans.clear ();
3833 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
3834 m_send_trans.put_data (focused_context);
3835 m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
3836 m_send_trans.put_data (isOn);
3837 m_send_trans.write_to_socket (socket_client);
3843 void socket_show_preedit_string (void)
3845 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_preedit_string ()\n";
3846 m_signal_show_preedit_string ();
3849 void socket_show_aux_string (void)
3851 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_aux_string ()\n";
3852 m_signal_show_aux_string ();
3855 void socket_show_lookup_table (void)
3857 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_lookup_table ()\n";
3858 m_signal_show_lookup_table ();
3861 void socket_show_associate_table (void)
3863 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_associate_table ()\n";
3864 m_signal_show_associate_table ();
3867 void socket_hide_preedit_string (void)
3869 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_preedit_string ()\n";
3870 m_signal_hide_preedit_string ();
3873 void socket_hide_aux_string (void)
3875 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_aux_string ()\n";
3876 m_signal_hide_aux_string ();
3879 void socket_hide_lookup_table (void)
3881 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_lookup_table ()\n";
3882 m_signal_hide_lookup_table ();
3885 void socket_hide_associate_table (void)
3887 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_associate_table ()\n";
3888 m_signal_hide_associate_table ();
3891 void socket_update_preedit_string (void)
3893 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_string ()\n";
3896 AttributeList attrs;
3897 if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
3898 m_signal_update_preedit_string (str, attrs);
3901 void socket_update_preedit_caret (void)
3903 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_caret ()\n";
3906 if (m_recv_trans.get_data (caret))
3907 m_signal_update_preedit_caret ((int) caret);
3910 void socket_update_aux_string (void)
3912 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_aux_string ()\n";
3915 AttributeList attrs;
3916 if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
3917 m_signal_update_aux_string (str, attrs);
3920 void socket_update_lookup_table (void)
3922 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_lookup_table ()\n";
3925 if (m_recv_trans.get_data (g_isf_candidate_table))
3928 m_signal_update_lookup_table (g_isf_candidate_table);
3936 void socket_update_associate_table (void)
3938 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_associate_table ()\n";
3940 CommonLookupTable table;
3941 if (m_recv_trans.get_data (table))
3942 m_signal_update_associate_table (table);
3945 void socket_update_control_panel (void)
3947 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_control_panel ()\n";
3948 /* Check default ISE for no context app */
3949 #ifdef ONE_HELPER_ISE_PROCESS
3950 uint32 ctx = get_helper_ic (-1, 0);
3951 ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
3952 if (it != m_client_context_helper.end ())
3954 if (m_should_shared_ise)
3956 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3958 if (m_current_helper_uuid != it->second)
3960 stop_helper (it->second, -1, 0);
3961 start_helper (m_current_helper_uuid, -1, 0);
3964 else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
3965 stop_helper (it->second, -1, 0);
3969 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
3970 m_current_helper_uuid = it->second;
3975 if (m_should_shared_ise)
3977 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3978 start_helper (m_current_helper_uuid, -1, 0);
3982 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
3988 m_signal_get_keyboard_ise (name, uuid);
3990 PanelFactoryInfo info;
3991 if (name.length () > 0)
3992 info = PanelFactoryInfo (uuid, name, String (""), String (""));
3994 info = PanelFactoryInfo (String (""), String (_("English/Keyboard")), String ("C"), String (SCIM_KEYBOARD_ICON_FILE));
3995 m_signal_update_factory_info (info);
3998 void socket_register_properties (void)
4000 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_register_properties ()\n";
4002 PropertyList properties;
4004 if (m_recv_trans.get_data (properties))
4005 m_signal_register_properties (properties);
4008 void socket_update_property (void)
4010 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_property ()\n";
4013 if (m_recv_trans.get_data (property))
4014 m_signal_update_property (property);
4017 void socket_get_keyboard_ise_list (void)
4019 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise_list ()\n";
4021 std::vector<String> list;
4023 m_signal_get_keyboard_ise_list (list);
4026 if (m_recv_trans.get_data (uuid))
4028 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4029 if (it != m_helper_client_index.end ())
4033 get_focused_context (client, context);
4034 uint32 ctx = get_helper_ic (client, context);
4035 Socket socket_client (it->second.id);
4036 m_send_trans.clear ();
4037 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4038 m_send_trans.put_data (ctx);
4039 m_send_trans.put_data (uuid);
4040 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
4041 m_send_trans.put_data (list.size ());
4042 for (unsigned int i = 0; i < list.size (); i++)
4043 m_send_trans.put_data (list[i]);
4044 m_send_trans.write_to_socket (socket_client);
4049 void socket_set_candidate_ui (void)
4051 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_ui ()\n";
4054 if (m_recv_trans.get_data (style) && m_recv_trans.get_data (mode))
4056 m_signal_set_candidate_ui (style, mode);
4060 void socket_get_candidate_ui (void)
4062 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
4064 int style = 0, mode = 0;
4065 m_signal_get_candidate_ui (style, mode);
4068 if (m_recv_trans.get_data (uuid))
4070 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4071 if (it != m_helper_client_index.end ())
4075 get_focused_context (client, context);
4076 uint32 ctx = get_helper_ic (client, context);
4077 Socket socket_client (it->second.id);
4078 m_send_trans.clear ();
4079 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4080 m_send_trans.put_data (ctx);
4081 m_send_trans.put_data (uuid);
4082 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
4083 m_send_trans.put_data (style);
4084 m_send_trans.put_data (mode);
4085 m_send_trans.write_to_socket (socket_client);
4090 void socket_set_candidate_position (void)
4092 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_position ()\n";
4095 if (m_recv_trans.get_data (left) && m_recv_trans.get_data (top))
4097 m_signal_set_candidate_position (left, top);
4101 void socket_hide_candidate (void)
4103 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_candidate ()\n";
4105 m_signal_hide_preedit_string ();
4106 m_signal_hide_aux_string ();
4107 m_signal_hide_lookup_table ();
4108 m_signal_hide_associate_table ();
4111 void socket_get_candidate_geometry (void)
4113 SCIM_DEBUG_MAIN(4) << __func__ << " \n";
4115 struct rectinfo info;
4120 m_signal_get_candidate_geometry (info);
4123 if (m_recv_trans.get_data (uuid))
4125 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4126 if (it != m_helper_client_index.end ())
4130 get_focused_context (client, context);
4131 uint32 ctx = get_helper_ic (client, context);
4132 Socket socket_client (it->second.id);
4133 m_send_trans.clear ();
4134 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4135 m_send_trans.put_data (ctx);
4136 m_send_trans.put_data (uuid);
4137 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY);
4138 m_send_trans.put_data (info.pos_x);
4139 m_send_trans.put_data (info.pos_y);
4140 m_send_trans.put_data (info.width);
4141 m_send_trans.put_data (info.height);
4142 m_send_trans.write_to_socket (socket_client);
4147 void socket_set_keyboard_ise (int type)
4149 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_keyboard_ise ()\n";
4152 if (m_recv_trans.get_data (ise))
4153 m_signal_set_keyboard_ise (type, ise);
4156 void socket_helper_launch_helper_ise_list_selection (void)
4159 if (m_recv_trans.get_data (withUI))
4160 m_signal_launch_helper_ise_list_selection (withUI);
4163 void socket_get_keyboard_ise (void)
4165 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise ()\n";
4167 String ise_name, ise_uuid;
4172 get_focused_context (client, context);
4173 ctx = get_helper_ic (client, context);
4175 if (m_client_context_uuids.find (ctx) != m_client_context_uuids.end ())
4176 ise_uuid = m_client_context_uuids[ctx];
4177 m_signal_get_keyboard_ise (ise_name, ise_uuid);
4180 if (m_recv_trans.get_data (uuid))
4182 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4183 if (it != m_helper_client_index.end ())
4187 get_focused_context (client, context);
4188 uint32 ctx = get_helper_ic (client, context);
4189 Socket socket_client (it->second.id);
4190 m_send_trans.clear ();
4191 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4192 m_send_trans.put_data (ctx);
4193 m_send_trans.put_data (uuid);
4194 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
4195 m_send_trans.put_data (ise_name);
4196 m_send_trans.put_data (ise_uuid);
4197 m_send_trans.write_to_socket (socket_client);
4202 void socket_start_helper (int client, uint32 context, const String &ic_uuid)
4204 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
4207 if (m_recv_trans.get_data (uuid) && uuid.length ()) {
4208 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4212 uint32 ic = get_helper_ic (client, context);
4214 SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
4216 if (it == m_helper_client_index.end ()) {
4217 SCIM_DEBUG_MAIN(5) << "Run this Helper.\n";
4218 m_start_helper_ic_index [uuid].push_back (std::make_pair (ic, ic_uuid));
4219 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
4221 SCIM_DEBUG_MAIN(5) << "Increase the Reference count.\n";
4222 Socket client_socket (it->second.id);
4223 m_send_trans.clear ();
4224 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4225 m_send_trans.put_data (ic);
4226 m_send_trans.put_data (ic_uuid);
4227 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
4228 m_send_trans.write_to_socket (client_socket);
4236 void socket_stop_helper (int client, uint32 context, const String &ic_uuid)
4238 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
4241 if (m_recv_trans.get_data (uuid) && uuid.length ()) {
4242 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4246 uint32 ic = get_helper_ic (client, context);
4248 SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
4250 if (it != m_helper_client_index.end ()) {
4251 SCIM_DEBUG_MAIN(5) << "Decrase the Reference count.\n";
4253 Socket client_socket (it->second.id);
4254 m_send_trans.clear ();
4255 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4256 m_send_trans.put_data (ic);
4257 m_send_trans.put_data (ic_uuid);
4258 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
4259 if (it->second.ref <= 0)
4260 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
4261 m_send_trans.write_to_socket (client_socket);
4268 void socket_send_helper_event (int client, uint32 context, const String &ic_uuid)
4270 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
4273 if (m_recv_trans.get_data (uuid) && m_recv_trans.get_data (m_nest_trans) &&
4274 uuid.length () && m_nest_trans.valid ()) {
4275 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4276 if (it != m_helper_client_index.end ()) {
4277 Socket client_socket (it->second.id);
4281 m_send_trans.clear ();
4282 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4284 /* FIXME: We presume that client and context are both less than 65536.
4285 * Hopefully, it should be true in any UNIXs.
4286 * So it's ok to combine client and context into one uint32. */
4287 m_send_trans.put_data (get_helper_ic (client, context));
4288 m_send_trans.put_data (ic_uuid);
4289 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
4290 m_send_trans.put_data (m_nest_trans);
4291 m_send_trans.write_to_socket (client_socket);
4298 void socket_helper_register_properties (int client)
4300 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_properties (" << client << ")\n";
4302 PropertyList properties;
4303 if (m_recv_trans.get_data (properties))
4304 m_signal_register_helper_properties (client, properties);
4307 void socket_helper_update_property (int client)
4309 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_property (" << client << ")\n";
4312 if (m_recv_trans.get_data (property))
4313 m_signal_update_helper_property (client, property);
4316 void socket_helper_send_imengine_event (int client)
4318 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
4323 HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client);
4325 if (m_recv_trans.get_data (target_ic) &&
4326 m_recv_trans.get_data (target_uuid) &&
4327 m_recv_trans.get_data (m_nest_trans) &&
4328 m_nest_trans.valid () &&
4329 hiit != m_helper_active_info_repository.end ()) {
4332 uint32 target_context;
4334 get_imengine_client_context (target_ic, target_client, target_context);
4337 uint32 focused_context;
4338 String focused_uuid;
4340 focused_uuid = get_focused_context (focused_client, focused_context);
4342 if (target_ic == (uint32) (-1)) {
4343 target_client = focused_client;
4344 target_context = focused_context;
4347 if (target_uuid.length () == 0)
4348 target_uuid = focused_uuid;
4350 ClientInfo client_info = socket_get_client_info (target_client);
4352 SCIM_DEBUG_MAIN(5) << "Target UUID = " << target_uuid << " Focused UUId = " << focused_uuid << "\nTarget Client = " << target_client << "\n";
4354 if (client_info.type == FRONTEND_CLIENT) {
4355 Socket socket_client (target_client);
4357 m_send_trans.clear ();
4358 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4359 m_send_trans.put_data (target_context);
4360 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
4361 m_send_trans.put_data (target_uuid);
4362 m_send_trans.put_data (hiit->second.uuid);
4363 m_send_trans.put_data (m_nest_trans);
4364 m_send_trans.write_to_socket (socket_client);
4370 void socket_helper_key_event_op (int client, int cmd)
4376 if (m_recv_trans.get_data (target_ic) &&
4377 m_recv_trans.get_data (target_uuid) &&
4378 m_recv_trans.get_data (key) &&
4382 uint32 target_context;
4384 get_imengine_client_context (target_ic, target_client, target_context);
4387 uint32 focused_context;
4388 String focused_uuid;
4390 focused_uuid = get_focused_context (focused_client, focused_context);
4392 if (target_ic == (uint32) (-1)) {
4393 target_client = focused_client;
4394 target_context = focused_context;
4397 if (target_uuid.length () == 0)
4398 target_uuid = focused_uuid;
4400 if (target_client == -1)
4402 /* FIXUP: monitor 'Invalid Window' error */
4403 std::cerr << "focused target client is NULL" << "\n";
4405 else if (target_client == focused_client &&
4406 target_context == focused_context &&
4407 target_uuid == focused_uuid)
4409 ClientInfo client_info = socket_get_client_info (target_client);
4410 if (client_info.type == FRONTEND_CLIENT) {
4411 Socket socket_client (target_client);
4413 m_send_trans.clear ();
4414 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4415 m_send_trans.put_data (target_context);
4416 m_send_trans.put_command (cmd);
4417 m_send_trans.put_data (key);
4418 m_send_trans.write_to_socket (socket_client);
4425 void socket_helper_send_key_event (int client)
4427 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_key_event (" << client << ")\n";
4428 ISF_PROF_DEBUG("first message")
4430 socket_helper_key_event_op (client, SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
4433 void socket_helper_forward_key_event (int client)
4435 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_forward_key_event (" << client << ")\n";
4437 socket_helper_key_event_op (client, SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
4440 void socket_helper_commit_string (int client)
4442 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_string (" << client << ")\n";
4448 if (m_recv_trans.get_data (target_ic) &&
4449 m_recv_trans.get_data (target_uuid) &&
4450 m_recv_trans.get_data (wstr) &&
4454 uint32 target_context;
4456 get_imengine_client_context (target_ic, target_client, target_context);
4459 uint32 focused_context;
4460 String focused_uuid;
4462 focused_uuid = get_focused_context (focused_client, focused_context);
4464 if (target_ic == (uint32) (-1)) {
4465 target_client = focused_client;
4466 target_context = focused_context;
4469 if (target_uuid.length () == 0)
4470 target_uuid = focused_uuid;
4472 if (target_client == focused_client &&
4473 target_context == focused_context &&
4474 target_uuid == focused_uuid) {
4475 ClientInfo client_info = socket_get_client_info (target_client);
4476 if (client_info.type == FRONTEND_CLIENT) {
4477 Socket socket_client (target_client);
4479 m_send_trans.clear ();
4480 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4481 m_send_trans.put_data (target_context);
4482 m_send_trans.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
4483 m_send_trans.put_data (wstr);
4484 m_send_trans.write_to_socket (socket_client);
4491 void socket_helper_get_surrounding_text (int client)
4493 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
4496 uint32 maxlen_before;
4497 uint32 maxlen_after;
4499 if (m_recv_trans.get_data (uuid) &&
4500 m_recv_trans.get_data (maxlen_before) &&
4501 m_recv_trans.get_data (maxlen_after)) {
4504 uint32 focused_context;
4505 String focused_uuid;
4507 focused_uuid = get_focused_context (focused_client, focused_context);
4509 ClientInfo client_info = socket_get_client_info (focused_client);
4510 if (client_info.type == FRONTEND_CLIENT) {
4511 Socket socket_client (focused_client);
4513 m_send_trans.clear ();
4514 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4515 m_send_trans.put_data (focused_context);
4516 m_send_trans.put_command (SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
4517 m_send_trans.put_data (maxlen_before);
4518 m_send_trans.put_data (maxlen_after);
4519 m_send_trans.write_to_socket (socket_client);
4525 void socket_helper_delete_surrounding_text (int client)
4527 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << " (" << client << ")\n";
4532 if (m_recv_trans.get_data (offset) && m_recv_trans.get_data (len)) {
4535 uint32 focused_context;
4536 String focused_uuid;
4538 focused_uuid = get_focused_context (focused_client, focused_context);
4540 ClientInfo client_info = socket_get_client_info (focused_client);
4541 if (client_info.type == FRONTEND_CLIENT) {
4542 Socket socket_client (focused_client);
4544 m_send_trans.clear ();
4545 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4546 m_send_trans.put_data (focused_context);
4547 m_send_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
4548 m_send_trans.put_data (offset);
4549 m_send_trans.put_data (len);
4550 m_send_trans.write_to_socket (socket_client);
4556 void socket_helper_show_preedit_string (int client)
4558 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_show_preedit_string (" << client << ")\n";
4563 if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
4565 uint32 target_context;
4567 get_imengine_client_context (target_ic, target_client, target_context);
4570 uint32 focused_context;
4571 String focused_uuid;
4573 focused_uuid = get_focused_context (focused_client, focused_context);
4575 if (target_ic == (uint32) (-1)) {
4576 target_client = focused_client;
4577 target_context = focused_context;
4580 if (target_uuid.length () == 0)
4581 target_uuid = focused_uuid;
4583 if (target_client == focused_client &&
4584 target_context == focused_context &&
4585 target_uuid == focused_uuid) {
4586 ClientInfo client_info = socket_get_client_info (target_client);
4587 if (client_info.type == FRONTEND_CLIENT) {
4588 Socket socket_client (target_client);
4590 m_send_trans.clear ();
4591 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4592 m_send_trans.put_data (target_context);
4593 m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
4594 m_send_trans.write_to_socket (socket_client);
4601 void socket_helper_hide_preedit_string (int client)
4603 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_hide_preedit_string (" << client << ")\n";
4608 if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
4610 uint32 target_context;
4612 get_imengine_client_context (target_ic, target_client, target_context);
4615 uint32 focused_context;
4616 String focused_uuid;
4618 focused_uuid = get_focused_context (focused_client, focused_context);
4620 if (target_ic == (uint32) (-1)) {
4621 target_client = focused_client;
4622 target_context = focused_context;
4625 if (target_uuid.length () == 0)
4626 target_uuid = focused_uuid;
4628 if (target_client == focused_client &&
4629 target_context == focused_context &&
4630 target_uuid == focused_uuid) {
4631 ClientInfo client_info = socket_get_client_info (target_client);
4632 if (client_info.type == FRONTEND_CLIENT) {
4633 Socket socket_client (target_client);
4635 m_send_trans.clear ();
4636 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4637 m_send_trans.put_data (target_context);
4638 m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
4639 m_send_trans.write_to_socket (socket_client);
4646 void socket_helper_update_preedit_string (int client)
4648 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_preedit_string (" << client << ")\n";
4653 AttributeList attrs;
4655 if (m_recv_trans.get_data (target_ic) &&
4656 m_recv_trans.get_data (target_uuid) &&
4657 m_recv_trans.get_data (wstr) && wstr.length () &&
4658 m_recv_trans.get_data (attrs)) {
4661 uint32 target_context;
4663 get_imengine_client_context (target_ic, target_client, target_context);
4666 uint32 focused_context;
4667 String focused_uuid;
4669 focused_uuid = get_focused_context (focused_client, focused_context);
4671 if (target_ic == (uint32) (-1)) {
4672 target_client = focused_client;
4673 target_context = focused_context;
4676 if (target_uuid.length () == 0)
4677 target_uuid = focused_uuid;
4679 if (target_client == focused_client &&
4680 target_context == focused_context &&
4681 target_uuid == focused_uuid) {
4682 ClientInfo client_info = socket_get_client_info (target_client);
4683 if (client_info.type == FRONTEND_CLIENT) {
4684 Socket socket_client (target_client);
4686 m_send_trans.clear ();
4687 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4688 m_send_trans.put_data (target_context);
4689 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
4690 m_send_trans.put_data (wstr);
4691 m_send_trans.put_data (attrs);
4692 m_send_trans.write_to_socket (socket_client);
4700 void socket_helper_register_helper (int client)
4702 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper (" << client << ")\n";
4706 bool result = false;
4710 Socket socket_client (client);
4711 m_send_trans.clear ();
4712 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4714 if (m_recv_trans.get_data (info.uuid) &&
4715 m_recv_trans.get_data (info.name) &&
4716 m_recv_trans.get_data (info.icon) &&
4717 m_recv_trans.get_data (info.description) &&
4718 m_recv_trans.get_data (info.option) &&
4719 info.uuid.length () &&
4720 info.name.length ()) {
4722 SCIM_DEBUG_MAIN(4) << "New Helper uuid=" << info.uuid << " name=" << info.name << "\n";
4724 HelperClientIndex::iterator it = m_helper_client_index.find (info.uuid);
4726 if (it == m_helper_client_index.end ()) {
4727 m_helper_info_repository [client] = info;
4728 m_helper_client_index [info.uuid] = HelperClientStub (client, 1);
4729 m_send_trans.put_command (SCIM_TRANS_CMD_OK);
4731 StartHelperICIndex::iterator icit = m_start_helper_ic_index.find (info.uuid);
4733 if (icit != m_start_helper_ic_index.end ()) {
4734 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
4735 for (size_t i = 0; i < icit->second.size (); ++i) {
4736 m_send_trans.put_data (icit->second [i].first);
4737 m_send_trans.put_data (icit->second [i].second);
4739 m_start_helper_ic_index.erase (icit);
4742 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
4743 m_send_trans.put_data ((uint32)m_current_screen);
4747 m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
4751 m_send_trans.write_to_socket (socket_client);
4756 m_signal_register_helper (client, info);
4759 void socket_helper_register_helper_passive (int client)
4761 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper_passive (" << client << ")\n";
4767 if (m_recv_trans.get_data (info.uuid) &&
4768 m_recv_trans.get_data (info.name) &&
4769 m_recv_trans.get_data (info.icon) &&
4770 m_recv_trans.get_data (info.description) &&
4771 m_recv_trans.get_data (info.option) &&
4772 info.uuid.length () &&
4773 info.name.length ()) {
4775 SCIM_DEBUG_MAIN(4) << "New Helper Passive uuid=" << info.uuid << " name=" << info.name << "\n";
4777 HelperInfoRepository::iterator it = m_helper_active_info_repository.find (client);
4778 if (it == m_helper_active_info_repository.end ()) {
4779 m_helper_active_info_repository[client] = info;
4782 StringIntRepository::iterator iter = m_ise_pending_repository.find (info.uuid);
4783 if (iter != m_ise_pending_repository.end ())
4786 Socket client_socket (iter->second);
4788 trans.put_command (SCIM_TRANS_CMD_REPLY);
4789 trans.put_command (SCIM_TRANS_CMD_OK);
4790 trans.write_to_socket (client_socket);
4791 m_ise_pending_repository.erase (iter);
4794 iter = m_ise_pending_repository.find (info.name);
4795 if (iter != m_ise_pending_repository.end ())
4798 Socket client_socket (iter->second);
4800 trans.put_command (SCIM_TRANS_CMD_REPLY);
4801 trans.put_command (SCIM_TRANS_CMD_OK);
4802 trans.write_to_socket (client_socket);
4803 m_ise_pending_repository.erase (iter);
4806 if (m_current_active_imcontrol_id != -1 &&
4807 m_ise_settings != NULL && m_ise_changing)
4809 show_helper (info.uuid, m_ise_settings, m_ise_settings_len);
4810 m_ise_changing = false;
4817 void socket_helper_update_state_hided (int client)
4819 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_hided (" << client << ")\n";
4821 ClientRepository::iterator iter = m_client_repository.begin ();
4823 for (; iter != m_client_repository.end (); iter++)
4825 if (IMCONTROL_CLIENT == iter->second.type
4826 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
4828 Socket client_socket (iter->first);
4832 trans.put_command (SCIM_TRANS_CMD_REQUEST);
4833 trans.put_command (ISM_TRANS_CMD_ISE_PANEL_HIDED);
4835 trans.write_to_socket (client_socket);
4841 void socket_helper_update_state_showed (int client)
4843 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_showed (" << client << ")\n";
4845 ClientRepository::iterator iter = m_client_repository.begin ();
4847 for (; iter != m_client_repository.end (); iter++)
4849 if (IMCONTROL_CLIENT == iter->second.type &&
4850 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
4852 Socket client_socket (iter->first);
4856 trans.put_command (SCIM_TRANS_CMD_REQUEST);
4857 trans.put_command (ISM_TRANS_CMD_ISE_PANEL_SHOWED);
4859 trans.write_to_socket (client_socket);
4865 void socket_helper_update_input_context (int client)
4867 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_input_context (" << client << ")\n";
4872 if (m_recv_trans.get_data (type) && m_recv_trans.get_data (value))
4874 ClientRepository::iterator iter = m_client_repository.begin ();
4876 for (; iter != m_client_repository.end (); iter++)
4878 if (IMCONTROL_CLIENT == iter->second.type &&
4879 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
4881 Socket client_socket (iter->first);
4885 trans.put_command (SCIM_TRANS_CMD_REQUEST);
4886 trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
4887 trans.put_data (type);
4888 trans.put_data (value);
4890 trans.write_to_socket (client_socket);
4897 void socket_helper_commit_ise_result_to_imcontrol (int client)
4899 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_ise_result_to_imcontrol (" << client << ")\n";
4904 if (m_recv_trans.get_data (&buf, len))
4906 ClientRepository::iterator iter = m_client_repository.begin ();
4908 for (; iter != m_client_repository.end (); iter++)
4910 if (IMCONTROL_CLIENT == iter->second.type &&
4911 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
4913 Socket client_socket (iter->first);
4917 trans.put_command (SCIM_TRANS_CMD_REQUEST);
4918 trans.put_command (ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL);
4919 trans.put_data (buf, len);
4920 trans.write_to_socket (client_socket);
4930 void socket_reset_helper_input_context (const String &uuid, int client, uint32 context)
4932 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
4934 if (it != m_helper_client_index.end ())
4936 Socket client_socket (it->second.id);
4937 uint32 ctx = get_helper_ic (client, context);
4939 m_send_trans.clear ();
4940 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4941 m_send_trans.put_data (ctx);
4942 m_send_trans.put_data (uuid);
4943 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT);
4944 m_send_trans.write_to_socket (client_socket);
4948 void socket_reset_input_context (int client, uint32 context)
4950 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_reset_input_context \n";
4952 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4953 socket_reset_helper_input_context (m_current_helper_uuid, client, context);
4956 bool helper_select_aux (uint32 item)
4958 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_aux \n";
4960 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4962 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
4964 if (it != m_helper_client_index.end ())
4968 Socket client_socket (it->second.id);
4971 get_focused_context (client, context);
4972 ctx = get_helper_ic (client, context);
4974 m_send_trans.clear ();
4975 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4976 m_send_trans.put_data (ctx);
4977 m_send_trans.put_data (m_current_helper_uuid);
4978 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_AUX);
4979 m_send_trans.put_data ((uint32)item);
4980 m_send_trans.write_to_socket (client_socket);
4989 bool helper_select_candidate (uint32 item)
4991 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_candidate \n";
4993 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4995 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
4997 if (it != m_helper_client_index.end ())
5001 Socket client_socket (it->second.id);
5004 get_focused_context (client, context);
5005 ctx = get_helper_ic (client, context);
5007 m_send_trans.clear ();
5008 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5009 m_send_trans.put_data (ctx);
5010 m_send_trans.put_data (m_current_helper_uuid);
5011 m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
5012 m_send_trans.put_data ((uint32)item);
5013 m_send_trans.write_to_socket (client_socket);
5022 bool helper_lookup_table_page_up (void)
5024 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_up \n";
5026 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5028 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5030 if (it != m_helper_client_index.end ())
5034 Socket client_socket (it->second.id);
5037 get_focused_context (client, context);
5038 ctx = get_helper_ic (client, context);
5040 m_send_trans.clear ();
5041 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5042 m_send_trans.put_data (ctx);
5043 m_send_trans.put_data (m_current_helper_uuid);
5044 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
5045 m_send_trans.write_to_socket (client_socket);
5054 bool helper_lookup_table_page_down (void)
5056 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_down \n";
5058 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5060 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5062 if (it != m_helper_client_index.end ())
5066 Socket client_socket (it->second.id);
5069 get_focused_context (client, context);
5070 ctx = get_helper_ic (client, context);
5072 m_send_trans.clear ();
5073 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5074 m_send_trans.put_data (ctx);
5075 m_send_trans.put_data (m_current_helper_uuid);
5076 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
5077 m_send_trans.write_to_socket (client_socket);
5086 bool helper_update_lookup_table_page_size (uint32 size)
5088 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_lookup_table_page_size \n";
5090 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5092 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5094 if (it != m_helper_client_index.end ())
5098 Socket client_socket (it->second.id);
5101 get_focused_context (client, context);
5102 ctx = get_helper_ic (client, context);
5104 m_send_trans.clear ();
5105 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5106 m_send_trans.put_data (ctx);
5107 m_send_trans.put_data (m_current_helper_uuid);
5108 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
5109 m_send_trans.put_data (size);
5110 m_send_trans.write_to_socket (client_socket);
5119 bool helper_select_associate (uint32 item)
5121 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_associate \n";
5123 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5125 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5127 if (it != m_helper_client_index.end ())
5131 Socket client_socket (it->second.id);
5134 get_focused_context (client, context);
5135 ctx = get_helper_ic (client, context);
5137 m_send_trans.clear ();
5138 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5139 m_send_trans.put_data (ctx);
5140 m_send_trans.put_data (m_current_helper_uuid);
5141 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
5142 m_send_trans.put_data ((uint32)item);
5143 m_send_trans.write_to_socket (client_socket);
5152 bool helper_associate_table_page_up (void)
5154 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_up \n";
5156 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5158 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5160 if (it != m_helper_client_index.end ())
5164 Socket client_socket (it->second.id);
5167 get_focused_context (client, context);
5168 ctx = get_helper_ic (client, context);
5170 m_send_trans.clear ();
5171 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5172 m_send_trans.put_data (ctx);
5173 m_send_trans.put_data (m_current_helper_uuid);
5174 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
5175 m_send_trans.write_to_socket (client_socket);
5184 bool helper_associate_table_page_down (void)
5186 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_down \n";
5188 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5190 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5192 if (it != m_helper_client_index.end ())
5196 Socket client_socket (it->second.id);
5199 get_focused_context (client, context);
5200 ctx = get_helper_ic (client, context);
5202 m_send_trans.clear ();
5203 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5204 m_send_trans.put_data (ctx);
5205 m_send_trans.put_data (m_current_helper_uuid);
5206 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
5207 m_send_trans.write_to_socket (client_socket);
5216 bool helper_update_associate_table_page_size (uint32 size)
5218 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_associate_table_page_size \n";
5220 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5222 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5224 if (it != m_helper_client_index.end ())
5228 Socket client_socket (it->second.id);
5231 get_focused_context (client, context);
5232 ctx = get_helper_ic (client, context);
5234 m_send_trans.clear ();
5235 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5236 m_send_trans.put_data (ctx);
5237 m_send_trans.put_data (m_current_helper_uuid);
5238 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
5239 m_send_trans.put_data (size);
5240 m_send_trans.write_to_socket (client_socket);
5249 void helper_all_update_spot_location (int x, int y)
5251 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_spot_location (" << x << "," << y << ")\n";
5253 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5257 String uuid = get_focused_context (client, context);
5261 m_send_trans.clear ();
5262 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5264 /* FIXME: We presume that client and context are both less than 65536.
5265 * Hopefully, it should be true in any UNIXs.
5266 * So it's ok to combine client and context into one uint32. */
5267 m_send_trans.put_data (get_helper_ic (client, context));
5268 m_send_trans.put_data (uuid);
5269 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
5270 m_send_trans.put_data ((uint32) x);
5271 m_send_trans.put_data ((uint32) y);
5273 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5274 if (hiit->second.option & SCIM_HELPER_NEED_SPOT_LOCATION_INFO) {
5275 Socket client_socket (hiit->first);
5276 m_send_trans.write_to_socket (client_socket);
5283 void helper_all_update_cursor_position (int cursor_pos)
5285 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_cursor_position (" << cursor_pos << ")\n";
5287 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5291 String uuid = get_focused_context (client, context);
5295 m_send_trans.clear ();
5296 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5297 m_send_trans.put_data (get_helper_ic (client, context));
5298 m_send_trans.put_data (uuid);
5299 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
5300 m_send_trans.put_data ((uint32) cursor_pos);
5302 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5303 Socket client_socket (hiit->first);
5304 m_send_trans.write_to_socket (client_socket);
5310 void helper_all_update_screen (int screen)
5312 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_screen (" << screen << ")\n";
5314 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5322 uuid = get_focused_context (client, context);
5324 m_send_trans.clear ();
5325 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5327 /* FIXME: We presume that client and context are both less than 65536.
5328 * Hopefully, it should be true in any UNIXs.
5329 * So it's ok to combine client and context into one uint32. */
5330 m_send_trans.put_data (get_helper_ic (client, context));
5331 m_send_trans.put_data (uuid);
5332 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
5333 m_send_trans.put_data ((uint32) screen);
5335 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5336 if (hiit->second.option & SCIM_HELPER_NEED_SCREEN_INFO) {
5337 Socket client_socket (hiit->first);
5338 m_send_trans.write_to_socket (client_socket);
5345 const String & get_focused_context (int &client, uint32 &context, bool force_last_context = false) const
5347 if (m_current_socket_client >= 0) {
5348 client = m_current_socket_client;
5349 context = m_current_client_context;
5350 return m_current_context_uuid;
5352 client = m_last_socket_client;
5353 context = m_last_client_context;
5354 return m_last_context_uuid;
5359 void socket_transaction_start (void)
5361 m_signal_transaction_start ();
5364 void socket_transaction_end (void)
5366 m_signal_transaction_end ();
5379 PanelAgent::PanelAgent ()
5380 : m_impl (new PanelAgentImpl ())
5384 PanelAgent::~PanelAgent ()
5390 PanelAgent::initialize (const String &config, const String &display, bool resident)
5392 return m_impl->initialize (config, display, resident);
5396 PanelAgent::valid (void) const
5398 return m_impl->valid ();
5402 PanelAgent::run (void)
5404 return m_impl->run ();
5408 PanelAgent::stop (void)
5415 PanelAgent::get_helper_list (std::vector <HelperInfo> & helpers) const
5417 return m_impl->get_helper_list (helpers);
5420 void PanelAgent::hide_helper (const String &uuid)
5422 m_impl->hide_helper (uuid);
5425 PanelAgent::get_current_toolbar_mode () const
5427 return m_impl->get_current_toolbar_mode ();
5431 PanelAgent::get_current_ise_geometry (rectinfo &rect)
5433 m_impl->get_current_ise_geometry (rect);
5437 PanelAgent::get_current_helper_uuid () const
5439 return m_impl->get_current_helper_uuid ();
5443 PanelAgent::get_current_helper_name () const
5445 return m_impl->get_current_helper_name ();
5449 PanelAgent::get_current_factory_icon () const
5451 return m_impl->get_current_factory_icon ();
5455 PanelAgent::get_current_ise_name () const
5457 return m_impl->get_current_ise_name ();
5461 PanelAgent::set_current_toolbar_mode (TOOLBAR_MODE_T mode)
5463 m_impl->set_current_toolbar_mode (mode);
5467 PanelAgent::set_current_ise_name (String &name)
5469 m_impl->set_current_ise_name (name);
5473 PanelAgent::set_current_ise_style (uint32 &style)
5475 m_impl->set_current_ise_style (style);
5479 PanelAgent::update_ise_name (String &name)
5481 m_impl->update_ise_name (name);
5485 PanelAgent::update_ise_style (uint32 &style)
5487 m_impl->update_ise_style (style);
5491 PanelAgent::update_candidate_panel_event (uint32 nType, uint32 nValue)
5493 m_impl->update_candidate_panel_event (nType, nValue);
5497 PanelAgent::set_current_factory_icon (String &icon)
5499 m_impl->set_current_factory_icon (icon);
5503 PanelAgent::move_preedit_caret (uint32 position)
5505 return m_impl->move_preedit_caret (position);
5509 PanelAgent::request_help (void)
5511 return m_impl->request_help ();
5515 PanelAgent::request_factory_menu (void)
5517 return m_impl->request_factory_menu ();
5521 PanelAgent::change_factory (const String &uuid)
5523 return m_impl->change_factory (uuid);
5527 PanelAgent::candidate_more_window_show (void)
5529 return m_impl->candidate_more_window_show ();
5533 PanelAgent::candidate_more_window_hide (void)
5535 return m_impl->candidate_more_window_hide ();
5539 PanelAgent::select_aux (uint32 item)
5541 return m_impl->select_aux (item);
5545 PanelAgent::select_candidate (uint32 item)
5547 return m_impl->select_candidate (item);
5551 PanelAgent::lookup_table_page_up (void)
5553 return m_impl->lookup_table_page_up ();
5557 PanelAgent::lookup_table_page_down (void)
5559 return m_impl->lookup_table_page_down ();
5563 PanelAgent::update_lookup_table_page_size (uint32 size)
5565 return m_impl->update_lookup_table_page_size (size);
5569 PanelAgent::select_associate (uint32 item)
5571 return m_impl->select_associate (item);
5575 PanelAgent::associate_table_page_up (void)
5577 return m_impl->associate_table_page_up ();
5581 PanelAgent::associate_table_page_down (void)
5583 return m_impl->associate_table_page_down ();
5587 PanelAgent::update_associate_table_page_size (uint32 size)
5589 return m_impl->update_associate_table_page_size (size);
5593 PanelAgent::trigger_property (const String &property)
5595 return m_impl->trigger_property (property);
5599 PanelAgent::trigger_helper_property (int client,
5600 const String &property)
5602 return m_impl->trigger_helper_property (client, property);
5606 PanelAgent::start_helper (const String &uuid)
5608 return m_impl->start_helper (uuid, -2, 0);
5612 PanelAgent::stop_helper (const String &uuid)
5614 return m_impl->stop_helper (uuid, -2, 0);
5618 PanelAgent::set_default_ise (const DEFAULT_ISE_T &ise)
5620 m_impl->set_default_ise (ise);
5624 PanelAgent::set_should_shared_ise (const bool should_shared_ise)
5626 m_impl->set_should_shared_ise (should_shared_ise);
5630 PanelAgent::reset_keyboard_ise () const
5632 return m_impl->reset_keyboard_ise ();
5636 PanelAgent::get_active_ise_list (std::vector<String> &strlist)
5638 return m_impl->get_active_ise_list (strlist);
5642 PanelAgent::update_isf_control_status (const bool showed)
5644 m_impl->update_isf_control_status (showed);
5648 PanelAgent::send_display_name (String &name)
5650 return m_impl->send_display_name (name);
5654 PanelAgent::reload_config (void)
5656 return m_impl->reload_config ();
5660 PanelAgent::exit (void)
5662 return m_impl->exit ();
5666 PanelAgent::filter_event (int fd)
5668 return m_impl->filter_event (fd);
5672 PanelAgent::filter_exception_event (int fd)
5674 return m_impl->filter_exception_event (fd);
5678 PanelAgent::get_server_id (void)
5680 return m_impl->get_server_id ();
5684 PanelAgent::update_ise_list (std::vector<String> &strList)
5686 m_impl->update_ise_list (strList);
5690 PanelAgent::set_ise_changing (bool changing)
5692 m_impl->set_ise_changing (changing);
5696 PanelAgent::signal_connect_reload_config (PanelAgentSlotVoid *slot)
5698 return m_impl->signal_connect_reload_config (slot);
5702 PanelAgent::signal_connect_turn_on (PanelAgentSlotVoid *slot)
5704 return m_impl->signal_connect_turn_on (slot);
5708 PanelAgent::signal_connect_turn_off (PanelAgentSlotVoid *slot)
5710 return m_impl->signal_connect_turn_off (slot);
5714 PanelAgent::signal_connect_show_panel (PanelAgentSlotVoid *slot)
5716 return m_impl->signal_connect_show_panel (slot);
5720 PanelAgent::signal_connect_hide_panel (PanelAgentSlotVoid *slot)
5722 return m_impl->signal_connect_hide_panel (slot);
5726 PanelAgent::signal_connect_update_screen (PanelAgentSlotInt *slot)
5728 return m_impl->signal_connect_update_screen (slot);
5732 PanelAgent::signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
5734 return m_impl->signal_connect_update_spot_location (slot);
5738 PanelAgent::signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
5740 return m_impl->signal_connect_update_factory_info (slot);
5744 PanelAgent::signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
5746 return m_impl->signal_connect_start_default_ise (slot);
5750 PanelAgent::signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
5752 return m_impl->signal_connect_set_candidate_ui (slot);
5756 PanelAgent::signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
5758 return m_impl->signal_connect_get_candidate_ui (slot);
5762 PanelAgent::signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
5764 return m_impl->signal_connect_set_candidate_position (slot);
5768 PanelAgent::signal_connect_get_candidate_geometry (PanelAgentSlotRect *slot)
5770 return m_impl->signal_connect_get_candidate_geometry (slot);
5774 PanelAgent::signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
5776 return m_impl->signal_connect_set_keyboard_ise (slot);
5780 PanelAgent::signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
5782 return m_impl->signal_connect_get_keyboard_ise (slot);
5786 PanelAgent::signal_connect_show_help (PanelAgentSlotString *slot)
5788 return m_impl->signal_connect_show_help (slot);
5792 PanelAgent::signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
5794 return m_impl->signal_connect_show_factory_menu (slot);
5798 PanelAgent::signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
5800 return m_impl->signal_connect_show_preedit_string (slot);
5804 PanelAgent::signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
5806 return m_impl->signal_connect_show_aux_string (slot);
5810 PanelAgent::signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
5812 return m_impl->signal_connect_show_lookup_table (slot);
5816 PanelAgent::signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
5818 return m_impl->signal_connect_show_associate_table (slot);
5822 PanelAgent::signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
5824 return m_impl->signal_connect_hide_preedit_string (slot);
5828 PanelAgent::signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
5830 return m_impl->signal_connect_hide_aux_string (slot);
5834 PanelAgent::signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
5836 return m_impl->signal_connect_hide_lookup_table (slot);
5840 PanelAgent::signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
5842 return m_impl->signal_connect_hide_associate_table (slot);
5846 PanelAgent::signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
5848 return m_impl->signal_connect_update_preedit_string (slot);
5852 PanelAgent::signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
5854 return m_impl->signal_connect_update_preedit_caret (slot);
5858 PanelAgent::signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
5860 return m_impl->signal_connect_update_aux_string (slot);
5864 PanelAgent::signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
5866 return m_impl->signal_connect_update_lookup_table (slot);
5870 PanelAgent::signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
5872 return m_impl->signal_connect_update_associate_table (slot);
5876 PanelAgent::signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
5878 return m_impl->signal_connect_register_properties (slot);
5882 PanelAgent::signal_connect_update_property (PanelAgentSlotProperty *slot)
5884 return m_impl->signal_connect_update_property (slot);
5888 PanelAgent::signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
5890 return m_impl->signal_connect_register_helper_properties (slot);
5894 PanelAgent::signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
5896 return m_impl->signal_connect_update_helper_property (slot);
5900 PanelAgent::signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
5902 return m_impl->signal_connect_register_helper (slot);
5906 PanelAgent::signal_connect_remove_helper (PanelAgentSlotInt *slot)
5908 return m_impl->signal_connect_remove_helper (slot);
5912 PanelAgent::signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
5914 return m_impl->signal_connect_set_active_ise_by_uuid (slot);
5918 PanelAgent::signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
5920 return m_impl->signal_connect_set_active_ise_by_name (slot);
5924 PanelAgent::signal_connect_focus_in (PanelAgentSlotVoid *slot)
5926 return m_impl->signal_connect_focus_in (slot);
5930 PanelAgent::signal_connect_focus_out (PanelAgentSlotVoid *slot)
5932 return m_impl->signal_connect_focus_out (slot);
5936 PanelAgent::signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
5938 return m_impl->signal_connect_get_ise_list (slot);
5942 PanelAgent::signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
5944 return m_impl->signal_connect_get_keyboard_ise_list (slot);
5948 PanelAgent::signal_connect_launch_helper_ise_list_selection(PanelAgentSlotInt * slot)
5950 return m_impl->signal_connect_launch_helper_ise_list_selection (slot);
5954 PanelAgent::signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
5956 return m_impl->signal_connect_get_language_list (slot);
5960 PanelAgent::signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
5962 return m_impl->signal_connect_get_all_language (slot);
5966 PanelAgent::signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
5968 return m_impl->signal_connect_get_ise_language (slot);
5972 PanelAgent::signal_connect_set_isf_language (PanelAgentSlotString *slot)
5974 return m_impl->signal_connect_set_isf_language (slot);
5978 PanelAgent::signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
5980 return m_impl->signal_connect_get_ise_info_by_uuid (slot);
5984 PanelAgent::signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
5986 return m_impl->signal_connect_get_ise_info_by_name (slot);
5990 PanelAgent::signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
5992 return m_impl->signal_connect_send_key_event (slot);
5996 PanelAgent::signal_connect_accept_connection (PanelAgentSlotInt *slot)
5998 return m_impl->signal_connect_accept_connection (slot);
6002 PanelAgent::signal_connect_close_connection (PanelAgentSlotInt *slot)
6004 return m_impl->signal_connect_close_connection (slot);
6008 PanelAgent::signal_connect_exit (PanelAgentSlotVoid *slot)
6010 return m_impl->signal_connect_exit (slot);
6014 PanelAgent::signal_connect_transaction_start (PanelAgentSlotVoid *slot)
6016 return m_impl->signal_connect_transaction_start (slot);
6020 PanelAgent::signal_connect_transaction_end (PanelAgentSlotVoid *slot)
6022 return m_impl->signal_connect_transaction_end (slot);
6026 PanelAgent::signal_connect_lock (PanelAgentSlotVoid *slot)
6028 return m_impl->signal_connect_lock (slot);
6032 PanelAgent::signal_connect_unlock (PanelAgentSlotVoid *slot)
6034 return m_impl->signal_connect_unlock (slot);
6037 } /* namespace scim */
6040 vi:ts=4:nowrap:ai:expandtab