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_rect;
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 set_current_factory_icon (String &icon)
515 m_current_factory_icon = icon;
518 bool move_preedit_caret (uint32 position)
520 SCIM_DEBUG_MAIN(1) << "PanelAgent::move_preedit_caret (" << position << ")\n";
527 get_focused_context (client, context);
530 Socket client_socket (client);
531 m_send_trans.clear ();
532 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
533 m_send_trans.put_data ((uint32) context);
534 m_send_trans.put_command (SCIM_TRANS_CMD_MOVE_PREEDIT_CARET);
535 m_send_trans.put_data ((uint32) position);
536 m_send_trans.write_to_socket (client_socket);
544 bool request_help (void)
546 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_help ()\n";
553 get_focused_context (client, context);
556 Socket client_socket (client);
557 m_send_trans.clear ();
558 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
559 m_send_trans.put_data ((uint32) context);
560 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_REQUEST_HELP);
561 m_send_trans.write_to_socket (client_socket);
569 bool request_factory_menu (void)
571 SCIM_DEBUG_MAIN(1) << "PanelAgent::request_factory_menu ()\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_FACTORY_MENU);
586 m_send_trans.write_to_socket (client_socket);
594 bool reset_keyboard_ise (void)
596 SCIM_DEBUG_MAIN(1) << "PanelAgent::reset_keyboard_ise ()\n";
602 get_focused_context (client, context);
604 Socket client_socket (client);
605 m_send_trans.clear ();
606 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
607 m_send_trans.put_data ((uint32) context);
608 m_send_trans.put_command (ISM_TRANS_CMD_PANEL_REQUEST_RESET_ISE);
609 m_send_trans.write_to_socket (client_socket);
617 bool update_keyboard_ise_list (void)
619 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_keyboard_ise_list ()\n";
625 get_focused_context (client, context);
627 Socket client_socket (client);
628 m_send_trans.clear ();
629 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
630 m_send_trans.put_data ((uint32) context);
631 m_send_trans.put_command (ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE);
632 m_send_trans.write_to_socket (client_socket);
640 bool change_factory (const String &uuid)
642 SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
649 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 (SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY);
657 m_send_trans.put_data (uuid);
658 m_send_trans.write_to_socket (client_socket);
666 bool candidate_more_window_show (void)
668 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
670 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
672 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
674 if (it != m_helper_client_index.end ())
678 Socket client_socket (it->second.id);
681 get_focused_context (client, context);
682 ctx = get_helper_ic (client, context);
684 m_send_trans.clear ();
685 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
686 m_send_trans.put_data (ctx);
687 m_send_trans.put_data (m_current_helper_uuid);
688 m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW);
689 m_send_trans.write_to_socket (client_socket);
698 bool candidate_more_window_hide (void)
700 SCIM_DEBUG_MAIN(4) << __FUNCTION__ << "...\n";
702 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
704 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
706 if (it != m_helper_client_index.end ())
710 Socket client_socket (it->second.id);
713 get_focused_context (client, context);
714 ctx = get_helper_ic (client, context);
716 m_send_trans.clear ();
717 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
718 m_send_trans.put_data (ctx);
719 m_send_trans.put_data (m_current_helper_uuid);
720 m_send_trans.put_command (ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE);
721 m_send_trans.write_to_socket (client_socket);
730 bool select_aux (uint32 item)
732 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_aux (" << item << ")\n";
739 get_focused_context (client, context);
742 Socket client_socket (client);
743 m_send_trans.clear ();
744 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
745 m_send_trans.put_data ((uint32) context);
746 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_AUX);
747 m_send_trans.put_data ((uint32)item);
748 m_send_trans.write_to_socket (client_socket);
756 bool select_candidate (uint32 item)
758 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_candidate (" << item << ")\n";
765 get_focused_context (client, context);
768 Socket client_socket (client);
769 m_send_trans.clear ();
770 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
771 m_send_trans.put_data ((uint32) context);
772 m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
773 m_send_trans.put_data ((uint32)item);
774 m_send_trans.write_to_socket (client_socket);
779 helper_select_candidate (item);
784 bool lookup_table_page_up (void)
786 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_up ()\n";
793 get_focused_context (client, context);
796 Socket client_socket (client);
797 m_send_trans.clear ();
798 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
799 m_send_trans.put_data ((uint32) context);
800 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
801 m_send_trans.write_to_socket (client_socket);
806 helper_lookup_table_page_up ();
811 bool lookup_table_page_down (void)
813 SCIM_DEBUG_MAIN(1) << "PanelAgent::lookup_table_page_down ()\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_DOWN);
828 m_send_trans.write_to_socket (client_socket);
833 helper_lookup_table_page_down ();
838 bool update_lookup_table_page_size (uint32 size)
840 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_lookup_table_page_size (" << size << ")\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_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
855 m_send_trans.put_data (size);
856 m_send_trans.write_to_socket (client_socket);
861 helper_update_lookup_table_page_size (size);
866 bool select_associate (uint32 item)
868 SCIM_DEBUG_MAIN(1) << "PanelAgent::select_associate (" << item << ")\n";
875 get_focused_context (client, context);
878 Socket client_socket (client);
879 m_send_trans.clear ();
880 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
881 m_send_trans.put_data ((uint32) context);
882 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
883 m_send_trans.put_data ((uint32)item);
884 m_send_trans.write_to_socket (client_socket);
889 helper_select_associate (item);
894 bool associate_table_page_up (void)
896 SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_up ()\n";
903 get_focused_context (client, context);
906 Socket client_socket (client);
907 m_send_trans.clear ();
908 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
909 m_send_trans.put_data ((uint32) context);
910 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
911 m_send_trans.write_to_socket (client_socket);
916 helper_associate_table_page_up ();
921 bool associate_table_page_down (void)
923 SCIM_DEBUG_MAIN(1) << "PanelAgent::associate_table_page_down ()\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_DOWN);
938 m_send_trans.write_to_socket (client_socket);
943 helper_associate_table_page_down ();
948 bool update_associate_table_page_size (uint32 size)
950 SCIM_DEBUG_MAIN(1) << "PanelAgent::update_associate_table_page_size (" << size << ")\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_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
965 m_send_trans.put_data (size);
966 m_send_trans.write_to_socket (client_socket);
971 helper_update_associate_table_page_size (size);
976 bool trigger_property (const String &property)
978 SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_property (" << property << ")\n";
985 get_focused_context (client, context);
988 Socket client_socket (client);
989 m_send_trans.clear ();
990 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
991 m_send_trans.put_data ((uint32) context);
992 m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
993 m_send_trans.put_data (property);
994 m_send_trans.write_to_socket (client_socket);
1002 bool trigger_helper_property (int client,
1003 const String &property)
1005 SCIM_DEBUG_MAIN(1) << "PanelAgent::trigger_helper_property (" << client << "," << property << ")\n";
1009 ClientInfo info = socket_get_client_info (client);
1011 if (client >= 0 && info.type == HELPER_CLIENT) {
1016 fe_uuid = get_focused_context (fe_client, fe_context);
1018 Socket client_socket (client);
1019 m_send_trans.clear ();
1020 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1022 /* FIXME: We presume that client and context are both less than 65536.
1023 * Hopefully, it should be true in any UNIXs.
1024 * So it's ok to combine client and context into one uint32.*/
1025 m_send_trans.put_data (get_helper_ic (fe_client, fe_context));
1026 m_send_trans.put_data (fe_uuid);
1027 m_send_trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY);
1028 m_send_trans.put_data (property);
1029 m_send_trans.write_to_socket (client_socket);
1034 return client >= 0 && info.type == HELPER_CLIENT;
1037 bool start_helper (const String &uuid, int client, uint32 context)
1039 SCIM_DEBUG_MAIN(1) << "PanelAgent::start_helper (" << uuid << ")\n";
1040 if (uuid.length () <= 0)
1045 if (m_current_toolbar_mode != TOOLBAR_HELPER_MODE || m_current_helper_uuid.compare (uuid) != 0)
1047 SCIM_DEBUG_MAIN(1) << uuid.c_str () << ".....enter run_helper ..............\n";
1048 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
1050 m_current_helper_uuid = uuid;
1051 #ifdef ONE_HELPER_ISE_PROCESS
1053 get_focused_context (client, context);
1055 SCIM_DEBUG_MAIN(1) << "[start helper] client : " << client << " context : " << context << "\n";
1056 uint32 ctx = get_helper_ic (client, context);
1058 /*HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1059 if (it == m_helper_client_index.end ())*/
1060 if (m_helper_uuid_count.find (uuid) == m_helper_uuid_count.end ())
1062 m_client_context_helper[ctx] = uuid;
1063 m_current_helper_uuid = uuid;
1064 m_helper_uuid_count[uuid] = 1;
1065 m_helper_uuid_state[uuid] = HELPER_HIDED;
1067 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
1068 SCIM_DEBUG_MAIN(1) << "Start HelperISE " << uuid << " ...\n";
1072 ClientContextUUIDRepository::iterator it2 = m_client_context_helper.find (ctx);
1073 if (it2 == m_client_context_helper.end ())
1075 m_client_context_helper[ctx] = uuid;
1076 m_current_helper_uuid = uuid;
1077 m_helper_uuid_count[uuid] = m_helper_uuid_count[uuid] + 1;
1080 if (m_current_active_imcontrol_id != -1
1081 && m_ise_settings != NULL && m_ise_changing)
1083 show_helper (uuid, m_ise_settings, m_ise_settings_len);
1084 m_ise_changing = false;
1087 SCIM_DEBUG_MAIN(1) << "Increment usage count of HelperISE " << uuid << " to "
1088 << m_helper_uuid_count[uuid] << "\n";
1096 bool stop_helper (const String &helper_uuid, int client, uint32 context)
1098 String uuid = helper_uuid;
1099 SCIM_DEBUG_MAIN(1) << "PanelAgent::stop_helper (" << uuid << ")\n";
1100 if (uuid.length () <= 0)
1105 uint32 ctx = get_helper_ic (client, context);
1106 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1107 if (it != m_helper_client_index.end ())
1109 Socket client_socket (it->second.id);
1110 m_send_trans.clear ();
1111 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1112 m_send_trans.put_data (ctx);
1113 m_send_trans.put_data (uuid);
1115 m_ise_exiting = true;
1116 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
1117 m_send_trans.write_to_socket (client_socket);
1118 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
1120 #ifdef ONE_HELPER_ISE_PROCESS
1122 get_focused_context (client, context);
1124 SCIM_DEBUG_MAIN(1) << "[stop helper] client : " << client << " context : " << context << "\n";
1125 uint32 ctx = get_helper_ic (client, context);
1127 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1128 /*if (it != m_helper_client_index.end ())*/
1129 if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ())
1131 m_client_context_helper.erase (ctx);
1133 uint32 count = m_helper_uuid_count[uuid];
1136 m_helper_uuid_count.erase (uuid);
1138 if (it != m_helper_client_index.end ())
1140 Socket client_socket (it->second.id);
1141 m_send_trans.clear ();
1142 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1143 m_send_trans.put_data (ctx);
1144 m_send_trans.put_data (uuid);
1145 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
1146 m_send_trans.write_to_socket (client_socket);
1147 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
1152 m_helper_uuid_count[uuid] = count - 1;
1153 SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
1154 << " to " << m_helper_uuid_count[uuid] << "\n";
1163 void focus_out_helper (const String &uuid, int client, uint32 context)
1165 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1167 if (it != m_helper_client_index.end ())
1169 Socket client_socket (it->second.id);
1170 uint32 ctx = get_helper_ic (client, context);
1172 m_send_trans.clear ();
1173 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1174 m_send_trans.put_data (ctx);
1175 m_send_trans.put_data (uuid);
1176 m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
1177 m_send_trans.write_to_socket (client_socket);
1181 void focus_in_helper (const String &uuid, int client, uint32 context)
1183 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1185 if (it != m_helper_client_index.end ())
1187 Socket client_socket (it->second.id);
1188 uint32 ctx = get_helper_ic (client, context);
1190 m_send_trans.clear ();
1191 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1192 m_send_trans.put_data (ctx);
1193 m_send_trans.put_data (uuid);
1194 m_send_trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
1195 m_send_trans.write_to_socket (client_socket);
1199 void show_helper (const String &uuid, char *data, size_t &len)
1201 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1203 if (it != m_helper_client_index.end ())
1207 Socket client_socket (it->second.id);
1210 m_helper_uuid_state[uuid] = HELPER_SHOWED;
1212 get_focused_context (client, context);
1213 ctx = get_helper_ic (client, context);
1215 m_send_trans.clear ();
1216 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1217 m_send_trans.put_data (ctx);
1218 m_send_trans.put_data (uuid);
1219 m_send_trans.put_command (ISM_TRANS_CMD_SHOW_ISE);
1220 m_send_trans.put_data (data, len);
1221 m_send_trans.write_to_socket (client_socket);
1226 void hide_helper (const String &uuid)
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_HIDED;
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_HIDE_ISE);
1247 m_send_trans.write_to_socket (client_socket);
1251 bool set_helper_mode (const String &uuid, uint32 &mode)
1253 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1255 if (it != m_helper_client_index.end ())
1259 Socket client_socket (it->second.id);
1262 get_focused_context (client, context);
1263 ctx = get_helper_ic (client, context);
1265 m_send_trans.clear ();
1266 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1267 m_send_trans.put_data (ctx);
1268 m_send_trans.put_data (uuid);
1269 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_MODE);
1270 m_send_trans.put_data (mode);
1271 m_send_trans.write_to_socket (client_socket);
1278 bool set_helper_language (const String &uuid, uint32 &language)
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_LANGUAGE);
1297 m_send_trans.put_data (language);
1298 m_send_trans.write_to_socket (client_socket);
1304 bool set_helper_imdata (const String &uuid, char *imdata, size_t &len)
1306 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1308 if (it != m_helper_client_index.end ())
1312 Socket client_socket (it->second.id);
1315 get_focused_context (client, context);
1316 ctx = get_helper_ic (client, context);
1318 m_send_trans.clear ();
1319 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1320 m_send_trans.put_data (ctx);
1321 m_send_trans.put_data (uuid);
1322 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
1323 m_send_trans.put_data (imdata, len);
1324 m_send_trans.write_to_socket (client_socket);
1330 bool set_helper_private_key (const String &uuid,
1333 char *buf, size_t len1,
1334 char *value, size_t len2,
1337 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1339 if (it != m_helper_client_index.end ())
1343 Socket client_socket (it->second.id);
1346 get_focused_context (client, context);
1347 ctx = get_helper_ic (client, context);
1349 m_send_trans.clear ();
1350 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1351 m_send_trans.put_data (ctx);
1352 m_send_trans.put_data (uuid);
1354 m_send_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG);
1356 m_send_trans.put_command (ISM_TRANS_CMD_SET_PRIVATE_KEY);
1357 m_send_trans.put_data (layout_idx);
1358 m_send_trans.put_data (key_idx);
1359 m_send_trans.put_data (buf, len1);
1360 m_send_trans.put_data (value, len2);
1361 m_send_trans.write_to_socket (client_socket);
1369 bool set_helper_disable_key (const String &uuid,
1374 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1376 if (it != m_helper_client_index.end ())
1380 Socket client_socket (it->second.id);
1383 get_focused_context (client, context);
1384 ctx = get_helper_ic (client, context);
1386 m_send_trans.clear ();
1387 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1388 m_send_trans.put_data (ctx);
1389 m_send_trans.put_data (uuid);
1390 m_send_trans.put_command (ISM_TRANS_CMD_SET_DISABLE_KEY);
1391 m_send_trans.put_data (layout_idx);
1392 m_send_trans.put_data (key_idx);
1393 m_send_trans.put_data (disabled);
1394 m_send_trans.write_to_socket (client_socket);
1402 bool set_helper_layout (const String &uuid, uint32 &layout)
1404 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1406 if (it != m_helper_client_index.end ())
1410 Socket client_socket (it->second.id);
1413 get_focused_context (client, context);
1414 ctx = get_helper_ic (client, context);
1416 m_send_trans.clear ();
1417 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1418 m_send_trans.put_data (ctx);
1419 m_send_trans.put_data (uuid);
1420 m_send_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
1421 m_send_trans.put_data (layout);
1422 m_send_trans.write_to_socket (client_socket);
1429 bool set_helper_caps_mode (const String &uuid, uint32 &mode)
1431 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1433 if (it != m_helper_client_index.end ())
1437 Socket client_socket (it->second.id);
1440 get_focused_context (client, context);
1441 ctx = get_helper_ic (client, context);
1443 m_send_trans.clear ();
1444 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1445 m_send_trans.put_data (ctx);
1446 m_send_trans.put_data (uuid);
1447 m_send_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
1448 m_send_trans.put_data (mode);
1449 m_send_trans.write_to_socket (client_socket);
1456 bool set_helper_im_embedded_editor_im_button_set_label (const String &uuid, char *data, size_t &len)
1458 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1460 if (it != m_helper_client_index.end ())
1464 Socket client_socket (it->second.id);
1467 get_focused_context (client, context);
1468 ctx = get_helper_ic (client, context);
1470 m_send_trans.clear ();
1471 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1472 m_send_trans.put_data (ctx);
1473 m_send_trans.put_data (uuid);
1474 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL);
1475 m_send_trans.put_data (data, len);
1476 m_send_trans.write_to_socket (client_socket);
1482 bool set_helper_im_embedded_editor_set_preset_text (const String &uuid, char *data, size_t &len)
1484 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1486 if (it != m_helper_client_index.end ())
1490 Socket client_socket (it->second.id);
1493 get_focused_context (client, context);
1494 ctx = get_helper_ic (client, context);
1496 m_send_trans.clear ();
1497 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1498 m_send_trans.put_data (ctx);
1499 m_send_trans.put_data (uuid);
1500 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT);
1501 m_send_trans.put_data (data, len);
1502 m_send_trans.write_to_socket (client_socket);
1508 bool set_helper_im_embedded_editor_set_text (const String &uuid, char *data, size_t &len)
1510 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1512 if (it != m_helper_client_index.end ())
1516 Socket client_socket (it->second.id);
1519 get_focused_context (client, context);
1520 ctx = get_helper_ic (client, context);
1522 m_send_trans.clear ();
1523 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1524 m_send_trans.put_data (ctx);
1525 m_send_trans.put_data (uuid);
1526 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT);
1527 m_send_trans.put_data (data, len);
1528 m_send_trans.write_to_socket (client_socket);
1534 bool set_helper_im_embedded_editor_set_max_length (const String &uuid, uint32 &length)
1536 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1538 if (it != m_helper_client_index.end ())
1542 Socket client_socket (it->second.id);
1545 get_focused_context (client, context);
1546 ctx = get_helper_ic (client, context);
1548 m_send_trans.clear ();
1549 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1550 m_send_trans.put_data (ctx);
1551 m_send_trans.put_data (uuid);
1552 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH);
1553 m_send_trans.put_data (length);
1554 m_send_trans.write_to_socket (client_socket);
1561 bool set_helper_im_embedded_editor_set_button_senstivity(const String &uuid, uint32 &senstivity)
1563 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1565 if (it != m_helper_client_index.end ())
1569 Socket client_socket (it->second.id);
1572 get_focused_context (client, context);
1573 ctx = get_helper_ic (client, context);
1575 m_send_trans.clear ();
1576 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1577 m_send_trans.put_data (ctx);
1578 m_send_trans.put_data (uuid);
1579 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY);
1580 m_send_trans.put_data (senstivity);
1581 m_send_trans.write_to_socket (client_socket);
1588 bool set_helper_im_embedded_editor_set_progress_bar(const String &uuid, uint32 &timeout,uint32 &is_showing)
1590 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1592 if (it != m_helper_client_index.end ())
1596 Socket client_socket (it->second.id);
1599 get_focused_context (client, context);
1600 ctx = get_helper_ic (client, context);
1602 m_send_trans.clear ();
1603 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1604 m_send_trans.put_data (ctx);
1605 m_send_trans.put_data (uuid);
1606 m_send_trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR);
1607 m_send_trans.put_data (timeout);
1608 m_send_trans.put_data (is_showing);
1609 m_send_trans.write_to_socket (client_socket);
1616 bool set_helper_im_indicator_count_label (const String &uuid, char *data, size_t &len)
1618 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1620 if (it != m_helper_client_index.end ())
1624 Socket client_socket (it->second.id);
1627 get_focused_context (client, context);
1628 ctx = get_helper_ic (client, context);
1630 m_send_trans.clear ();
1631 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
1632 m_send_trans.put_data (ctx);
1633 m_send_trans.put_data (uuid);
1634 m_send_trans.put_command (ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL);
1635 m_send_trans.put_data (data, len);
1636 m_send_trans.write_to_socket (client_socket);
1642 void show_isf_panel (int client_id)
1644 SCIM_DEBUG_MAIN(4) << "PanelAgent::show_isf_panel ()\n";
1646 Socket client_socket (client_id);
1648 m_signal_show_panel ();
1651 void hide_isf_panel (int client_id)
1653 SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_isf_panel ()\n";
1655 Socket client_socket (client_id);
1657 m_signal_hide_panel ();
1660 void show_ise_panel (int client_id)
1662 SCIM_DEBUG_MAIN(4) << "PanelAgent::show_ise_panel ()\n";
1666 m_current_active_imcontrol_id = client_id;
1668 if (m_recv_trans.get_data (&data, len))
1670 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1671 show_helper (m_current_helper_uuid, data, len);
1676 if (m_ise_settings != NULL)
1677 delete [] m_ise_settings;
1678 m_ise_settings = data;
1679 m_ise_settings_len = len;
1683 void hide_ise_panel (int client_id)
1685 SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_ise_panel ()\n";
1686 TOOLBAR_MODE_T mode;
1688 mode = m_current_toolbar_mode;
1690 if (client_id == m_current_active_imcontrol_id &&
1691 TOOLBAR_HELPER_MODE == mode)
1693 hide_helper (m_current_helper_uuid);
1697 void set_default_ise (const DEFAULT_ISE_T &ise)
1699 m_default_ise.type = ise.type;
1700 m_default_ise.uuid = ise.uuid;
1701 m_default_ise.name = ise.name;
1703 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_TYPE), (int)m_default_ise.type);
1704 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), m_default_ise.uuid);
1705 scim_global_config_write (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_NAME), m_default_ise.name);
1706 scim_global_config_flush ();
1709 void set_should_shared_ise (const bool should_shared_ise)
1711 m_should_shared_ise = should_shared_ise;
1714 bool get_helper_size (String &uuid, struct rectinfo &info)
1716 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1718 if (it != m_helper_client_index.end ()) {
1721 Socket client_socket (it->second.id);
1725 get_focused_context (client, context);
1726 ctx = get_helper_ic (client, context);
1729 trans.put_command (SCIM_TRANS_CMD_REPLY);
1730 trans.put_data (ctx);
1731 trans.put_data (uuid);
1732 trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE);
1734 if (trans.write_to_socket (client_socket)) {
1738 if (trans.read_from_socket (client_socket)
1739 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1740 && trans.get_data (info.pos_x)
1741 && trans.get_data (info.pos_y)
1742 && trans.get_data (info.width)
1743 && trans.get_data (info.height)) {
1744 SCIM_DEBUG_MAIN (1) << "get_helper_size success\n";
1747 std::cerr << "get_helper_size failed\n";
1755 bool get_helper_imdata (String &uuid, char **imdata, size_t &len)
1757 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1759 if (it != m_helper_client_index.end ()) {
1763 Socket client_socket (it->second.id);
1767 get_focused_context (client, context);
1768 ctx = get_helper_ic (client, context);
1771 trans.put_command (SCIM_TRANS_CMD_REPLY);
1772 trans.put_data (ctx);
1773 trans.put_data (uuid);
1774 trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
1777 if (trans.write_to_socket (client_socket)
1778 && trans.read_from_socket (client_socket)
1779 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1780 && trans.get_data (imdata, len))
1782 SCIM_DEBUG_MAIN (1) << "get_helper_imdata success\n";
1787 std::cerr << "get_helper_imdata failed\n";
1793 bool get_helper_im_embedded_editor_text (String &uuid, char **buf, size_t &len)
1795 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1797 if (it != m_helper_client_index.end ()) {
1801 Socket client_socket (it->second.id);
1805 get_focused_context (client, context);
1806 ctx = get_helper_ic (client, context);
1809 trans.put_command (SCIM_TRANS_CMD_REPLY);
1810 trans.put_data (ctx);
1811 trans.put_data (uuid);
1812 trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT);
1815 if (trans.write_to_socket (client_socket)
1816 && trans.read_from_socket (client_socket)
1817 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1818 && trans.get_data (buf, len))
1820 SCIM_DEBUG_MAIN (1) << "get_helper_im_embedded_editor_text success\n";
1825 std::cerr << "get_helper_im_embedded_editor_text failed\n";
1831 bool get_helper_layout (String &uuid, uint32 &layout)
1833 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
1835 if (it != m_helper_client_index.end ()) {
1839 Socket client_socket (it->second.id);
1843 get_focused_context (client, context);
1844 ctx = get_helper_ic (client, context);
1847 trans.put_command (SCIM_TRANS_CMD_REPLY);
1848 trans.put_data (ctx);
1849 trans.put_data (uuid);
1850 trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
1853 if (trans.write_to_socket (client_socket)
1854 && trans.read_from_socket (client_socket)
1855 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1856 && trans.get_data (layout))
1858 SCIM_DEBUG_MAIN (1) << "get_helper_layout success\n";
1863 std::cerr << "get_helper_layout failed\n";
1869 bool get_helper_layout_list (String &uuid, std::vector<uint32> &list)
1871 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
1873 if (it != m_helper_client_index.end ()) {
1877 Socket client_socket (it->second.id);
1881 get_focused_context (client, context);
1882 ctx = get_helper_ic (client, context);
1885 trans.put_command (SCIM_TRANS_CMD_REPLY);
1886 trans.put_data (ctx);
1887 trans.put_data (uuid);
1888 trans.put_command (ISM_TRANS_CMD_GET_LAYOUT_LIST);
1891 if (trans.write_to_socket (client_socket)
1892 && trans.read_from_socket (client_socket, 500)
1893 && trans.get_command(cmd) && cmd == SCIM_TRANS_CMD_REPLY
1894 && trans.get_data (list))
1896 SCIM_DEBUG_MAIN (1) << "get_helper_layout_list success\n";
1901 std::cerr << "get_helper_layout_list failed\n";
1907 void get_ise_size (int client_id)
1909 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_size ()\n";
1910 struct rectinfo info;
1913 TOOLBAR_MODE_T mode;
1915 mode = m_current_toolbar_mode;
1917 if (TOOLBAR_HELPER_MODE == mode)
1918 ret = get_helper_size (m_current_helper_uuid, info);
1921 Socket client_socket (client_id);
1924 trans.put_command (SCIM_TRANS_CMD_REPLY);
1928 trans.put_command (SCIM_TRANS_CMD_OK);
1929 trans.put_data (info.pos_x);
1930 trans.put_data (info.pos_y);
1931 trans.put_data (info.width);
1932 trans.put_data (info.height);
1936 std::cerr << "get_ise_size failed\n";
1937 trans.put_command (SCIM_TRANS_CMD_FAIL);
1940 trans.write_to_socket (client_socket);
1943 void get_current_ise_rect (rectinfo &ise_rect)
1945 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_current_ise_rect ()\n";
1946 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
1949 if (TOOLBAR_HELPER_MODE == mode)
1950 ret = get_helper_size (m_current_helper_uuid, ise_rect);
1957 ise_rect.height = 0;
1961 void set_ise_mode (int client_id)
1963 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_mode ()\n";
1966 if (m_recv_trans.get_data (mode))
1968 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1969 set_helper_mode (m_current_helper_uuid, mode);
1973 void set_ise_layout (int client_id)
1975 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_layout ()\n";
1978 if (m_recv_trans.get_data (layout))
1980 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1981 set_helper_layout (m_current_helper_uuid, layout);
1985 void set_ise_language (int client_id)
1987 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_language ()\n";
1990 if (m_recv_trans.get_data (language))
1992 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
1993 set_helper_language (m_current_helper_uuid, language);
1997 void set_isf_language (int client_id)
1999 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_isf_language ()\n";
2003 if (m_recv_trans.get_data (&buf, len))
2006 m_signal_set_isf_language (lang);
2013 void set_ise_imdata (int client_id)
2015 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_imdata ()\n";
2016 char *imdata = NULL;
2019 if (m_recv_trans.get_data (&imdata, len))
2021 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2022 set_helper_imdata (m_current_helper_uuid, imdata, len);
2029 void set_ise_im_embedded_editor_im_button_set_label (int client_id)
2031 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_im_button_set_label ()\n";
2035 if (m_recv_trans.get_data (&data, len))
2037 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2038 set_helper_im_embedded_editor_im_button_set_label (m_current_helper_uuid, data, len);
2045 void set_ise_im_embedded_editor_set_preset_text (int client_id)
2047 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_preset_text ()\n";
2051 if (m_recv_trans.get_data (&data, len))
2053 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2054 set_helper_im_embedded_editor_set_preset_text (m_current_helper_uuid, data, len);
2061 void set_ise_im_embedded_editor_set_text (int client_id)
2063 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_text ()\n";
2067 if (m_recv_trans.get_data (&data, len))
2069 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2070 set_helper_im_embedded_editor_set_text (m_current_helper_uuid, data, len);
2077 void set_ise_im_embedded_editor_set_max_length (int client_id)
2079 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_max_length ()\n";
2082 if (m_recv_trans.get_data (length))
2084 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2085 set_helper_im_embedded_editor_set_max_length (m_current_helper_uuid, length);
2089 void set_ise_im_embedded_editor_set_button_senstivity (int client_id)
2091 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_button_senstivity ()\n";
2093 if (m_recv_trans.get_data (senstivity))
2095 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2096 set_helper_im_embedded_editor_set_button_senstivity (m_current_helper_uuid, senstivity);
2100 void set_ise_im_embedded_editor_set_progress_bar (int client_id)
2102 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_embedded_editor_set_progress_bar ()\n";
2103 uint32 timeout,is_showing;
2104 if (m_recv_trans.get_data (timeout) && m_recv_trans.get_data (is_showing))
2106 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2107 set_helper_im_embedded_editor_set_progress_bar (m_current_helper_uuid, timeout,is_showing);
2111 void get_ise_im_embedded_editor_text (int client_id)
2113 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_im_embedded_editor_text ()\n";
2118 TOOLBAR_MODE_T mode;
2120 mode = m_current_toolbar_mode;
2122 if (TOOLBAR_HELPER_MODE == mode)
2124 ret = get_helper_im_embedded_editor_text (m_current_helper_uuid, &buf, len);
2128 Socket client_socket (client_id);
2131 trans.put_command (SCIM_TRANS_CMD_REPLY);
2134 trans.put_command (SCIM_TRANS_CMD_OK);
2135 trans.put_data (buf, len);
2138 trans.put_command (SCIM_TRANS_CMD_FAIL);
2140 trans.write_to_socket (client_socket);
2146 void set_ise_im_indicator_count_label (int client_id)
2148 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_im_indicator_count_label ()\n";
2152 if (m_recv_trans.get_data (&data, len))
2154 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2155 set_helper_im_indicator_count_label (m_current_helper_uuid, data, len);
2162 void get_ise_imdata (int client_id)
2164 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_imdata ()\n";
2165 char *imdata = NULL;
2169 TOOLBAR_MODE_T mode;
2171 mode = m_current_toolbar_mode;
2173 if (TOOLBAR_HELPER_MODE == mode)
2175 ret = get_helper_imdata (m_current_helper_uuid, &imdata, len);
2179 Socket client_socket (client_id);
2182 trans.put_command (SCIM_TRANS_CMD_REPLY);
2185 trans.put_command (SCIM_TRANS_CMD_OK);
2186 trans.put_data (imdata, len);
2189 trans.put_command (SCIM_TRANS_CMD_FAIL);
2191 trans.write_to_socket (client_socket);
2197 void get_ise_layout (int client_id)
2199 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_layout ()\n";
2203 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2205 if (TOOLBAR_HELPER_MODE == mode)
2206 ret = get_helper_layout (m_current_helper_uuid, layout);
2209 Socket client_socket (client_id);
2212 trans.put_command (SCIM_TRANS_CMD_REPLY);
2214 trans.put_command (SCIM_TRANS_CMD_OK);
2215 trans.put_data (layout);
2217 trans.put_command (SCIM_TRANS_CMD_FAIL);
2220 trans.write_to_socket (client_socket);
2223 bool get_ise_layout_list (std::vector<uint32> &list)
2227 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
2229 if (TOOLBAR_HELPER_MODE == mode)
2230 ret = get_helper_layout_list (m_current_helper_uuid, list);
2235 void get_active_ise_name (int client_id)
2237 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_active_ise_name ()\n";
2239 Socket client_socket (client_id);
2240 char *name = const_cast<char *> (m_current_ise_name.c_str ());
2241 size_t len = strlen (name) + 1;
2244 trans.put_command (SCIM_TRANS_CMD_REPLY);
2245 trans.put_command (SCIM_TRANS_CMD_OK);
2246 trans.put_data (name, len);
2247 trans.write_to_socket (client_socket);
2250 void get_ise_list (int client_id)
2252 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_list ()\n";
2253 std::vector<String> strlist;
2254 m_signal_get_ise_list (strlist);
2257 Socket client_socket (client_id);
2263 trans.put_command (SCIM_TRANS_CMD_REPLY);
2264 trans.put_command (SCIM_TRANS_CMD_OK);
2266 num = strlist.size ();
2267 trans.put_data (num);
2268 for (unsigned int i = 0; i < num; i++)
2270 buf = const_cast<char *>(strlist[i].c_str ());
2271 len = strlen (buf) + 1;
2272 trans.put_data (buf, len);
2275 trans.write_to_socket (client_socket);
2278 void get_language_list (int client_id)
2280 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_language_list ()\n";
2281 std::vector<String> strlist;
2283 m_signal_get_language_list (strlist);
2286 Socket client_socket (client_id);
2292 trans.put_command (SCIM_TRANS_CMD_REPLY);
2293 trans.put_command (SCIM_TRANS_CMD_OK);
2295 num = strlist.size ();
2296 trans.put_data (num);
2297 for (unsigned int i = 0; i < num; i++)
2299 buf = const_cast<char *>(strlist[i].c_str ());
2300 len = strlen (buf) + 1;
2301 trans.put_data (buf, len);
2304 trans.write_to_socket (client_socket);
2307 void get_all_language (int client_id)
2309 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_all_language ()\n";
2310 std::vector<String> strlist;
2312 m_signal_get_all_language (strlist);
2315 Socket client_socket (client_id);
2321 trans.put_command (SCIM_TRANS_CMD_REPLY);
2322 trans.put_command (SCIM_TRANS_CMD_OK);
2324 num = strlist.size ();
2325 trans.put_data (num);
2326 for (unsigned int i = 0; i < num; i++)
2328 buf = const_cast<char *>(strlist[i].c_str ());
2329 len = strlen (buf) + 1;
2330 trans.put_data (buf, len);
2333 trans.write_to_socket (client_socket);
2336 void get_ise_language (int client_id)
2338 SCIM_DEBUG_MAIN(4) << "PanelAgent::get_ise_language ()\n";
2339 std::vector<String> strlist;
2343 Socket client_socket (client_id);
2345 if (!(m_recv_trans.get_data (&buf, len)))
2348 trans.put_command (SCIM_TRANS_CMD_REPLY);
2349 trans.put_command (SCIM_TRANS_CMD_FAIL);
2350 trans.write_to_socket (client_socket);
2356 m_signal_get_ise_language (buf, strlist);
2367 trans.put_command (SCIM_TRANS_CMD_REPLY);
2368 trans.put_command (SCIM_TRANS_CMD_OK);
2370 num = strlist.size ();
2371 trans.put_data (num);
2372 for (unsigned int i = 0; i < num; i++)
2374 buf = const_cast<char *>(strlist[i].c_str ());
2375 len = strlen (buf) + 1;
2376 trans.put_data (buf, len);
2379 trans.write_to_socket (client_socket);
2382 bool reset_ise_option (int client_id)
2384 SCIM_DEBUG_MAIN(1) << "PanelAgent::resect_ise_option ()\n";
2391 ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
2392 if (it != m_client_context_uuids.end ()) {
2393 get_imengine_client_context (it->first, client, context);
2397 Socket client_socket (client);
2398 m_send_trans.clear ();
2399 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2400 m_send_trans.put_data ((uint32) context);
2401 m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
2402 m_send_trans.write_to_socket (client_socket);
2409 trans.put_command (SCIM_TRANS_CMD_REPLY);
2410 trans.put_command (SCIM_TRANS_CMD_OK);
2411 Socket client_socket (client_id);
2412 trans.write_to_socket (client_socket);
2417 bool set_helper_char_count (const String &uuid, char *buf, size_t &len)
2419 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
2421 if (it != m_helper_client_index.end ())
2425 Socket client_socket (it->second.id);
2428 get_focused_context (client, context);
2429 ctx = get_helper_ic (client, context);
2431 m_send_trans.clear ();
2432 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2433 m_send_trans.put_data (ctx);
2434 m_send_trans.put_data (uuid);
2435 m_send_trans.put_command (ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT);
2436 m_send_trans.put_data (buf, len);
2437 m_send_trans.write_to_socket (client_socket);
2443 void set_ise_char_count (int client_id)
2445 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_char_count ()\n";
2449 if (m_recv_trans.get_data (&buf, len))
2451 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2452 set_helper_char_count (m_current_helper_uuid, buf, len);
2459 bool find_active_ise_by_uuid (String uuid)
2461 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
2462 for (; iter != m_helper_info_repository.end (); iter++)
2464 if (!uuid.compare (iter->second.uuid))
2471 void set_active_ise_by_uuid (int client_id)
2473 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_active_ise_by_uuid ()\n";
2477 Socket client_socket (client_id);
2478 m_current_active_imcontrol_id = client_id;
2481 trans.put_command (SCIM_TRANS_CMD_REPLY);
2482 if (!(m_recv_trans.get_data (&buf, len)))
2484 trans.put_command (SCIM_TRANS_CMD_FAIL);
2485 trans.write_to_socket (client_socket);
2494 if (!m_signal_get_ise_info_by_uuid (uuid, info))
2496 trans.put_command (SCIM_TRANS_CMD_FAIL);
2497 trans.write_to_socket (client_socket);
2503 if (info.type == TOOLBAR_KEYBOARD_MODE)
2505 m_signal_set_active_ise_by_uuid (uuid, 1);
2506 trans.put_command (SCIM_TRANS_CMD_OK);
2507 trans.write_to_socket (client_socket);
2512 else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
2514 int count = _id_count--;
2515 if (info.type == TOOLBAR_HELPER_MODE)
2517 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
2518 if (uuid != m_current_helper_uuid)
2519 m_last_helper_uuid = m_current_helper_uuid;
2520 start_helper (uuid, count, DEFAULT_CONTEXT_VALUE);
2521 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
2522 if (iter == m_imcontrol_repository.end ())
2524 struct IMControlStub stub;
2525 stub.count.clear ();
2527 stub.info.push_back (info);
2528 stub.count.push_back (count);
2529 m_imcontrol_repository[client_id] = stub;
2533 iter->second.info.push_back (info);
2534 iter->second.count.push_back (count);
2539 m_signal_set_active_ise_by_uuid (uuid, 1);
2541 if (find_active_ise_by_uuid (uuid))
2543 trans.put_command (SCIM_TRANS_CMD_OK);
2544 trans.write_to_socket (client_socket);
2547 m_ise_pending_repository[uuid] = client_id;
2553 bool find_active_ise_by_name (String name)
2555 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
2556 for (; iter != m_helper_info_repository.end (); iter++)
2558 if (!name.compare (iter->second.name))
2565 void set_active_ise_by_name (int client_id)
2570 Socket client_socket (client_id);
2571 m_current_active_imcontrol_id = client_id;
2574 trans.put_command (SCIM_TRANS_CMD_REPLY);
2575 if (!(m_recv_trans.get_data (&buf, len)))
2577 trans.put_command (SCIM_TRANS_CMD_FAIL);
2578 trans.write_to_socket (client_socket);
2587 if (!m_signal_get_ise_info_by_name (name, info))
2589 trans.put_command (SCIM_TRANS_CMD_FAIL);
2590 trans.write_to_socket (client_socket);
2596 if (info.type == TOOLBAR_KEYBOARD_MODE)
2598 m_signal_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME, name);
2599 trans.put_command (SCIM_TRANS_CMD_OK);
2600 trans.write_to_socket (client_socket);
2605 else if (info.option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
2607 int count = _id_count--;
2608 if (info.type == TOOLBAR_HELPER_MODE)
2610 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
2611 if (info.uuid != m_current_helper_uuid)
2612 m_last_helper_uuid = m_current_helper_uuid;
2613 start_helper (info.uuid, count, DEFAULT_CONTEXT_VALUE);
2614 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
2615 if (iter == m_imcontrol_repository.end ())
2617 struct IMControlStub stub;
2618 stub.count.clear ();
2620 stub.info.push_back (info);
2621 stub.count.push_back (count);
2622 m_imcontrol_repository[client_id] = stub;
2626 iter->second.info.push_back (info);
2627 iter->second.count.push_back (count);
2632 m_signal_set_active_ise_by_name (name);
2634 if (find_active_ise_by_name (name))
2636 trans.put_command (SCIM_TRANS_CMD_OK);
2637 trans.write_to_socket (client_socket);
2640 m_ise_pending_repository[name] = client_id;
2646 void update_isf_control_status (const bool showed)
2648 for (ClientRepository::iterator iter = m_client_repository.begin ();
2649 iter != m_client_repository.end (); ++iter)
2651 if (IMCONTROL_CLIENT == iter->second.type
2652 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
2654 Socket client_socket (iter->first);
2658 trans.put_command (SCIM_TRANS_CMD_REQUEST);
2660 trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_SHOWED);
2662 trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_HIDED);
2663 trans.write_to_socket (client_socket);
2670 void set_ise_private_key (int client_id, bool is_image)
2672 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_private_key ()\n";
2673 uint32 layout_idx, key_idx;
2674 char *label = NULL, *value = NULL;
2677 if (m_recv_trans.get_data (layout_idx)
2678 && m_recv_trans.get_data (key_idx)
2679 && m_recv_trans.get_data (&label, len1)
2680 && m_recv_trans.get_data (&value, len2))
2682 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2683 set_helper_private_key (m_current_helper_uuid,
2699 void set_ise_disable_key (int client_id)
2701 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_disable_key ()\n";
2702 uint32 layout_idx, key_idx, disabled;
2704 if (m_recv_trans.get_data (layout_idx)
2705 && m_recv_trans.get_data (key_idx)
2706 && m_recv_trans.get_data (disabled))
2708 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2709 set_helper_disable_key (m_current_helper_uuid,
2716 int get_active_ise_list (std::vector<String> &strlist)
2719 m_helper_manager.get_active_ise_list (strlist);
2720 return (int)(strlist.size ());
2723 void reset_helper_context (const String &uuid)
2725 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
2727 if (it != m_helper_client_index.end ())
2731 Socket client_socket (it->second.id);
2734 get_focused_context (client, context);
2735 ctx = get_helper_ic (client, context);
2737 m_send_trans.clear ();
2738 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2739 m_send_trans.put_data (ctx);
2740 m_send_trans.put_data (uuid);
2741 m_send_trans.put_command (ISM_TRANS_CMD_RESET_ISE_CONTEXT);
2742 m_send_trans.write_to_socket (client_socket);
2746 void reset_ise_context (int client_id)
2748 SCIM_DEBUG_MAIN(4) << "PanelAgent::reset_ise_context ()\n";
2749 TOOLBAR_MODE_T mode;
2751 mode = m_current_toolbar_mode;
2753 if (TOOLBAR_HELPER_MODE == mode)
2755 reset_helper_context (m_current_helper_uuid);
2759 bool set_helper_screen_direction (const String &uuid, uint32 &direction)
2761 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
2763 if (it != m_helper_client_index.end ())
2767 Socket client_socket (it->second.id);
2770 get_focused_context (client, context);
2771 ctx = get_helper_ic (client, context);
2773 m_send_trans.clear ();
2774 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2775 m_send_trans.put_data (ctx);
2776 m_send_trans.put_data (uuid);
2777 m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION);
2778 m_send_trans.put_data (direction);
2779 m_send_trans.write_to_socket (client_socket);
2786 void set_ise_screen_direction (int client_id)
2788 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_screen_direction ()\n";
2791 if (m_recv_trans.get_data (direction))
2793 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2794 set_helper_screen_direction (m_current_helper_uuid, direction);
2798 void set_ise_caps_mode (int client_id)
2800 SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_caps_mode ()\n";
2803 if (m_recv_trans.get_data (mode))
2805 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
2806 set_helper_caps_mode (m_current_helper_uuid, mode);
2810 int send_display_name (String &name)
2812 return m_helper_manager.send_display_name (name);
2815 bool reload_config (void)
2817 SCIM_DEBUG_MAIN(1) << "PanelAgent::reload_config ()\n";
2821 m_send_trans.clear ();
2822 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2823 m_send_trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
2825 for (ClientRepository::iterator it = m_client_repository.begin ();
2826 it != m_client_repository.end (); ++it) {
2828 if (it->second.type == IMCONTROL_ACT_CLIENT
2829 || it->second.type == IMCONTROL_CLIENT
2830 || it->second.type == HELPER_ACT_CLIENT)
2833 Socket client_socket (it->first);
2834 m_send_trans.write_to_socket (client_socket);
2843 SCIM_DEBUG_MAIN(1) << "PanelAgent::exit ()\n";
2847 m_send_trans.clear ();
2848 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
2849 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
2851 for (ClientRepository::iterator it = m_client_repository.begin ();
2852 it != m_client_repository.end (); ++it) {
2853 Socket client_socket (it->first);
2854 m_send_trans.write_to_socket (client_socket);
2864 bool filter_event (int fd)
2866 SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_event ()\n";
2868 return m_socket_server.filter_event (fd);
2871 bool filter_exception_event (int fd)
2873 SCIM_DEBUG_MAIN (1) << "PanelAgent::filter_exception_event ()\n";
2875 return m_socket_server.filter_exception_event (fd);
2878 int get_server_id ()
2880 SCIM_DEBUG_MAIN (1) << "PanelAgent::get_server_id ()\n";
2882 return m_socket_server.get_id ();
2885 void set_ise_changing (bool changing)
2887 SCIM_DEBUG_MAIN (1) << "PanelAgent::set_ise_changing ()\n";
2888 m_ise_changing = changing;
2891 void update_ise_list (std::vector<String> &strList)
2893 /* send ise list to frontend */
2894 String dst_str = scim_combine_string_list (strList);
2895 m_helper_manager.send_ise_list (dst_str);
2897 /* request PanelClient to update keyboard ise list */
2898 update_keyboard_ise_list ();
2901 Connection signal_connect_reload_config (PanelAgentSlotVoid *slot)
2903 return m_signal_reload_config.connect (slot);
2906 Connection signal_connect_turn_on (PanelAgentSlotVoid *slot)
2908 return m_signal_turn_on.connect (slot);
2911 Connection signal_connect_turn_off (PanelAgentSlotVoid *slot)
2913 return m_signal_turn_off.connect (slot);
2916 Connection signal_connect_show_panel (PanelAgentSlotVoid *slot)
2918 return m_signal_show_panel.connect (slot);
2921 Connection signal_connect_hide_panel (PanelAgentSlotVoid *slot)
2923 return m_signal_hide_panel.connect (slot);
2926 Connection signal_connect_update_screen (PanelAgentSlotInt *slot)
2928 return m_signal_update_screen.connect (slot);
2931 Connection signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
2933 return m_signal_update_spot_location.connect (slot);
2936 Connection signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
2938 return m_signal_update_factory_info.connect (slot);
2941 Connection signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
2943 return m_signal_start_default_ise.connect (slot);
2946 Connection signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
2948 return m_signal_set_candidate_ui.connect (slot);
2951 Connection signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
2953 return m_signal_get_candidate_ui.connect (slot);
2956 Connection signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
2958 return m_signal_set_candidate_position.connect (slot);
2961 Connection signal_connect_get_candidate_rect (PanelAgentSlotRect *slot)
2963 return m_signal_get_candidate_rect.connect (slot);
2966 Connection signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
2968 return m_signal_set_keyboard_ise.connect (slot);
2971 Connection signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
2973 return m_signal_get_keyboard_ise.connect (slot);
2976 Connection signal_connect_show_help (PanelAgentSlotString *slot)
2978 return m_signal_show_help.connect (slot);
2981 Connection signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
2983 return m_signal_show_factory_menu.connect (slot);
2986 Connection signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
2988 return m_signal_show_preedit_string.connect (slot);
2991 Connection signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
2993 return m_signal_show_aux_string.connect (slot);
2996 Connection signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
2998 return m_signal_show_lookup_table.connect (slot);
3001 Connection signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
3003 return m_signal_show_associate_table.connect (slot);
3006 Connection signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
3008 return m_signal_hide_preedit_string.connect (slot);
3011 Connection signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
3013 return m_signal_hide_aux_string.connect (slot);
3016 Connection signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
3018 return m_signal_hide_lookup_table.connect (slot);
3021 Connection signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
3023 return m_signal_hide_associate_table.connect (slot);
3026 Connection signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
3028 return m_signal_update_preedit_string.connect (slot);
3031 Connection signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
3033 return m_signal_update_preedit_caret.connect (slot);
3036 Connection signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
3038 return m_signal_update_aux_string.connect (slot);
3041 Connection signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
3043 return m_signal_update_lookup_table.connect (slot);
3046 Connection signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
3048 return m_signal_update_associate_table.connect (slot);
3051 Connection signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
3053 return m_signal_register_properties.connect (slot);
3056 Connection signal_connect_update_property (PanelAgentSlotProperty *slot)
3058 return m_signal_update_property.connect (slot);
3061 Connection signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
3063 return m_signal_register_helper_properties.connect (slot);
3066 Connection signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
3068 return m_signal_update_helper_property.connect (slot);
3071 Connection signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
3073 return m_signal_register_helper.connect (slot);
3076 Connection signal_connect_remove_helper (PanelAgentSlotInt *slot)
3078 return m_signal_remove_helper.connect (slot);
3081 Connection signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
3083 return m_signal_set_active_ise_by_uuid.connect (slot);
3086 Connection signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
3088 return m_signal_set_active_ise_by_name.connect (slot);
3091 Connection signal_connect_focus_in (PanelAgentSlotVoid *slot)
3093 return m_signal_focus_in.connect (slot);
3096 Connection signal_connect_focus_out (PanelAgentSlotVoid *slot)
3098 return m_signal_focus_out.connect (slot);
3101 Connection signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
3103 return m_signal_get_ise_list.connect (slot);
3106 Connection signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
3108 return m_signal_get_keyboard_ise_list.connect (slot);
3110 Connection signal_connect_launch_helper_ise_list_selection (PanelAgentSlotInt *slot)
3112 return m_signal_launch_helper_ise_list_selection.connect (slot);
3115 Connection signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
3117 return m_signal_get_language_list.connect (slot);
3120 Connection signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
3122 return m_signal_get_all_language.connect (slot);
3125 Connection signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
3127 return m_signal_get_ise_language.connect (slot);
3130 Connection signal_connect_set_isf_language (PanelAgentSlotString *slot)
3132 return m_signal_set_isf_language.connect (slot);
3135 Connection signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
3137 return m_signal_get_ise_info_by_uuid.connect (slot);
3140 Connection signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
3142 return m_signal_get_ise_info_by_name.connect (slot);
3145 Connection signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
3147 return m_signal_send_key_event.connect (slot);
3150 Connection signal_connect_accept_connection (PanelAgentSlotInt *slot)
3152 return m_signal_accept_connection.connect (slot);
3155 Connection signal_connect_close_connection (PanelAgentSlotInt *slot)
3157 return m_signal_close_connection.connect (slot);
3160 Connection signal_connect_exit (PanelAgentSlotVoid *slot)
3162 return m_signal_exit.connect (slot);
3165 Connection signal_connect_transaction_start (PanelAgentSlotVoid *slot)
3167 return m_signal_transaction_start.connect (slot);
3170 Connection signal_connect_transaction_end (PanelAgentSlotVoid *slot)
3172 return m_signal_transaction_end.connect (slot);
3175 Connection signal_connect_lock (PanelAgentSlotVoid *slot)
3177 return m_signal_lock.connect (slot);
3180 Connection signal_connect_unlock (PanelAgentSlotVoid *slot)
3182 return m_signal_unlock.connect (slot);
3186 bool socket_check_client_connection (const Socket &client)
3188 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_check_client_connection (" << client.get_id () << ")\n";
3190 unsigned char buf [sizeof(uint32)];
3192 int nbytes = client.read_with_timeout (buf, sizeof(uint32), m_socket_timeout);
3194 if (nbytes == sizeof (uint32))
3198 SCIM_DEBUG_MAIN (4) << "Error occurred when reading socket: " << client.get_error_message () << ".\n";
3200 SCIM_DEBUG_MAIN (4) << "Timeout when reading socket.\n";
3206 void socket_accept_callback (SocketServer *server,
3207 const Socket &client)
3209 SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_accept_callback (" << client.get_id () << ")\n";
3212 if (m_should_exit) {
3213 SCIM_DEBUG_MAIN (3) << "Exit Socket Server Thread.\n";
3214 server->shutdown ();
3216 m_signal_accept_connection (client.get_id ());
3220 void socket_receive_callback (SocketServer *server,
3221 const Socket &client)
3223 int client_id = client.get_id ();
3228 bool current = false;
3231 ClientInfo client_info;
3233 SCIM_DEBUG_MAIN (1) << "PanelAgent::socket_receive_callback (" << client_id << ")\n";
3235 /* If the connection is closed then close this client. */
3236 if (!socket_check_client_connection (client)) {
3237 socket_close_connection (server, client);
3241 client_info = socket_get_client_info (client_id);
3243 /* If it's a new client, then request to open the connection first. */
3244 if (client_info.type == UNKNOWN_CLIENT) {
3245 socket_open_connection (server, client);
3249 /* If can not read the transaction,
3250 * or the transaction is not started with SCIM_TRANS_CMD_REQUEST,
3251 * or the key is mismatch,
3253 if (!m_recv_trans.read_from_socket (client, m_socket_timeout) ||
3254 !m_recv_trans.get_command (cmd) || cmd != SCIM_TRANS_CMD_REQUEST ||
3255 !m_recv_trans.get_data (key) || key != (uint32) client_info.key)
3258 if (client_info.type == FRONTEND_CLIENT) {
3259 if (m_recv_trans.get_data (context)) {
3260 SCIM_DEBUG_MAIN (1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
3261 socket_transaction_start();
3262 while (m_recv_trans.get_command (cmd)) {
3263 SCIM_DEBUG_MAIN (3) << "PanelAgent::cmd = " << cmd << "\n";
3265 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
3266 if (m_recv_trans.get_data (uuid)) {
3267 SCIM_DEBUG_MAIN (2) << "PanelAgent::register_input_context (" << client_id << "," << "," << context << "," << uuid << ")\n";
3268 uint32 ctx = get_helper_ic (client_id, context);
3269 m_client_context_uuids [ctx] = uuid;
3274 if (cmd == ISM_TRANS_CMD_PANEL_START_DEFAULT_ISE) {
3275 if ((m_default_ise.type == TOOLBAR_HELPER_MODE) && (m_default_ise.uuid.length () > 0))
3277 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
3278 start_helper (m_default_ise.uuid, client_id, context);
3280 else if (m_default_ise.type == TOOLBAR_KEYBOARD_MODE)
3282 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
3287 if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
3288 uint32 ctx = get_helper_ic (client_id, context);
3289 m_client_context_uuids.erase (ctx);
3290 #ifdef ONE_HELPER_ISE_PROCESS
3291 if (m_client_context_helper.find (ctx) != m_client_context_helper.end ())
3292 stop_helper (m_client_context_helper[ctx], client_id, context);
3294 if (ctx == get_helper_ic (m_current_socket_client, m_current_client_context))
3297 m_current_socket_client = m_last_socket_client;
3298 m_current_client_context = m_last_client_context;
3299 m_current_context_uuid = m_last_context_uuid;
3300 m_last_socket_client = -1;
3301 m_last_client_context = 0;
3302 m_last_context_uuid = String ("");
3303 if (m_current_socket_client == -1)
3306 socket_update_control_panel ();
3311 else if (ctx == get_helper_ic (m_last_socket_client, m_last_client_context))
3314 m_last_socket_client = -1;
3315 m_last_client_context = 0;
3316 m_last_context_uuid = String ("");
3322 if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
3323 socket_reset_input_context (client_id, context);
3327 if (cmd == SCIM_TRANS_CMD_FOCUS_IN) {
3328 get_helper_ic (client_id, context);
3329 m_signal_focus_in ();
3330 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3331 focus_in_helper (m_current_helper_uuid, client_id, context);
3332 #ifdef ONE_HELPER_ISE_PROCESS
3333 uint32 ctx = get_helper_ic (client_id, context);
3334 ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
3335 if (it != m_client_context_helper.end ())
3337 if (m_should_shared_ise)
3339 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3341 if (m_current_helper_uuid != it->second)
3343 stop_helper (it->second, client_id, context);
3344 start_helper (m_current_helper_uuid, client_id, context);
3346 focus_in_helper (m_current_helper_uuid, client_id, context);
3348 else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
3349 stop_helper (it->second, client_id, context);
3353 /* focus in the helper if the context is associated with some helper */
3354 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
3355 m_current_helper_uuid = it->second;
3356 focus_in_helper (m_current_helper_uuid, client_id, context);
3361 if (m_should_shared_ise)
3363 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3365 start_helper (m_current_helper_uuid, client_id, context);
3366 focus_in_helper (m_current_helper_uuid, client_id, context);
3371 /* come here if the context is associated with some imengine */
3372 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
3376 if (m_recv_trans.get_data (uuid)) {
3377 SCIM_DEBUG_MAIN (2) << "PanelAgent::focus_in (" << client_id << "," << "," << context << "," << uuid << ")\n";
3379 if (m_current_socket_client >= 0) {
3380 m_last_socket_client = m_current_socket_client;
3381 m_last_client_context = m_current_client_context;
3382 m_last_context_uuid = m_current_context_uuid;
3384 m_current_socket_client = client_id;
3385 m_current_client_context = context;
3386 m_current_context_uuid = uuid;
3392 if (cmd == ISM_TRANS_CMD_TURN_ON_LOG) {
3393 socket_turn_on_log ();
3397 current = last = false;
3400 /* Get the context uuid from the client context registration table. */
3402 ClientContextUUIDRepository::iterator it = m_client_context_uuids.find (get_helper_ic (client_id, context));
3403 if (it != m_client_context_uuids.end ())
3407 if (m_current_socket_client == client_id && m_current_client_context == context) {
3409 if (!uuid.length ()) uuid = m_current_context_uuid;
3410 } else if (m_last_socket_client == client_id && m_last_client_context == context) {
3412 if (!uuid.length ()) uuid = m_last_context_uuid;
3415 /* Skip to the next command and continue, if it's not current or last focused. */
3416 if (!uuid.length ()) {
3417 SCIM_DEBUG_MAIN (3) << "PanelAgent:: Couldn't find context uuid.\n";
3418 while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
3419 m_recv_trans.skip_data ();
3423 if (cmd == SCIM_TRANS_CMD_START_HELPER) {
3424 socket_start_helper (client_id, context, uuid);
3427 else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
3428 socket_send_helper_event (client_id, context, uuid);
3431 else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
3432 socket_stop_helper (client_id, context, uuid);
3436 /* If it's not focused, just continue. */
3437 if ((!current && !last) || (last && m_current_socket_client >= 0)) {
3438 SCIM_DEBUG_MAIN (3) << "PanelAgent::Not current focused.\n";
3439 while (m_recv_trans.get_data_type () != SCIM_TRANS_DATA_COMMAND && m_recv_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
3440 m_recv_trans.skip_data ();
3444 /* Client must focus in before do any other things. */
3445 if (cmd == SCIM_TRANS_CMD_PANEL_TURN_ON)
3447 else if (cmd == SCIM_TRANS_CMD_PANEL_TURN_OFF)
3449 else if (cmd == SCIM_TRANS_CMD_UPDATE_SCREEN)
3450 socket_update_screen ();
3451 else if (cmd == SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION)
3452 socket_update_spot_location ();
3453 else if (cmd == ISM_TRANS_CMD_UPDATE_CURSOR_POSITION)
3454 socket_update_cursor_position ();
3455 else if (cmd == SCIM_TRANS_CMD_PANEL_UPDATE_FACTORY_INFO)
3456 socket_update_factory_info ();
3457 else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING)
3458 socket_show_preedit_string ();
3459 else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING)
3460 socket_show_aux_string ();
3461 else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE)
3462 socket_show_lookup_table ();
3463 else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE)
3464 socket_show_associate_table ();
3465 else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING)
3466 socket_hide_preedit_string ();
3467 else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING)
3468 socket_hide_aux_string ();
3469 else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE)
3470 socket_hide_lookup_table ();
3471 else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE)
3472 socket_hide_associate_table ();
3473 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING)
3474 socket_update_preedit_string ();
3475 else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET)
3476 socket_update_preedit_caret ();
3477 else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING)
3478 socket_update_aux_string ();
3479 else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE)
3480 socket_update_lookup_table ();
3481 else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE)
3482 socket_update_associate_table ();
3483 else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES)
3484 socket_register_properties ();
3485 else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY)
3486 socket_update_property ();
3487 else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_HELP)
3488 socket_show_help ();
3489 else if (cmd == SCIM_TRANS_CMD_PANEL_SHOW_FACTORY_MENU)
3490 socket_show_factory_menu ();
3491 else if (cmd == SCIM_TRANS_CMD_FOCUS_OUT) {
3492 m_signal_focus_out ();
3494 TOOLBAR_MODE_T mode = m_current_toolbar_mode;
3496 if (TOOLBAR_HELPER_MODE == mode)
3497 focus_out_helper (m_current_helper_uuid, client_id, context);
3499 if (m_current_socket_client >= 0) {
3500 m_last_socket_client = m_current_socket_client;
3501 m_last_client_context = m_current_client_context;
3502 m_last_context_uuid = m_current_context_uuid;
3504 m_current_socket_client = -1;
3505 m_current_client_context = 0;
3506 m_current_context_uuid = String ("");
3510 socket_transaction_end ();
3512 } else if (client_info.type == HELPER_CLIENT) {
3513 socket_transaction_start ();
3514 while (m_recv_trans.get_command (cmd)) {
3515 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_HELPER) {
3516 socket_helper_register_helper (client_id);
3519 socket_transaction_end ();
3520 }else if (client_info.type == HELPER_ACT_CLIENT) {
3521 socket_transaction_start ();
3522 while (m_recv_trans.get_command (cmd)) {
3523 if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER) {
3524 socket_helper_register_helper_passive (client_id);
3525 } else if (cmd == SCIM_TRANS_CMD_COMMIT_STRING) {
3526 socket_helper_commit_string (client_id);
3527 } else if (cmd == SCIM_TRANS_CMD_SHOW_PREEDIT_STRING) {
3528 socket_helper_show_preedit_string (client_id);
3529 } else if (cmd == SCIM_TRANS_CMD_SHOW_AUX_STRING) {
3530 socket_show_aux_string ();
3531 } else if (cmd == SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE) {
3532 socket_show_lookup_table ();
3533 } else if (cmd == ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE) {
3534 socket_show_associate_table ();
3535 } else if (cmd == SCIM_TRANS_CMD_HIDE_PREEDIT_STRING) {
3536 socket_helper_hide_preedit_string (client_id);
3537 } else if (cmd == SCIM_TRANS_CMD_HIDE_AUX_STRING) {
3538 socket_hide_aux_string ();
3539 } else if (cmd == SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE) {
3540 socket_hide_lookup_table ();
3541 } else if (cmd == ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE) {
3542 socket_hide_associate_table ();
3543 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING) {
3544 socket_helper_update_preedit_string (client_id);
3545 } else if (cmd == SCIM_TRANS_CMD_UPDATE_AUX_STRING) {
3546 socket_update_aux_string ();
3547 } else if (cmd == SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE) {
3548 socket_update_lookup_table ();
3549 } else if (cmd == ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE) {
3550 socket_update_associate_table ();
3551 } else if (cmd == SCIM_TRANS_CMD_PROCESS_KEY_EVENT ||
3552 cmd == SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT) {
3553 socket_helper_send_key_event (client_id);
3554 } else if (cmd == SCIM_TRANS_CMD_FORWARD_KEY_EVENT) {
3555 socket_helper_forward_key_event (client_id);
3556 } else if (cmd == SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT) {
3557 socket_helper_send_imengine_event (client_id);
3558 } else if (cmd == SCIM_TRANS_CMD_REGISTER_PROPERTIES) {
3559 socket_helper_register_properties (client_id);
3560 } else if (cmd == SCIM_TRANS_CMD_UPDATE_PROPERTY) {
3561 socket_helper_update_property (client_id);
3562 } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
3564 m_signal_reload_config ();
3565 } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_HIDED) {
3566 socket_helper_update_state_hided (client_id);
3567 } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_SHOWED) {
3568 socket_helper_update_state_showed (client_id);
3569 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
3570 socket_helper_update_input_context (client_id);
3571 } else if (cmd == ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL) {
3572 socket_helper_commit_ise_result_to_imcontrol (client_id);
3573 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
3574 socket_get_keyboard_ise_list ();
3575 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_UI) {
3576 socket_set_candidate_ui ();
3577 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_UI) {
3578 socket_get_candidate_ui ();
3579 } else if (cmd == ISM_TRANS_CMD_SET_CANDIDATE_POSITION) {
3580 socket_set_candidate_position ();
3581 } else if (cmd == ISM_TRANS_CMD_HIDE_CANDIDATE) {
3582 socket_hide_candidate ();
3583 } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_RECT) {
3584 socket_get_candidate_rect ();
3585 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME) {
3586 socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_NAME);
3587 } else if (cmd == ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID) {
3588 socket_set_keyboard_ise (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID);
3589 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE) {
3590 socket_get_keyboard_ise ();
3591 } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_STRING) {
3592 socket_helper_commit_im_embedded_editor_string (client_id);
3593 } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_CHANGED) {
3594 socket_helper_im_embedded_editor_changed (client_id);
3595 } else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PREEDIT_CHANGED) {
3596 socket_helper_im_embedded_editor_preedit_changed (client_id);
3597 } else if(cmd == ISM_TRANS_CMD_LAUNCH_HELPER_ISE_LIST_SELECTION){
3598 socket_helper_launch_helper_ise_list_selection();
3601 socket_transaction_end ();
3603 else if (client_info.type == IMCONTROL_ACT_CLIENT)
3605 socket_transaction_start ();
3607 while (m_recv_trans.get_command (cmd))
3609 if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL)
3610 show_isf_panel (client_id);
3611 else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL)
3612 hide_isf_panel (client_id);
3613 else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL)
3614 show_ise_panel (client_id);
3615 else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL)
3616 hide_ise_panel (client_id);
3617 else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_SIZE)
3618 get_ise_size (client_id);
3619 else if (cmd == ISM_TRANS_CMD_SET_ISE_MODE)
3620 set_ise_mode (client_id);
3621 else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE)
3622 set_ise_language (client_id);
3623 else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA)
3624 set_ise_imdata (client_id);
3625 else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA)
3626 get_ise_imdata (client_id);
3627 else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_NAME)
3628 get_active_ise_name (client_id);
3629 else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_NAME)
3630 set_active_ise_by_name (client_id);
3631 else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID)
3632 set_active_ise_by_uuid (client_id);
3633 else if (cmd == ISM_TRANS_CMD_SET_PRIVATE_KEY)
3634 set_ise_private_key (client_id, false);
3635 else if (cmd == ISM_TRANS_CMD_SET_PRIVATE_KEY_BY_IMG)
3636 set_ise_private_key (client_id, true);
3637 else if (cmd == ISM_TRANS_CMD_SET_DISABLE_KEY)
3638 set_ise_disable_key (client_id);
3639 else if (cmd == ISM_TRANS_CMD_GET_LAYOUT)
3640 get_ise_layout (client_id);
3641 else if (cmd == ISM_TRANS_CMD_SET_LAYOUT)
3642 set_ise_layout (client_id);
3643 else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE)
3644 set_ise_caps_mode (client_id);
3645 else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST)
3646 get_ise_list (client_id);
3647 else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION)
3648 reset_ise_option (client_id);
3649 else if (cmd == ISM_TRANS_CMD_GET_LANGUAGE_LIST)
3650 get_language_list (client_id);
3651 else if (cmd == ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST)
3652 get_all_language (client_id);
3653 else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE)
3654 get_ise_language (client_id);
3655 else if (cmd == ISM_TRANS_CMD_SET_ISF_LANGUAGE)
3656 set_isf_language (client_id);
3657 else if (cmd == ISM_TRANS_CMD_RESET_ISE_CONTEXT)
3658 reset_ise_context (client_id);
3659 else if (cmd == ISM_TRANS_CMD_SET_ISE_SCREEN_DIRECTION)
3660 set_ise_screen_direction (client_id);
3661 else if (cmd == ISM_TRANS_CMD_SET_INDICATOR_CHAR_COUNT)
3662 set_ise_char_count (client_id);
3663 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_IM_BUTTON_SET_LABEL)
3664 set_ise_im_embedded_editor_im_button_set_label (client_id);
3665 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_PRESET_TEXT)
3666 set_ise_im_embedded_editor_set_preset_text (client_id);
3667 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_TEXT)
3668 set_ise_im_embedded_editor_set_text (client_id);
3669 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_SET_MAX_LENGTH)
3670 set_ise_im_embedded_editor_set_max_length (client_id);
3671 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_BUTTON_SENSTIVITY)
3672 set_ise_im_embedded_editor_set_button_senstivity (client_id);
3673 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PROGRESS_BAR)
3674 set_ise_im_embedded_editor_set_progress_bar (client_id);
3675 else if (cmd == ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_GET_TEXT)
3676 get_ise_im_embedded_editor_text (client_id);
3677 else if (cmd == ISM_TRANS_CMD_IM_INDICATOR_SET_COUNT_LABEL)
3678 set_ise_im_indicator_count_label (client_id);
3681 socket_transaction_end ();
3685 void socket_exception_callback (SocketServer *server,
3686 const Socket &client)
3688 SCIM_DEBUG_MAIN (2) << "PanelAgent::socket_exception_callback (" << client.get_id () << ")\n";
3690 socket_close_connection (server, client);
3693 bool socket_open_connection (SocketServer *server,
3694 const Socket &client)
3696 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_open_connection (" << client.get_id () << ")\n";
3699 String type = scim_socket_accept_connection (key,
3701 String ("FrontEnd,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
3705 if (type.length ()) {
3708 info.type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
3709 ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
3710 ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
3711 ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT))));
3713 SCIM_DEBUG_MAIN (4) << "Add client to repository. Type=" << type << " key=" << key << "\n";
3715 m_client_repository [client.get_id ()] = info;
3717 if (info.type == IMCONTROL_ACT_CLIENT)
3719 m_pending_active_imcontrol_id = client.get_id ();
3721 else if (info.type == IMCONTROL_CLIENT)
3723 m_imcontrol_map [m_pending_active_imcontrol_id] = client.get_id();
3724 m_pending_active_imcontrol_id = -1;
3727 const_cast<Socket &>(client).set_nonblock_mode ();
3733 SCIM_DEBUG_MAIN (4) << "Close client connection " << client.get_id () << "\n";
3734 server->close_connection (client);
3738 void socket_close_connection (SocketServer *server,
3739 const Socket &client)
3741 SCIM_DEBUG_MAIN (3) << "PanelAgent::socket_close_connection (" << client.get_id () << ")\n";
3745 m_signal_close_connection (client.get_id ());
3747 ClientInfo client_info = socket_get_client_info (client.get_id ());
3749 m_client_repository.erase (client.get_id ());
3751 server->close_connection (client);
3753 /* Exit panel if there is no connected client anymore. */
3754 if (client_info.type != UNKNOWN_CLIENT && m_client_repository.size () == 0 && !m_should_resident) {
3755 SCIM_DEBUG_MAIN (4) << "Exit Socket Server Thread.\n";
3756 server->shutdown ();
3757 m_signal_exit.emit ();
3762 if (client_info.type == FRONTEND_CLIENT) {
3763 SCIM_DEBUG_MAIN(4) << "It's a FrontEnd client.\n";
3764 /* The focused client is closed. */
3765 if (m_current_socket_client == client.get_id ()) {
3767 m_current_socket_client = -1;
3768 m_current_client_context = 0;
3769 m_current_context_uuid = String ("");
3772 socket_transaction_start ();
3774 socket_transaction_end ();
3777 if (m_last_socket_client == client.get_id ()) {
3779 m_last_socket_client = -1;
3780 m_last_client_context = 0;
3781 m_last_context_uuid = String ("");
3785 /* Erase all associated Client Context UUIDs. */
3786 std::vector <uint32> ctx_list;
3787 ClientContextUUIDRepository::iterator it = m_client_context_uuids.begin ();
3788 for (; it != m_client_context_uuids.end (); ++it) {
3789 if ((it->first & 0xFFFF) == (client.get_id () & 0xFFFF))
3790 ctx_list.push_back (it->first);
3793 for (size_t i = 0; i < ctx_list.size (); ++i)
3794 m_client_context_uuids.erase (ctx_list [i]);
3796 int client_id = client.get_id ();
3798 /* Erase all helperise info associated with the client */
3800 it = m_client_context_helper.begin ();
3801 for (; it != m_client_context_helper.end (); ++it) {
3802 if ((it->first & 0xFFFF) == (client_id & 0xFFFF)) {
3803 ctx_list.push_back (it->first);
3805 /* similar to stop_helper except that it will not call get_focused_context() */
3806 String uuid = it->second;
3807 if (m_helper_uuid_count.find (uuid) != m_helper_uuid_count.end ()) {
3808 uint32 count = m_helper_uuid_count[uuid];
3810 m_helper_uuid_count.erase (uuid);
3812 HelperClientIndex::iterator pise = m_helper_client_index.find (uuid);
3813 if (pise != m_helper_client_index.end ())
3815 m_send_trans.clear ();
3816 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
3817 m_send_trans.put_data (it->first);
3818 m_send_trans.put_data (uuid);
3819 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
3820 m_send_trans.write_to_socket (pise->second.id);
3822 SCIM_DEBUG_MAIN(1) << "Stop HelperISE " << uuid << " ...\n";
3826 m_helper_uuid_count[uuid] = count - 1;
3827 focus_out_helper (uuid, (it->first & 0xFFFF), ((it->first >> 16) & 0x7FFF));
3828 SCIM_DEBUG_MAIN(1) << "Decrement usage count of HelperISE " << uuid
3829 << " to " << m_helper_uuid_count[uuid] << "\n";
3835 for (size_t i = 0; i < ctx_list.size (); ++i)
3836 m_client_context_helper.erase (ctx_list [i]);
3838 HelperInfoRepository::iterator iter = m_helper_info_repository.begin ();
3839 for (; iter != m_helper_info_repository.end (); iter++)
3841 if (!m_current_helper_uuid.compare (iter->second.uuid))
3842 if (!(iter->second.option & ISM_ISE_HIDE_IN_CONTROL_PANEL))
3843 socket_update_control_panel ();
3845 } else if (client_info.type == HELPER_CLIENT) {
3846 SCIM_DEBUG_MAIN(4) << "It's a Helper client.\n";
3850 HelperInfoRepository::iterator hiit = m_helper_info_repository.find (client.get_id ());
3852 if (hiit != m_helper_info_repository.end ()) {
3853 bool restart = false;
3854 String uuid = hiit->second.uuid;
3856 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
3857 if ((hiit->second.option & SCIM_HELPER_AUTO_RESTART) &&
3858 (it != m_helper_client_index.end () && it->second.ref > 0))
3861 m_helper_manager.stop_helper (hiit->second.name);
3863 m_helper_client_index.erase (uuid);
3864 m_helper_info_repository.erase (hiit);
3866 if (restart && !m_ise_exiting)
3867 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
3870 m_ise_exiting = false;
3873 socket_transaction_start ();
3874 m_signal_remove_helper (client.get_id ());
3875 socket_transaction_end ();
3876 } else if (client_info.type == HELPER_ACT_CLIENT) {
3877 SCIM_DEBUG_MAIN(4) << "It's a Helper passive client.\n";
3881 HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client.get_id ());
3882 if (hiit != m_helper_active_info_repository.end ())
3883 m_helper_active_info_repository.erase (hiit);
3886 } else if (client_info.type == IMCONTROL_ACT_CLIENT) {
3887 SCIM_DEBUG_MAIN(4) << "It's a IMCONTROL_ACT_CLIENT client.\n";
3888 int client_id = client.get_id ();
3890 if (client_id == m_current_active_imcontrol_id
3891 && TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
3892 hide_helper (m_current_helper_uuid);
3894 IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
3895 if (iter != m_imcontrol_repository.end ())
3897 int size = iter->second.info.size ();
3900 stop_helper ((iter->second.info)[i].uuid, (iter->second.count)[i], DEFAULT_CONTEXT_VALUE);
3901 if ((iter->second.info)[i].option & ISM_ISE_HIDE_IN_CONTROL_PANEL)
3902 m_current_helper_uuid = m_last_helper_uuid;
3905 m_imcontrol_repository.erase (iter);
3908 IntIntRepository::iterator iter2 = m_imcontrol_map.find (client_id);
3909 if (iter2 != m_imcontrol_map.end ())
3910 m_imcontrol_map.erase (iter2);
3914 const ClientInfo & socket_get_client_info (int client)
3916 static ClientInfo null_client = { 0, UNKNOWN_CLIENT };
3918 ClientRepository::iterator it = m_client_repository.find (client);
3920 if (it != m_client_repository.end ())
3927 void socket_turn_on (void)
3929 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on ()\n";
3931 m_signal_turn_on ();
3934 void socket_turn_off (void)
3936 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_off ()\n";
3938 m_signal_turn_off ();
3941 void socket_update_screen (void)
3943 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_screen ()\n";
3946 if (m_recv_trans.get_data (num) && ((int) num) != m_current_screen) {
3947 SCIM_DEBUG_MAIN(4) << "New Screen number = " << num << "\n";
3948 m_signal_update_screen ((int) num);
3949 helper_all_update_screen ((int) num);
3950 m_current_screen = (num);
3954 void socket_update_spot_location (void)
3956 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_spot_location ()\n";
3959 if (m_recv_trans.get_data (x) && m_recv_trans.get_data (y) && m_recv_trans.get_data (top_y)) {
3960 SCIM_DEBUG_MAIN(4) << "New Spot location x=" << x << " y=" << y << "\n";
3961 m_signal_update_spot_location ((int)x, (int)y, (int)top_y);
3962 helper_all_update_spot_location ((int)x, (int)y);
3966 void socket_update_cursor_position (void)
3968 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_cursor_position ()\n";
3971 if (m_recv_trans.get_data (cursor_pos)) {
3972 SCIM_DEBUG_MAIN(4) << "New cursor position pos=" << cursor_pos << "\n";
3973 helper_all_update_cursor_position ((int)cursor_pos);
3977 void socket_update_factory_info (void)
3979 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_factory_info ()\n";
3981 PanelFactoryInfo info;
3982 if (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
3983 m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
3984 SCIM_DEBUG_MAIN(4) << "New Factory info uuid=" << info.uuid << " name=" << info.name << "\n";
3985 info.lang = scim_get_normalized_language (info.lang);
3986 m_signal_update_factory_info (info);
3990 void socket_show_help (void)
3992 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_help ()\n";
3995 if (m_recv_trans.get_data (help))
3996 m_signal_show_help (help);
3999 void socket_show_factory_menu (void)
4001 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_factory_menu ()\n";
4003 PanelFactoryInfo info;
4004 std::vector <PanelFactoryInfo> vec;
4006 while (m_recv_trans.get_data (info.uuid) && m_recv_trans.get_data (info.name) &&
4007 m_recv_trans.get_data (info.lang) && m_recv_trans.get_data (info.icon)) {
4008 info.lang = scim_get_normalized_language (info.lang);
4009 vec.push_back (info);
4013 m_signal_show_factory_menu (vec);
4016 void socket_turn_on_log (void)
4018 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_turn_on_log ()\n";
4021 if (m_recv_trans.get_data (isOn)) {
4023 DebugOutput::enable_debug (SCIM_DEBUG_AllMask);
4024 DebugOutput::set_verbose_level (7);
4026 DebugOutput::disable_debug (SCIM_DEBUG_AllMask);
4027 DebugOutput::set_verbose_level (0);
4031 uint32 focused_context;
4033 get_focused_context (focused_client, focused_context);
4035 if (focused_client == -1 || focused_context == 0)
4038 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4040 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
4042 if (it != m_helper_client_index.end ())
4044 Socket client_socket (it->second.id);
4047 ctx = get_helper_ic (focused_client, focused_context);
4049 m_send_trans.clear ();
4050 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4051 m_send_trans.put_data (ctx);
4052 m_send_trans.put_data (m_current_helper_uuid);
4053 m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
4054 m_send_trans.put_data (isOn);
4055 m_send_trans.write_to_socket (client_socket);
4059 ClientInfo client_info = socket_get_client_info (focused_client);
4060 if (client_info.type == FRONTEND_CLIENT) {
4061 Socket socket_client (focused_client);
4063 m_send_trans.clear ();
4064 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4065 m_send_trans.put_data (focused_context);
4066 m_send_trans.put_command (ISM_TRANS_CMD_TURN_ON_LOG);
4067 m_send_trans.put_data (isOn);
4068 m_send_trans.write_to_socket (socket_client);
4074 void socket_show_preedit_string (void)
4076 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_preedit_string ()\n";
4077 m_signal_show_preedit_string ();
4080 void socket_show_aux_string (void)
4082 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_aux_string ()\n";
4083 m_signal_show_aux_string ();
4086 void socket_show_lookup_table (void)
4088 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_lookup_table ()\n";
4089 m_signal_show_lookup_table ();
4092 void socket_show_associate_table (void)
4094 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_show_associate_table ()\n";
4095 m_signal_show_associate_table ();
4098 void socket_hide_preedit_string (void)
4100 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_preedit_string ()\n";
4101 m_signal_hide_preedit_string ();
4104 void socket_hide_aux_string (void)
4106 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_aux_string ()\n";
4107 m_signal_hide_aux_string ();
4110 void socket_hide_lookup_table (void)
4112 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_lookup_table ()\n";
4113 m_signal_hide_lookup_table ();
4116 void socket_hide_associate_table (void)
4118 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_associate_table ()\n";
4119 m_signal_hide_associate_table ();
4122 void socket_update_preedit_string (void)
4124 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_string ()\n";
4127 AttributeList attrs;
4128 if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
4129 m_signal_update_preedit_string (str, attrs);
4132 void socket_update_preedit_caret (void)
4134 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_preedit_caret ()\n";
4137 if (m_recv_trans.get_data (caret))
4138 m_signal_update_preedit_caret ((int) caret);
4141 void socket_update_aux_string (void)
4143 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_aux_string ()\n";
4146 AttributeList attrs;
4147 if (m_recv_trans.get_data (str) && m_recv_trans.get_data (attrs))
4148 m_signal_update_aux_string (str, attrs);
4151 void socket_update_lookup_table (void)
4153 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_lookup_table ()\n";
4156 if (m_recv_trans.get_data (g_isf_candidate_table))
4159 m_signal_update_lookup_table (g_isf_candidate_table);
4167 void socket_update_associate_table (void)
4169 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_associate_table ()\n";
4171 CommonLookupTable table;
4172 if (m_recv_trans.get_data (table))
4173 m_signal_update_associate_table (table);
4176 void socket_update_control_panel (void)
4178 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_control_panel ()\n";
4179 /* Check default ISE for no context app */
4180 #ifdef ONE_HELPER_ISE_PROCESS
4181 uint32 ctx = get_helper_ic (-1, 0);
4182 ClientContextUUIDRepository::iterator it = m_client_context_helper.find (ctx);
4183 if (it != m_client_context_helper.end ())
4185 if (m_should_shared_ise)
4187 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4189 if (m_current_helper_uuid != it->second)
4191 stop_helper (it->second, -1, 0);
4192 start_helper (m_current_helper_uuid, -1, 0);
4195 else if (TOOLBAR_KEYBOARD_MODE == m_current_toolbar_mode)
4196 stop_helper (it->second, -1, 0);
4200 m_current_toolbar_mode = TOOLBAR_HELPER_MODE;
4201 m_current_helper_uuid = it->second;
4206 if (m_should_shared_ise)
4208 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
4209 start_helper (m_current_helper_uuid, -1, 0);
4213 m_current_toolbar_mode = TOOLBAR_KEYBOARD_MODE;
4219 m_signal_get_keyboard_ise (name, uuid);
4221 PanelFactoryInfo info;
4222 if (name.length () > 0)
4223 info = PanelFactoryInfo (uuid, name, String (""), String (""));
4225 info = PanelFactoryInfo (String (""), String (_("English/Keyboard")), String ("C"), String (SCIM_KEYBOARD_ICON_FILE));
4226 m_signal_update_factory_info (info);
4229 void socket_register_properties (void)
4231 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_register_properties ()\n";
4233 PropertyList properties;
4235 if (m_recv_trans.get_data (properties))
4236 m_signal_register_properties (properties);
4239 void socket_update_property (void)
4241 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_update_property ()\n";
4244 if (m_recv_trans.get_data (property))
4245 m_signal_update_property (property);
4248 void socket_get_keyboard_ise_list (void)
4250 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise_list ()\n";
4252 std::vector<String> list;
4254 m_signal_get_keyboard_ise_list (list);
4257 if (m_recv_trans.get_data (uuid))
4259 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4260 if (it != m_helper_client_index.end ())
4264 get_focused_context (client, context);
4265 uint32 ctx = get_helper_ic (client, context);
4266 Socket socket_client (it->second.id);
4267 m_send_trans.clear ();
4268 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4269 m_send_trans.put_data (ctx);
4270 m_send_trans.put_data (uuid);
4271 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST);
4272 m_send_trans.put_data (list.size ());
4273 for (unsigned int i = 0; i < list.size (); i++)
4274 m_send_trans.put_data (list[i]);
4275 m_send_trans.write_to_socket (socket_client);
4280 void socket_set_candidate_ui (void)
4282 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_ui ()\n";
4285 if (m_recv_trans.get_data (style) && m_recv_trans.get_data (mode))
4287 m_signal_set_candidate_ui (style, mode);
4291 void socket_get_candidate_ui (void)
4293 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_ui ()\n";
4295 int style = 0, mode = 0;
4296 m_signal_get_candidate_ui (style, mode);
4299 if (m_recv_trans.get_data (uuid))
4301 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4302 if (it != m_helper_client_index.end ())
4306 get_focused_context (client, context);
4307 uint32 ctx = get_helper_ic (client, context);
4308 Socket socket_client (it->second.id);
4309 m_send_trans.clear ();
4310 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4311 m_send_trans.put_data (ctx);
4312 m_send_trans.put_data (uuid);
4313 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_UI);
4314 m_send_trans.put_data (style);
4315 m_send_trans.put_data (mode);
4316 m_send_trans.write_to_socket (socket_client);
4321 void socket_set_candidate_position (void)
4323 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_candidate_position ()\n";
4326 if (m_recv_trans.get_data (left) && m_recv_trans.get_data (top))
4328 m_signal_set_candidate_position (left, top);
4332 void socket_hide_candidate (void)
4334 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_hide_candidate ()\n";
4336 m_signal_hide_preedit_string ();
4337 m_signal_hide_aux_string ();
4338 m_signal_hide_lookup_table ();
4339 m_signal_hide_associate_table ();
4342 void socket_get_candidate_rect (void)
4344 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_candidate_rect ()\n";
4346 struct rectinfo info;
4351 m_signal_get_candidate_rect (info);
4354 if (m_recv_trans.get_data (uuid))
4356 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4357 if (it != m_helper_client_index.end ())
4361 get_focused_context (client, context);
4362 uint32 ctx = get_helper_ic (client, context);
4363 Socket socket_client (it->second.id);
4364 m_send_trans.clear ();
4365 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4366 m_send_trans.put_data (ctx);
4367 m_send_trans.put_data (uuid);
4368 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CANDIDATE_RECT);
4369 m_send_trans.put_data (info.pos_x);
4370 m_send_trans.put_data (info.pos_y);
4371 m_send_trans.put_data (info.width);
4372 m_send_trans.put_data (info.height);
4373 m_send_trans.write_to_socket (socket_client);
4378 void socket_set_keyboard_ise (int type)
4380 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_set_keyboard_ise ()\n";
4383 if (m_recv_trans.get_data (ise))
4384 m_signal_set_keyboard_ise (type, ise);
4387 void socket_helper_launch_helper_ise_list_selection (void)
4390 if (m_recv_trans.get_data (withUI))
4391 m_signal_launch_helper_ise_list_selection (withUI);
4394 void socket_get_keyboard_ise (void)
4396 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_get_keyboard_ise ()\n";
4398 String ise_name, ise_uuid;
4403 get_focused_context (client, context);
4404 ctx = get_helper_ic (client, context);
4406 if (m_client_context_uuids.find (ctx) != m_client_context_uuids.end ())
4407 ise_uuid = m_client_context_uuids[ctx];
4408 m_signal_get_keyboard_ise (ise_name, ise_uuid);
4411 if (m_recv_trans.get_data (uuid))
4413 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4414 if (it != m_helper_client_index.end ())
4418 get_focused_context (client, context);
4419 uint32 ctx = get_helper_ic (client, context);
4420 Socket socket_client (it->second.id);
4421 m_send_trans.clear ();
4422 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4423 m_send_trans.put_data (ctx);
4424 m_send_trans.put_data (uuid);
4425 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE);
4426 m_send_trans.put_data (ise_name);
4427 m_send_trans.put_data (ise_uuid);
4428 m_send_trans.write_to_socket (socket_client);
4433 void socket_start_helper (int client, uint32 context, const String &ic_uuid)
4435 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_start_helper ()\n";
4438 if (m_recv_trans.get_data (uuid) && uuid.length ()) {
4439 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4443 uint32 ic = get_helper_ic (client, context);
4445 SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
4447 if (it == m_helper_client_index.end ()) {
4448 SCIM_DEBUG_MAIN(5) << "Run this Helper.\n";
4449 m_start_helper_ic_index [uuid].push_back (std::make_pair (ic, ic_uuid));
4450 m_helper_manager.run_helper (uuid, m_config_name, m_display_name);
4452 SCIM_DEBUG_MAIN(5) << "Increase the Reference count.\n";
4453 Socket client_socket (it->second.id);
4454 m_send_trans.clear ();
4455 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4456 m_send_trans.put_data (ic);
4457 m_send_trans.put_data (ic_uuid);
4458 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
4459 m_send_trans.write_to_socket (client_socket);
4467 void socket_stop_helper (int client, uint32 context, const String &ic_uuid)
4469 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_stop_helper ()\n";
4472 if (m_recv_trans.get_data (uuid) && uuid.length ()) {
4473 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4477 uint32 ic = get_helper_ic (client, context);
4479 SCIM_DEBUG_MAIN(5) << "Helper UUID =" << uuid << " IC UUID =" << ic_uuid <<"\n";
4481 if (it != m_helper_client_index.end ()) {
4482 SCIM_DEBUG_MAIN(5) << "Decrase the Reference count.\n";
4484 Socket client_socket (it->second.id);
4485 m_send_trans.clear ();
4486 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4487 m_send_trans.put_data (ic);
4488 m_send_trans.put_data (ic_uuid);
4489 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT);
4490 if (it->second.ref <= 0)
4491 m_send_trans.put_command (SCIM_TRANS_CMD_EXIT);
4492 m_send_trans.write_to_socket (client_socket);
4499 void socket_send_helper_event (int client, uint32 context, const String &ic_uuid)
4501 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_send_helper_event ()\n";
4504 if (m_recv_trans.get_data (uuid) && m_recv_trans.get_data (m_nest_trans) &&
4505 uuid.length () && m_nest_trans.valid ()) {
4506 HelperClientIndex::iterator it = m_helper_client_index.find (uuid);
4507 if (it != m_helper_client_index.end ()) {
4508 Socket client_socket (it->second.id);
4512 m_send_trans.clear ();
4513 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4515 /* FIXME: We presume that client and context are both less than 65536.
4516 * Hopefully, it should be true in any UNIXs.
4517 * So it's ok to combine client and context into one uint32. */
4518 m_send_trans.put_data (get_helper_ic (client, context));
4519 m_send_trans.put_data (ic_uuid);
4520 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT);
4521 m_send_trans.put_data (m_nest_trans);
4522 m_send_trans.write_to_socket (client_socket);
4529 void socket_helper_register_properties (int client)
4531 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_properties (" << client << ")\n";
4533 PropertyList properties;
4534 if (m_recv_trans.get_data (properties))
4535 m_signal_register_helper_properties (client, properties);
4538 void socket_helper_update_property (int client)
4540 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_property (" << client << ")\n";
4543 if (m_recv_trans.get_data (property))
4544 m_signal_update_helper_property (client, property);
4547 void socket_helper_send_imengine_event (int client)
4549 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_imengine_event (" << client << ")\n";
4554 HelperInfoRepository::iterator hiit = m_helper_active_info_repository.find (client);
4556 if (m_recv_trans.get_data (target_ic) &&
4557 m_recv_trans.get_data (target_uuid) &&
4558 m_recv_trans.get_data (m_nest_trans) &&
4559 m_nest_trans.valid () &&
4560 hiit != m_helper_active_info_repository.end ()) {
4563 uint32 target_context;
4565 get_imengine_client_context (target_ic, target_client, target_context);
4568 uint32 focused_context;
4569 String focused_uuid;
4571 focused_uuid = get_focused_context (focused_client, focused_context);
4573 if (target_ic == (uint32) (-1)) {
4574 target_client = focused_client;
4575 target_context = focused_context;
4578 if (target_uuid.length () == 0)
4579 target_uuid = focused_uuid;
4581 ClientInfo client_info = socket_get_client_info (target_client);
4583 SCIM_DEBUG_MAIN(5) << "Target UUID = " << target_uuid << " Focused UUId = " << focused_uuid << "\nTarget Client = " << target_client << "\n";
4585 if (client_info.type == FRONTEND_CLIENT) {
4586 Socket socket_client (target_client);
4588 m_send_trans.clear ();
4589 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4590 m_send_trans.put_data (target_context);
4591 m_send_trans.put_command (SCIM_TRANS_CMD_PROCESS_HELPER_EVENT);
4592 m_send_trans.put_data (target_uuid);
4593 m_send_trans.put_data (hiit->second.uuid);
4594 m_send_trans.put_data (m_nest_trans);
4595 m_send_trans.write_to_socket (socket_client);
4601 void socket_helper_key_event_op (int client, int cmd)
4607 if (m_recv_trans.get_data (target_ic) &&
4608 m_recv_trans.get_data (target_uuid) &&
4609 m_recv_trans.get_data (key) &&
4613 uint32 target_context;
4615 get_imengine_client_context (target_ic, target_client, target_context);
4618 uint32 focused_context;
4619 String focused_uuid;
4621 focused_uuid = get_focused_context (focused_client, focused_context);
4623 if (target_ic == (uint32) (-1)) {
4624 target_client = focused_client;
4625 target_context = focused_context;
4628 if (target_uuid.length () == 0)
4629 target_uuid = focused_uuid;
4631 if (target_client == -1)
4633 /* FIXUP: monitor 'Invalid Window' error */
4634 std::cerr << "focused target client is NULL" << "\n";
4636 else if (target_client == focused_client &&
4637 target_context == focused_context &&
4638 target_uuid == focused_uuid)
4640 ClientInfo client_info = socket_get_client_info (target_client);
4641 if (client_info.type == FRONTEND_CLIENT) {
4642 Socket socket_client (target_client);
4644 m_send_trans.clear ();
4645 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4646 m_send_trans.put_data (target_context);
4647 m_send_trans.put_command (cmd);
4648 m_send_trans.put_data (key);
4649 m_send_trans.write_to_socket (socket_client);
4656 void socket_helper_send_key_event (int client)
4658 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_send_key_event (" << client << ")\n";
4659 ISF_PROF_DEBUG("first message")
4661 socket_helper_key_event_op (client, SCIM_TRANS_CMD_PROCESS_KEY_EVENT);
4664 void socket_helper_forward_key_event (int client)
4666 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_forward_key_event (" << client << ")\n";
4668 socket_helper_key_event_op (client, SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
4671 void socket_helper_commit_string (int client)
4673 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_string (" << client << ")\n";
4679 if (m_recv_trans.get_data (target_ic) &&
4680 m_recv_trans.get_data (target_uuid) &&
4681 m_recv_trans.get_data (wstr) &&
4685 uint32 target_context;
4687 get_imengine_client_context (target_ic, target_client, target_context);
4690 uint32 focused_context;
4691 String focused_uuid;
4693 focused_uuid = get_focused_context (focused_client, focused_context);
4695 if (target_ic == (uint32) (-1)) {
4696 target_client = focused_client;
4697 target_context = focused_context;
4700 if (target_uuid.length () == 0)
4701 target_uuid = focused_uuid;
4703 if (target_client == focused_client &&
4704 target_context == focused_context &&
4705 target_uuid == focused_uuid) {
4706 ClientInfo client_info = socket_get_client_info (target_client);
4707 if (client_info.type == FRONTEND_CLIENT) {
4708 Socket socket_client (target_client);
4710 m_send_trans.clear ();
4711 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4712 m_send_trans.put_data (target_context);
4713 m_send_trans.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
4714 m_send_trans.put_data (wstr);
4715 m_send_trans.write_to_socket (socket_client);
4722 void socket_helper_show_preedit_string (int client)
4724 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_show_preedit_string (" << client << ")\n";
4729 if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
4731 uint32 target_context;
4733 get_imengine_client_context (target_ic, target_client, target_context);
4736 uint32 focused_context;
4737 String focused_uuid;
4739 focused_uuid = get_focused_context (focused_client, focused_context);
4741 if (target_ic == (uint32) (-1)) {
4742 target_client = focused_client;
4743 target_context = focused_context;
4746 if (target_uuid.length () == 0)
4747 target_uuid = focused_uuid;
4749 if (target_client == focused_client &&
4750 target_context == focused_context &&
4751 target_uuid == focused_uuid) {
4752 ClientInfo client_info = socket_get_client_info (target_client);
4753 if (client_info.type == FRONTEND_CLIENT) {
4754 Socket socket_client (target_client);
4756 m_send_trans.clear ();
4757 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4758 m_send_trans.put_data (target_context);
4759 m_send_trans.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
4760 m_send_trans.write_to_socket (socket_client);
4767 void socket_helper_hide_preedit_string (int client)
4769 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_hide_preedit_string (" << client << ")\n";
4774 if (m_recv_trans.get_data (target_ic) && m_recv_trans.get_data (target_uuid)) {
4776 uint32 target_context;
4778 get_imengine_client_context (target_ic, target_client, target_context);
4781 uint32 focused_context;
4782 String focused_uuid;
4784 focused_uuid = get_focused_context (focused_client, focused_context);
4786 if (target_ic == (uint32) (-1)) {
4787 target_client = focused_client;
4788 target_context = focused_context;
4791 if (target_uuid.length () == 0)
4792 target_uuid = focused_uuid;
4794 if (target_client == focused_client &&
4795 target_context == focused_context &&
4796 target_uuid == focused_uuid) {
4797 ClientInfo client_info = socket_get_client_info (target_client);
4798 if (client_info.type == FRONTEND_CLIENT) {
4799 Socket socket_client (target_client);
4801 m_send_trans.clear ();
4802 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4803 m_send_trans.put_data (target_context);
4804 m_send_trans.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
4805 m_send_trans.write_to_socket (socket_client);
4812 void socket_helper_update_preedit_string (int client)
4814 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_preedit_string (" << client << ")\n";
4819 AttributeList attrs;
4821 if (m_recv_trans.get_data (target_ic) &&
4822 m_recv_trans.get_data (target_uuid) &&
4823 m_recv_trans.get_data (wstr) && wstr.length () &&
4824 m_recv_trans.get_data (attrs)) {
4827 uint32 target_context;
4829 get_imengine_client_context (target_ic, target_client, target_context);
4832 uint32 focused_context;
4833 String focused_uuid;
4835 focused_uuid = get_focused_context (focused_client, focused_context);
4837 if (target_ic == (uint32) (-1)) {
4838 target_client = focused_client;
4839 target_context = focused_context;
4842 if (target_uuid.length () == 0)
4843 target_uuid = focused_uuid;
4845 if (target_client == focused_client &&
4846 target_context == focused_context &&
4847 target_uuid == focused_uuid) {
4848 ClientInfo client_info = socket_get_client_info (target_client);
4849 if (client_info.type == FRONTEND_CLIENT) {
4850 Socket socket_client (target_client);
4852 m_send_trans.clear ();
4853 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4854 m_send_trans.put_data (target_context);
4855 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
4856 m_send_trans.put_data (wstr);
4857 m_send_trans.put_data (attrs);
4858 m_send_trans.write_to_socket (socket_client);
4866 void socket_helper_register_helper (int client)
4868 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper (" << client << ")\n";
4872 bool result = false;
4876 Socket socket_client (client);
4877 m_send_trans.clear ();
4878 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
4880 if (m_recv_trans.get_data (info.uuid) &&
4881 m_recv_trans.get_data (info.name) &&
4882 m_recv_trans.get_data (info.icon) &&
4883 m_recv_trans.get_data (info.description) &&
4884 m_recv_trans.get_data (info.option) &&
4885 info.uuid.length () &&
4886 info.name.length ()) {
4888 SCIM_DEBUG_MAIN(4) << "New Helper uuid=" << info.uuid << " name=" << info.name << "\n";
4890 HelperClientIndex::iterator it = m_helper_client_index.find (info.uuid);
4892 if (it == m_helper_client_index.end ()) {
4893 m_helper_info_repository [client] = info;
4894 m_helper_client_index [info.uuid] = HelperClientStub (client, 1);
4895 m_send_trans.put_command (SCIM_TRANS_CMD_OK);
4897 StartHelperICIndex::iterator icit = m_start_helper_ic_index.find (info.uuid);
4899 if (icit != m_start_helper_ic_index.end ()) {
4900 m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
4901 for (size_t i = 0; i < icit->second.size (); ++i) {
4902 m_send_trans.put_data (icit->second [i].first);
4903 m_send_trans.put_data (icit->second [i].second);
4905 m_start_helper_ic_index.erase (icit);
4908 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
4909 m_send_trans.put_data ((uint32)m_current_screen);
4913 m_send_trans.put_command (SCIM_TRANS_CMD_FAIL);
4917 m_send_trans.write_to_socket (socket_client);
4922 m_signal_register_helper (client, info);
4925 void socket_helper_register_helper_passive (int client)
4927 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_register_helper_passive (" << client << ")\n";
4933 if (m_recv_trans.get_data (info.uuid) &&
4934 m_recv_trans.get_data (info.name) &&
4935 m_recv_trans.get_data (info.icon) &&
4936 m_recv_trans.get_data (info.description) &&
4937 m_recv_trans.get_data (info.option) &&
4938 info.uuid.length () &&
4939 info.name.length ()) {
4941 SCIM_DEBUG_MAIN(4) << "New Helper Passive uuid=" << info.uuid << " name=" << info.name << "\n";
4943 HelperInfoRepository::iterator it = m_helper_active_info_repository.find (client);
4944 if (it == m_helper_active_info_repository.end ()) {
4945 m_helper_active_info_repository[client] = info;
4948 StringIntRepository::iterator iter = m_ise_pending_repository.find (info.uuid);
4949 if (iter != m_ise_pending_repository.end ())
4952 Socket client_socket (iter->second);
4954 trans.put_command (SCIM_TRANS_CMD_REPLY);
4955 trans.put_command (SCIM_TRANS_CMD_OK);
4956 trans.write_to_socket (client_socket);
4957 m_ise_pending_repository.erase (iter);
4960 iter = m_ise_pending_repository.find (info.name);
4961 if (iter != m_ise_pending_repository.end ())
4964 Socket client_socket (iter->second);
4966 trans.put_command (SCIM_TRANS_CMD_REPLY);
4967 trans.put_command (SCIM_TRANS_CMD_OK);
4968 trans.write_to_socket (client_socket);
4969 m_ise_pending_repository.erase (iter);
4972 if (m_current_active_imcontrol_id != -1 &&
4973 m_ise_settings != NULL && m_ise_changing)
4975 show_helper (info.uuid, m_ise_settings, m_ise_settings_len);
4976 m_ise_changing = false;
4983 void socket_helper_update_state_hided (int client)
4985 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_hided (" << client << ")\n";
4987 ClientRepository::iterator iter = m_client_repository.begin ();
4989 for (; iter != m_client_repository.end (); iter++)
4991 if (IMCONTROL_CLIENT == iter->second.type
4992 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
4994 Socket client_socket (iter->first);
4998 trans.put_command (SCIM_TRANS_CMD_REQUEST);
4999 trans.put_command (ISM_TRANS_CMD_ISE_PANEL_HIDED);
5001 trans.write_to_socket (client_socket);
5007 void socket_helper_update_state_showed (int client)
5009 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_showed (" << client << ")\n";
5011 ClientRepository::iterator iter = m_client_repository.begin ();
5013 for (; iter != m_client_repository.end (); iter++)
5015 if (IMCONTROL_CLIENT == iter->second.type &&
5016 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5018 Socket client_socket (iter->first);
5022 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5023 trans.put_command (ISM_TRANS_CMD_ISE_PANEL_SHOWED);
5025 trans.write_to_socket (client_socket);
5031 void socket_helper_update_input_context (int client)
5033 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_input_context (" << client << ")\n";
5038 if (m_recv_trans.get_data (type) && m_recv_trans.get_data (value))
5040 ClientRepository::iterator iter = m_client_repository.begin ();
5042 for (; iter != m_client_repository.end (); iter++)
5044 if (IMCONTROL_CLIENT == iter->second.type &&
5045 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5047 Socket client_socket (iter->first);
5051 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5052 trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
5053 trans.put_data (type);
5054 trans.put_data (value);
5056 trans.write_to_socket (client_socket);
5063 void socket_helper_commit_ise_result_to_imcontrol (int client)
5065 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_ise_result_to_imcontrol (" << client << ")\n";
5070 if (m_recv_trans.get_data (&buf, len))
5072 ClientRepository::iterator iter = m_client_repository.begin ();
5074 for (; iter != m_client_repository.end (); iter++)
5076 if (IMCONTROL_CLIENT == iter->second.type &&
5077 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5079 Socket client_socket (iter->first);
5083 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5084 trans.put_command (ISM_TRANS_CMD_ISE_RESULT_TO_IMCONTROL);
5085 trans.put_data (buf, len);
5086 trans.write_to_socket (client_socket);
5096 void socket_reset_helper_input_context (const String &uuid, int client, uint32 context)
5098 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5100 if (it != m_helper_client_index.end ())
5102 Socket client_socket (it->second.id);
5103 uint32 ctx = get_helper_ic (client, context);
5105 m_send_trans.clear ();
5106 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5107 m_send_trans.put_data (ctx);
5108 m_send_trans.put_data (uuid);
5109 m_send_trans.put_command (SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT);
5110 m_send_trans.write_to_socket (client_socket);
5114 void socket_reset_input_context (int client, uint32 context)
5116 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_reset_input_context \n";
5118 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5119 socket_reset_helper_input_context (m_current_helper_uuid, client, context);
5122 void socket_helper_commit_im_embedded_editor_string (int client)
5124 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_commit_ise_result_to_imcontrol (" << client << ")\n";
5129 if (m_recv_trans.get_data (&buf, len))
5131 ClientRepository::iterator iter = m_client_repository.begin ();
5133 for (; iter != m_client_repository.end (); iter++)
5135 if (IMCONTROL_CLIENT == iter->second.type
5136 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5138 Socket client_socket (iter->first);
5142 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5143 trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_STRING);
5144 trans.put_data (buf, len);
5145 trans.write_to_socket (client_socket);
5155 void socket_helper_im_embedded_editor_changed (int client)
5157 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_im_embedded_editor_changed (" << client << ")\n";
5159 ClientRepository::iterator iter = m_client_repository.begin ();
5161 for (; iter != m_client_repository.end (); iter++)
5163 if (IMCONTROL_CLIENT == iter->second.type
5164 && iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5166 Socket client_socket (iter->first);
5170 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5171 trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_CHANGED);
5173 trans.write_to_socket (client_socket);
5179 void socket_helper_im_embedded_editor_preedit_changed (int client)
5181 SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_im_embedded_editor_preedit_changed (" << client << ")\n";
5186 if (m_recv_trans.get_data (&buf, len))
5188 ClientRepository::iterator iter = m_client_repository.begin ();
5190 for (; iter != m_client_repository.end (); iter++)
5192 if (IMCONTROL_CLIENT == iter->second.type &&
5193 iter->first == m_imcontrol_map[m_current_active_imcontrol_id])
5195 Socket client_socket (iter->first);
5199 trans.put_command (SCIM_TRANS_CMD_REQUEST);
5200 trans.put_command (ISM_TRANS_CMD_IM_EMBEDDED_EDITOR_PREEDIT_CHANGED);
5201 trans.put_data (buf, len);
5202 trans.write_to_socket (client_socket);
5213 bool helper_select_candidate (uint32 item)
5215 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_candidate \n";
5217 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5219 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5221 if (it != m_helper_client_index.end ())
5225 Socket client_socket (it->second.id);
5228 get_focused_context (client, context);
5229 ctx = get_helper_ic (client, context);
5231 m_send_trans.clear ();
5232 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5233 m_send_trans.put_data (ctx);
5234 m_send_trans.put_data (m_current_helper_uuid);
5235 m_send_trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE);
5236 m_send_trans.put_data ((uint32)item);
5237 m_send_trans.write_to_socket (client_socket);
5246 bool helper_lookup_table_page_up (void)
5248 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_up \n";
5250 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5252 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5254 if (it != m_helper_client_index.end ())
5258 Socket client_socket (it->second.id);
5261 get_focused_context (client, context);
5262 ctx = get_helper_ic (client, context);
5264 m_send_trans.clear ();
5265 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5266 m_send_trans.put_data (ctx);
5267 m_send_trans.put_data (m_current_helper_uuid);
5268 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP);
5269 m_send_trans.write_to_socket (client_socket);
5278 bool helper_lookup_table_page_down (void)
5280 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_lookup_table_page_down \n";
5282 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5284 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5286 if (it != m_helper_client_index.end ())
5290 Socket client_socket (it->second.id);
5293 get_focused_context (client, context);
5294 ctx = get_helper_ic (client, context);
5296 m_send_trans.clear ();
5297 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5298 m_send_trans.put_data (ctx);
5299 m_send_trans.put_data (m_current_helper_uuid);
5300 m_send_trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN);
5301 m_send_trans.write_to_socket (client_socket);
5310 bool helper_update_lookup_table_page_size (uint32 size)
5312 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_lookup_table_page_size \n";
5314 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5316 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5318 if (it != m_helper_client_index.end ())
5322 Socket client_socket (it->second.id);
5325 get_focused_context (client, context);
5326 ctx = get_helper_ic (client, context);
5328 m_send_trans.clear ();
5329 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5330 m_send_trans.put_data (ctx);
5331 m_send_trans.put_data (m_current_helper_uuid);
5332 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE);
5333 m_send_trans.put_data (size);
5334 m_send_trans.write_to_socket (client_socket);
5343 bool helper_select_associate (uint32 item)
5345 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_select_associate \n";
5347 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5349 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5351 if (it != m_helper_client_index.end ())
5355 Socket client_socket (it->second.id);
5358 get_focused_context (client, context);
5359 ctx = get_helper_ic (client, context);
5361 m_send_trans.clear ();
5362 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5363 m_send_trans.put_data (ctx);
5364 m_send_trans.put_data (m_current_helper_uuid);
5365 m_send_trans.put_command (ISM_TRANS_CMD_SELECT_ASSOCIATE);
5366 m_send_trans.put_data ((uint32)item);
5367 m_send_trans.write_to_socket (client_socket);
5376 bool helper_associate_table_page_up (void)
5378 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_up \n";
5380 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5382 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5384 if (it != m_helper_client_index.end ())
5388 Socket client_socket (it->second.id);
5391 get_focused_context (client, context);
5392 ctx = get_helper_ic (client, context);
5394 m_send_trans.clear ();
5395 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5396 m_send_trans.put_data (ctx);
5397 m_send_trans.put_data (m_current_helper_uuid);
5398 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP);
5399 m_send_trans.write_to_socket (client_socket);
5408 bool helper_associate_table_page_down (void)
5410 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_associate_table_page_down \n";
5412 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5414 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5416 if (it != m_helper_client_index.end ())
5420 Socket client_socket (it->second.id);
5423 get_focused_context (client, context);
5424 ctx = get_helper_ic (client, context);
5426 m_send_trans.clear ();
5427 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5428 m_send_trans.put_data (ctx);
5429 m_send_trans.put_data (m_current_helper_uuid);
5430 m_send_trans.put_command (ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN);
5431 m_send_trans.write_to_socket (client_socket);
5440 bool helper_update_associate_table_page_size (uint32 size)
5442 SCIM_DEBUG_MAIN(4) << "PanelAgent::helper_update_associate_table_page_size \n";
5444 if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
5446 HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
5448 if (it != m_helper_client_index.end ())
5452 Socket client_socket (it->second.id);
5455 get_focused_context (client, context);
5456 ctx = get_helper_ic (client, context);
5458 m_send_trans.clear ();
5459 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5460 m_send_trans.put_data (ctx);
5461 m_send_trans.put_data (m_current_helper_uuid);
5462 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE);
5463 m_send_trans.put_data (size);
5464 m_send_trans.write_to_socket (client_socket);
5473 void helper_all_update_spot_location (int x, int y)
5475 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_spot_location (" << x << "," << y << ")\n";
5477 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5481 String uuid = get_focused_context (client, context);
5485 m_send_trans.clear ();
5486 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5488 /* FIXME: We presume that client and context are both less than 65536.
5489 * Hopefully, it should be true in any UNIXs.
5490 * So it's ok to combine client and context into one uint32. */
5491 m_send_trans.put_data (get_helper_ic (client, context));
5492 m_send_trans.put_data (uuid);
5493 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION);
5494 m_send_trans.put_data ((uint32) x);
5495 m_send_trans.put_data ((uint32) y);
5497 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5498 if (hiit->second.option & SCIM_HELPER_NEED_SPOT_LOCATION_INFO) {
5499 Socket client_socket (hiit->first);
5500 m_send_trans.write_to_socket (client_socket);
5507 void helper_all_update_cursor_position (int cursor_pos)
5509 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_cursor_position (" << cursor_pos << ")\n";
5511 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5515 String uuid = get_focused_context (client, context);
5519 m_send_trans.clear ();
5520 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5521 m_send_trans.put_data (get_helper_ic (client, context));
5522 m_send_trans.put_data (uuid);
5523 m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_CURSOR_POSITION);
5524 m_send_trans.put_data ((uint32) cursor_pos);
5526 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5527 Socket client_socket (hiit->first);
5528 m_send_trans.write_to_socket (client_socket);
5534 void helper_all_update_screen (int screen)
5536 SCIM_DEBUG_MAIN (5) << "PanelAgent::helper_all_update_screen (" << screen << ")\n";
5538 HelperInfoRepository::iterator hiit = m_helper_info_repository.begin ();
5546 uuid = get_focused_context (client, context);
5548 m_send_trans.clear ();
5549 m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
5551 /* FIXME: We presume that client and context are both less than 65536.
5552 * Hopefully, it should be true in any UNIXs.
5553 * So it's ok to combine client and context into one uint32. */
5554 m_send_trans.put_data (get_helper_ic (client, context));
5555 m_send_trans.put_data (uuid);
5556 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
5557 m_send_trans.put_data ((uint32) screen);
5559 for (; hiit != m_helper_info_repository.end (); ++ hiit) {
5560 if (hiit->second.option & SCIM_HELPER_NEED_SCREEN_INFO) {
5561 Socket client_socket (hiit->first);
5562 m_send_trans.write_to_socket (client_socket);
5569 const String & get_focused_context (int &client, uint32 &context, bool force_last_context = false) const
5571 if (m_current_socket_client >= 0) {
5572 client = m_current_socket_client;
5573 context = m_current_client_context;
5574 return m_current_context_uuid;
5576 client = m_last_socket_client;
5577 context = m_last_client_context;
5578 return m_last_context_uuid;
5583 void socket_transaction_start (void)
5585 m_signal_transaction_start ();
5588 void socket_transaction_end (void)
5590 m_signal_transaction_end ();
5603 PanelAgent::PanelAgent ()
5604 : m_impl (new PanelAgentImpl ())
5608 PanelAgent::~PanelAgent ()
5614 PanelAgent::initialize (const String &config, const String &display, bool resident)
5616 return m_impl->initialize (config, display, resident);
5620 PanelAgent::valid (void) const
5622 return m_impl->valid ();
5626 PanelAgent::run (void)
5628 return m_impl->run ();
5632 PanelAgent::stop (void)
5639 PanelAgent::get_helper_list (std::vector <HelperInfo> & helpers) const
5641 return m_impl->get_helper_list (helpers);
5644 void PanelAgent::hide_helper (const String &uuid)
5646 m_impl->hide_helper (uuid);
5649 PanelAgent::get_current_toolbar_mode () const
5651 return m_impl->get_current_toolbar_mode ();
5655 PanelAgent::get_current_ise_rect (rectinfo &ise_rect)
5657 m_impl->get_current_ise_rect (ise_rect);
5661 PanelAgent::get_current_helper_uuid () const
5663 return m_impl->get_current_helper_uuid ();
5667 PanelAgent::get_current_helper_name () const
5669 return m_impl->get_current_helper_name ();
5673 PanelAgent::get_current_factory_icon () const
5675 return m_impl->get_current_factory_icon ();
5679 PanelAgent::get_current_ise_name () const
5681 return m_impl->get_current_ise_name ();
5685 PanelAgent::set_current_toolbar_mode (TOOLBAR_MODE_T mode)
5687 m_impl->set_current_toolbar_mode (mode);
5691 PanelAgent::set_current_ise_name (String &name)
5693 m_impl->set_current_ise_name (name);
5697 PanelAgent::set_current_ise_style (uint32 &style)
5699 m_impl->set_current_ise_style (style);
5703 PanelAgent::update_ise_name (String &name)
5705 m_impl->update_ise_name (name);
5709 PanelAgent::update_ise_style (uint32 &style)
5711 m_impl->update_ise_style (style);
5715 PanelAgent::set_current_factory_icon (String &icon)
5717 m_impl->set_current_factory_icon (icon);
5721 PanelAgent::move_preedit_caret (uint32 position)
5723 return m_impl->move_preedit_caret (position);
5727 PanelAgent::request_help (void)
5729 return m_impl->request_help ();
5733 PanelAgent::request_factory_menu (void)
5735 return m_impl->request_factory_menu ();
5739 PanelAgent::change_factory (const String &uuid)
5741 return m_impl->change_factory (uuid);
5745 PanelAgent::candidate_more_window_show (void)
5747 return m_impl->candidate_more_window_show ();
5751 PanelAgent::candidate_more_window_hide (void)
5753 return m_impl->candidate_more_window_hide ();
5757 PanelAgent::select_aux (uint32 item)
5759 return m_impl->select_aux (item);
5763 PanelAgent::select_candidate (uint32 item)
5765 return m_impl->select_candidate (item);
5769 PanelAgent::lookup_table_page_up (void)
5771 return m_impl->lookup_table_page_up ();
5775 PanelAgent::lookup_table_page_down (void)
5777 return m_impl->lookup_table_page_down ();
5781 PanelAgent::update_lookup_table_page_size (uint32 size)
5783 return m_impl->update_lookup_table_page_size (size);
5787 PanelAgent::select_associate (uint32 item)
5789 return m_impl->select_associate (item);
5793 PanelAgent::associate_table_page_up (void)
5795 return m_impl->associate_table_page_up ();
5799 PanelAgent::associate_table_page_down (void)
5801 return m_impl->associate_table_page_down ();
5805 PanelAgent::update_associate_table_page_size (uint32 size)
5807 return m_impl->update_associate_table_page_size (size);
5811 PanelAgent::trigger_property (const String &property)
5813 return m_impl->trigger_property (property);
5817 PanelAgent::trigger_helper_property (int client,
5818 const String &property)
5820 return m_impl->trigger_helper_property (client, property);
5824 PanelAgent::start_helper (const String &uuid)
5826 return m_impl->start_helper (uuid, -2, 0);
5830 PanelAgent::stop_helper (const String &uuid)
5832 return m_impl->stop_helper (uuid, -2, 0);
5836 PanelAgent::set_default_ise (const DEFAULT_ISE_T &ise)
5838 m_impl->set_default_ise (ise);
5842 PanelAgent::set_should_shared_ise (const bool should_shared_ise)
5844 m_impl->set_should_shared_ise (should_shared_ise);
5848 PanelAgent::reset_keyboard_ise () const
5850 return m_impl->reset_keyboard_ise ();
5854 PanelAgent::get_active_ise_list (std::vector<String> &strlist)
5856 return m_impl->get_active_ise_list (strlist);
5860 PanelAgent::update_isf_control_status (const bool showed)
5862 m_impl->update_isf_control_status (showed);
5866 PanelAgent::send_display_name (String &name)
5868 return m_impl->send_display_name (name);
5872 PanelAgent::reload_config (void)
5874 return m_impl->reload_config ();
5878 PanelAgent::exit (void)
5880 return m_impl->exit ();
5884 PanelAgent::filter_event (int fd)
5886 return m_impl->filter_event (fd);
5890 PanelAgent::filter_exception_event (int fd)
5892 return m_impl->filter_exception_event (fd);
5896 PanelAgent::get_server_id (void)
5898 return m_impl->get_server_id ();
5902 PanelAgent::update_ise_list (std::vector<String> &strList)
5904 m_impl->update_ise_list (strList);
5908 PanelAgent::set_ise_changing (bool changing)
5910 m_impl->set_ise_changing (changing);
5914 PanelAgent::signal_connect_reload_config (PanelAgentSlotVoid *slot)
5916 return m_impl->signal_connect_reload_config (slot);
5920 PanelAgent::signal_connect_turn_on (PanelAgentSlotVoid *slot)
5922 return m_impl->signal_connect_turn_on (slot);
5926 PanelAgent::signal_connect_turn_off (PanelAgentSlotVoid *slot)
5928 return m_impl->signal_connect_turn_off (slot);
5932 PanelAgent::signal_connect_show_panel (PanelAgentSlotVoid *slot)
5934 return m_impl->signal_connect_show_panel (slot);
5938 PanelAgent::signal_connect_hide_panel (PanelAgentSlotVoid *slot)
5940 return m_impl->signal_connect_hide_panel (slot);
5944 PanelAgent::signal_connect_update_screen (PanelAgentSlotInt *slot)
5946 return m_impl->signal_connect_update_screen (slot);
5950 PanelAgent::signal_connect_update_spot_location (PanelAgentSlotIntIntInt *slot)
5952 return m_impl->signal_connect_update_spot_location (slot);
5956 PanelAgent::signal_connect_update_factory_info (PanelAgentSlotFactoryInfo *slot)
5958 return m_impl->signal_connect_update_factory_info (slot);
5962 PanelAgent::signal_connect_start_default_ise (PanelAgentSlotVoid *slot)
5964 return m_impl->signal_connect_start_default_ise (slot);
5968 PanelAgent::signal_connect_set_candidate_ui (PanelAgentSlotIntInt *slot)
5970 return m_impl->signal_connect_set_candidate_ui (slot);
5974 PanelAgent::signal_connect_get_candidate_ui (PanelAgentSlotIntInt2 *slot)
5976 return m_impl->signal_connect_get_candidate_ui (slot);
5980 PanelAgent::signal_connect_set_candidate_position (PanelAgentSlotIntInt *slot)
5982 return m_impl->signal_connect_set_candidate_position (slot);
5986 PanelAgent::signal_connect_get_candidate_rect (PanelAgentSlotRect *slot)
5988 return m_impl->signal_connect_get_candidate_rect (slot);
5992 PanelAgent::signal_connect_set_keyboard_ise (PanelAgentSlotIntString *slot)
5994 return m_impl->signal_connect_set_keyboard_ise (slot);
5998 PanelAgent::signal_connect_get_keyboard_ise (PanelAgentSlotString2 *slot)
6000 return m_impl->signal_connect_get_keyboard_ise (slot);
6004 PanelAgent::signal_connect_show_help (PanelAgentSlotString *slot)
6006 return m_impl->signal_connect_show_help (slot);
6010 PanelAgent::signal_connect_show_factory_menu (PanelAgentSlotFactoryInfoVector *slot)
6012 return m_impl->signal_connect_show_factory_menu (slot);
6016 PanelAgent::signal_connect_show_preedit_string (PanelAgentSlotVoid *slot)
6018 return m_impl->signal_connect_show_preedit_string (slot);
6022 PanelAgent::signal_connect_show_aux_string (PanelAgentSlotVoid *slot)
6024 return m_impl->signal_connect_show_aux_string (slot);
6028 PanelAgent::signal_connect_show_lookup_table (PanelAgentSlotVoid *slot)
6030 return m_impl->signal_connect_show_lookup_table (slot);
6034 PanelAgent::signal_connect_show_associate_table (PanelAgentSlotVoid *slot)
6036 return m_impl->signal_connect_show_associate_table (slot);
6040 PanelAgent::signal_connect_hide_preedit_string (PanelAgentSlotVoid *slot)
6042 return m_impl->signal_connect_hide_preedit_string (slot);
6046 PanelAgent::signal_connect_hide_aux_string (PanelAgentSlotVoid *slot)
6048 return m_impl->signal_connect_hide_aux_string (slot);
6052 PanelAgent::signal_connect_hide_lookup_table (PanelAgentSlotVoid *slot)
6054 return m_impl->signal_connect_hide_lookup_table (slot);
6058 PanelAgent::signal_connect_hide_associate_table (PanelAgentSlotVoid *slot)
6060 return m_impl->signal_connect_hide_associate_table (slot);
6064 PanelAgent::signal_connect_update_preedit_string (PanelAgentSlotAttributeString *slot)
6066 return m_impl->signal_connect_update_preedit_string (slot);
6070 PanelAgent::signal_connect_update_preedit_caret (PanelAgentSlotInt *slot)
6072 return m_impl->signal_connect_update_preedit_caret (slot);
6076 PanelAgent::signal_connect_update_aux_string (PanelAgentSlotAttributeString *slot)
6078 return m_impl->signal_connect_update_aux_string (slot);
6082 PanelAgent::signal_connect_update_lookup_table (PanelAgentSlotLookupTable *slot)
6084 return m_impl->signal_connect_update_lookup_table (slot);
6088 PanelAgent::signal_connect_update_associate_table (PanelAgentSlotLookupTable *slot)
6090 return m_impl->signal_connect_update_associate_table (slot);
6094 PanelAgent::signal_connect_register_properties (PanelAgentSlotPropertyList *slot)
6096 return m_impl->signal_connect_register_properties (slot);
6100 PanelAgent::signal_connect_update_property (PanelAgentSlotProperty *slot)
6102 return m_impl->signal_connect_update_property (slot);
6106 PanelAgent::signal_connect_register_helper_properties (PanelAgentSlotIntPropertyList *slot)
6108 return m_impl->signal_connect_register_helper_properties (slot);
6112 PanelAgent::signal_connect_update_helper_property (PanelAgentSlotIntProperty *slot)
6114 return m_impl->signal_connect_update_helper_property (slot);
6118 PanelAgent::signal_connect_register_helper (PanelAgentSlotIntHelperInfo *slot)
6120 return m_impl->signal_connect_register_helper (slot);
6124 PanelAgent::signal_connect_remove_helper (PanelAgentSlotInt *slot)
6126 return m_impl->signal_connect_remove_helper (slot);
6130 PanelAgent::signal_connect_set_active_ise_by_uuid (PanelAgentSlotStringBool *slot)
6132 return m_impl->signal_connect_set_active_ise_by_uuid (slot);
6136 PanelAgent::signal_connect_set_active_ise_by_name (PanelAgentSlotString *slot)
6138 return m_impl->signal_connect_set_active_ise_by_name (slot);
6142 PanelAgent::signal_connect_focus_in (PanelAgentSlotVoid *slot)
6144 return m_impl->signal_connect_focus_in (slot);
6148 PanelAgent::signal_connect_focus_out (PanelAgentSlotVoid *slot)
6150 return m_impl->signal_connect_focus_out (slot);
6154 PanelAgent::signal_connect_get_ise_list (PanelAgentSlotBoolStringVector *slot)
6156 return m_impl->signal_connect_get_ise_list (slot);
6160 PanelAgent::signal_connect_get_keyboard_ise_list (PanelAgentSlotBoolStringVector *slot)
6162 return m_impl->signal_connect_get_keyboard_ise_list (slot);
6166 PanelAgent::signal_connect_launch_helper_ise_list_selection(PanelAgentSlotInt * slot)
6168 return m_impl->signal_connect_launch_helper_ise_list_selection (slot);
6172 PanelAgent::signal_connect_get_language_list (PanelAgentSlotStringVector *slot)
6174 return m_impl->signal_connect_get_language_list (slot);
6178 PanelAgent::signal_connect_get_all_language (PanelAgentSlotStringVector *slot)
6180 return m_impl->signal_connect_get_all_language (slot);
6184 PanelAgent::signal_connect_get_ise_language (PanelAgentSlotStrStringVector *slot)
6186 return m_impl->signal_connect_get_ise_language (slot);
6190 PanelAgent::signal_connect_set_isf_language (PanelAgentSlotString *slot)
6192 return m_impl->signal_connect_set_isf_language (slot);
6196 PanelAgent::signal_connect_get_ise_info_by_uuid (PanelAgentSlotStringISEINFO *slot)
6198 return m_impl->signal_connect_get_ise_info_by_uuid (slot);
6202 PanelAgent::signal_connect_get_ise_info_by_name (PanelAgentSlotStringISEINFO *slot)
6204 return m_impl->signal_connect_get_ise_info_by_name (slot);
6208 PanelAgent::signal_connect_send_key_event (PanelAgentSlotKeyEvent *slot)
6210 return m_impl->signal_connect_send_key_event (slot);
6214 PanelAgent::signal_connect_accept_connection (PanelAgentSlotInt *slot)
6216 return m_impl->signal_connect_accept_connection (slot);
6220 PanelAgent::signal_connect_close_connection (PanelAgentSlotInt *slot)
6222 return m_impl->signal_connect_close_connection (slot);
6226 PanelAgent::signal_connect_exit (PanelAgentSlotVoid *slot)
6228 return m_impl->signal_connect_exit (slot);
6232 PanelAgent::signal_connect_transaction_start (PanelAgentSlotVoid *slot)
6234 return m_impl->signal_connect_transaction_start (slot);
6238 PanelAgent::signal_connect_transaction_end (PanelAgentSlotVoid *slot)
6240 return m_impl->signal_connect_transaction_end (slot);
6244 PanelAgent::signal_connect_lock (PanelAgentSlotVoid *slot)
6246 return m_impl->signal_connect_lock (slot);
6250 PanelAgent::signal_connect_unlock (PanelAgentSlotVoid *slot)
6252 return m_impl->signal_connect_unlock (slot);
6255 } /* namespace scim */
6258 vi:ts=4:nowrap:ai:expandtab