1 /** @file scim_helper.cpp
2 * @brief Implementation of class HelperAgent.
5 /* ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable. */
8 * Smart Common Input Method
10 * Copyright (c) 2004-2005 James Su <suzhe@tsinghua.org.cn>
11 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
14 * This library is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU Lesser General Public
16 * License as published by the Free Software Foundation; either
17 * version 2 of the License, or (at your option) any later version.
19 * This library is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Lesser General Public License for more details.
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with this program; if not, write to the
26 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
27 * Boston, MA 02111-1307 USA
29 * Modifications by Samsung Electronics Co., Ltd.
30 * 1. Add new interface APIs for keyboard ISE
31 * a. expand_candidate (), contract_candidate () and set_candidate_style ()
32 * b. set_keyboard_ise_by_uuid () and reset_keyboard_ise ()
33 * c. get_surrounding_text () and delete_surrounding_text ()
34 * d. show_preedit_string (), hide_preedit_string (), update_preedit_string () and update_preedit_caret ()
35 * e. show_candidate_string (), hide_candidate_string () and update_candidate_string ()
37 * $Id: scim_helper.cpp,v 1.13 2005/05/24 12:22:51 suzhe Exp $
41 #define Uses_SCIM_TRANSACTION
42 #define Uses_SCIM_TRANS_COMMANDS
43 #define Uses_SCIM_HELPER
44 #define Uses_SCIM_SOCKET
45 #define Uses_SCIM_EVENT
49 #include "scim_private.h"
54 typedef Signal3<void, const HelperAgent *, int, const String &>
55 HelperAgentSignalVoid;
57 typedef Signal4<void, const HelperAgent *, int, const String &, const String &>
58 HelperAgentSignalString;
60 typedef Signal4<void, const HelperAgent *, int, const String &, const std::vector<String> &>
61 HelperAgentSignalStringVector;
63 typedef Signal5<void, const HelperAgent *, int, const String &, const String &, const String &>
64 HelperAgentSignalString2;
66 typedef Signal4<void, const HelperAgent *, int, const String &, int>
69 typedef Signal5<void, const HelperAgent *, int, const String &, int, int>
70 HelperAgentSignalIntInt;
72 typedef Signal4<void, const HelperAgent *, int, const String &, const Transaction &>
73 HelperAgentSignalTransaction;
75 typedef Signal4<void, const HelperAgent *, int, const String &, const rectinfo &>
76 HelperAgentSignalRect;
78 typedef Signal2<void, const HelperAgent *, struct rectinfo &>
79 HelperAgentSignalSize;
81 typedef Signal2<void, const HelperAgent *, uint32 &>
82 HelperAgentSignalUintVoid;
84 typedef Signal3<void, const HelperAgent *, int, uint32 &>
85 HelperAgentSignalIntUint;
87 typedef Signal3 <void, const HelperAgent *, char *, size_t &>
88 HelperAgentSignalRawVoid;
90 typedef Signal3 <void, const HelperAgent *, char **, size_t &>
91 HelperAgentSignalGetRawVoid;
93 typedef Signal4 <void, const HelperAgent *, int, char *, size_t &>
94 HelperAgentSignalIntRawVoid;
96 typedef Signal3 <void, const HelperAgent *, int, char **>
97 HelperAgentSignalIntGetStringVoid;
99 typedef Signal2<void, const HelperAgent *, const std::vector<uint32> &>
100 HelperAgentSignalUintVector;
102 class HelperAgent::HelperAgentImpl
106 SocketClient socket_active;
113 HelperAgentSignalVoid signal_exit;
114 HelperAgentSignalVoid signal_attach_input_context;
115 HelperAgentSignalVoid signal_detach_input_context;
116 HelperAgentSignalVoid signal_reload_config;
117 HelperAgentSignalInt signal_update_screen;
118 HelperAgentSignalIntInt signal_update_spot_location;
119 HelperAgentSignalInt signal_update_cursor_position;
120 HelperAgentSignalInt signal_update_surrounding_text;
121 HelperAgentSignalString signal_trigger_property;
122 HelperAgentSignalTransaction signal_process_imengine_event;
123 HelperAgentSignalVoid signal_focus_out;
124 HelperAgentSignalVoid signal_focus_in;
125 HelperAgentSignalIntRawVoid signal_ise_show;
126 HelperAgentSignalVoid signal_ise_hide;
127 HelperAgentSignalSize signal_get_geometry;
128 HelperAgentSignalUintVoid signal_set_mode;
129 HelperAgentSignalUintVoid signal_set_language;
130 HelperAgentSignalRawVoid signal_set_imdata;
131 HelperAgentSignalGetRawVoid signal_get_imdata;
132 HelperAgentSignalIntGetStringVoid signal_get_language_locale;
133 HelperAgentSignalUintVoid signal_set_return_key_type;
134 HelperAgentSignalUintVoid signal_get_return_key_type;
135 HelperAgentSignalUintVoid signal_set_return_key_disable;
136 HelperAgentSignalUintVoid signal_get_return_key_disable;
137 HelperAgentSignalUintVoid signal_set_layout;
138 HelperAgentSignalUintVoid signal_get_layout;
139 HelperAgentSignalUintVoid signal_set_caps_mode;
140 HelperAgentSignalVoid signal_reset_input_context;
141 HelperAgentSignalIntInt signal_update_candidate_ui;
142 HelperAgentSignalRect signal_update_candidate_geometry;
143 HelperAgentSignalString2 signal_update_keyboard_ise;
144 HelperAgentSignalStringVector signal_update_keyboard_ise_list;
145 HelperAgentSignalVoid signal_candidate_more_window_show;
146 HelperAgentSignalVoid signal_candidate_more_window_hide;
147 HelperAgentSignalInt signal_select_aux;
148 HelperAgentSignalInt signal_select_candidate;
149 HelperAgentSignalVoid signal_candidate_table_page_up;
150 HelperAgentSignalVoid signal_candidate_table_page_down;
151 HelperAgentSignalInt signal_update_candidate_table_page_size;
152 HelperAgentSignalUintVector signal_update_candidate_item_layout;
153 HelperAgentSignalInt signal_select_associate;
154 HelperAgentSignalVoid signal_associate_table_page_up;
155 HelperAgentSignalVoid signal_associate_table_page_down;
156 HelperAgentSignalInt signal_update_associate_table_page_size;
157 HelperAgentSignalVoid signal_reset_ise_context;
158 HelperAgentSignalUintVoid signal_turn_on_log;
159 HelperAgentSignalInt signal_update_displayed_candidate_number;
160 HelperAgentSignalInt signal_longpress_candidate;
163 HelperAgentImpl () : magic (0), magic_active (0), timeout (-1) { }
166 HelperAgent::HelperAgent ()
167 : m_impl (new HelperAgentImpl ())
171 HelperAgent::~HelperAgent ()
177 * @brief Open socket connection to the Panel.
179 * @param info The information of this Helper object.
180 * @param display The display which this Helper object should run on.
182 * @return The connection socket id. -1 means failed to create
186 HelperAgent::open_connection (const HelperInfo &info,
187 const String &display)
189 if (m_impl->socket.is_connected ())
192 SocketAddress address (scim_get_default_panel_socket_address (display));
193 int timeout = scim_get_default_socket_timeout ();
196 if (!address.valid ())
200 ret = m_impl->socket.connect (address);
202 scim_usleep (100000);
203 std::cerr << " Re-connecting to PanelAgent server.";
204 ISF_LOG (" Re-connecting to PanelAgent server.\n");
205 for (i = 0; i < 200; ++i) {
206 if (m_impl->socket.connect (address)) {
211 scim_usleep (100000);
213 std::cerr << " Connected :" << i << "\n";
214 ISF_LOG (" Connected :%d\n", i);
219 std::cerr << "m_impl->socket.connect () is failed!!!\n";
220 ISF_LOG ("m_impl->socket.connect () is failed!!!\n");
224 if (!scim_socket_open_connection (magic,
229 m_impl->socket.close ();
230 std::cerr << "scim_socket_open_connection () is failed!!!\n";
231 ISF_LOG ("scim_socket_open_connection () is failed!!!\n");
235 ISF_LOG ("scim_socket_open_connection () is successful.\n");
236 m_impl->send.clear ();
237 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
238 m_impl->send.put_data (magic);
239 m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_REGISTER_HELPER);
240 m_impl->send.put_data (info.uuid);
241 m_impl->send.put_data (info.name);
242 m_impl->send.put_data (info.icon);
243 m_impl->send.put_data (info.description);
244 m_impl->send.put_data (info.option);
246 if (!m_impl->send.write_to_socket (m_impl->socket, magic)) {
247 m_impl->socket.close ();
252 if (m_impl->recv.read_from_socket (m_impl->socket, timeout) &&
253 m_impl->recv.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
254 m_impl->recv.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
255 m_impl->magic = magic;
256 m_impl->timeout = timeout;
258 while (m_impl->recv.get_command (cmd)) {
260 case SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT:
264 while (m_impl->recv.get_data (ic) && m_impl->recv.get_data (ic_uuid))
265 m_impl->signal_attach_input_context (this, ic, ic_uuid);
268 case SCIM_TRANS_CMD_UPDATE_SCREEN:
271 if (m_impl->recv.get_data (screen))
272 m_impl->signal_update_screen (this, (uint32) -1, String (""), (int) screen);
281 /* connect to the panel agent as the active helper client */
282 if (!m_impl->socket_active.connect (address)) return -1;
283 if (!scim_socket_open_connection (magic,
284 String ("Helper_Active"),
286 m_impl->socket_active,
288 m_impl->socket_active.close ();
292 if (m_impl->socket_active.set_nonblock_mode () == -1)
293 std::cerr << __func__ << " socket_active.set_nonblock_mode () is failed!!!\n";
295 m_impl->magic_active = magic;
297 m_impl->send.clear ();
298 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
299 m_impl->send.put_data (magic);
300 m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_REGISTER_ACTIVE_HELPER);
301 m_impl->send.put_data (info.uuid);
302 m_impl->send.put_data (info.name);
303 m_impl->send.put_data (info.icon);
304 m_impl->send.put_data (info.description);
305 m_impl->send.put_data (info.option);
307 if (!m_impl->send.write_to_socket (m_impl->socket_active, magic)) {
308 m_impl->socket_active.close ();
312 return m_impl->socket.get_id ();
316 * @brief Close the socket connection to Panel.
319 HelperAgent::close_connection ()
321 m_impl->socket.close ();
322 m_impl->socket_active.close ();
323 m_impl->send.clear ();
324 m_impl->recv.clear ();
326 m_impl->magic_active = 0;
331 * @brief Get the connection id previously returned by open_connection().
333 * @return the connection id
336 HelperAgent::get_connection_number () const
338 if (m_impl->socket.is_connected ())
339 return m_impl->socket.get_id ();
344 * @brief Check whether this HelperAgent has been connected to a Panel.
346 * Return true when it is connected to panel, otherwise return false.
349 HelperAgent::is_connected () const
351 return m_impl->socket.is_connected ();
355 * @brief Check if there are any events available to be processed.
357 * If it returns true then Helper object should call
358 * HelperAgent::filter_event() to process them.
360 * @return true if there are any events available.
363 HelperAgent::has_pending_event () const
365 if (m_impl->socket.is_connected () && m_impl->socket.wait_for_data (0) > 0)
372 * @brief Process the pending events.
374 * This function will emit the corresponding signals according
377 * @return false if the connection is broken, otherwise return true.
380 HelperAgent::filter_event ()
382 if (!m_impl->socket.is_connected () || !m_impl->recv.read_from_socket (m_impl->socket, m_impl->timeout))
387 uint32 ic = (uint32) -1;
390 if (!m_impl->recv.get_command (cmd) || cmd != SCIM_TRANS_CMD_REPLY)
393 /* If there are ic and ic_uuid then read them. */
394 if (!(m_impl->recv.get_data_type () == SCIM_TRANS_DATA_COMMAND) &&
395 !(m_impl->recv.get_data (ic) && m_impl->recv.get_data (ic_uuid)))
398 while (m_impl->recv.get_command (cmd)) {
400 case SCIM_TRANS_CMD_EXIT:
401 m_impl->signal_exit (this, ic, ic_uuid);
403 case SCIM_TRANS_CMD_RELOAD_CONFIG:
404 m_impl->signal_reload_config (this, ic, ic_uuid);
406 case SCIM_TRANS_CMD_UPDATE_SCREEN:
409 if (m_impl->recv.get_data (screen))
410 m_impl->signal_update_screen (this, ic, ic_uuid, (int) screen);
413 case SCIM_TRANS_CMD_UPDATE_SPOT_LOCATION:
416 if (m_impl->recv.get_data (x) && m_impl->recv.get_data (y))
417 m_impl->signal_update_spot_location (this, ic, ic_uuid, (int) x, (int) y);
420 case ISM_TRANS_CMD_UPDATE_CURSOR_POSITION:
423 if (m_impl->recv.get_data (cursor_pos))
424 m_impl->signal_update_cursor_position (this, ic, ic_uuid, (int) cursor_pos);
427 case ISM_TRANS_CMD_UPDATE_SURROUNDING_TEXT:
431 if (m_impl->recv.get_data (text) && m_impl->recv.get_data (cursor))
432 m_impl->signal_update_surrounding_text (this, ic, text, (int) cursor);
435 case SCIM_TRANS_CMD_TRIGGER_PROPERTY:
438 if (m_impl->recv.get_data (property))
439 m_impl->signal_trigger_property (this, ic, ic_uuid, property);
442 case SCIM_TRANS_CMD_HELPER_PROCESS_IMENGINE_EVENT:
445 if (m_impl->recv.get_data (trans))
446 m_impl->signal_process_imengine_event (this, ic, ic_uuid, trans);
449 case SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT:
450 m_impl->signal_attach_input_context (this, ic, ic_uuid);
452 case SCIM_TRANS_CMD_HELPER_DETACH_INPUT_CONTEXT:
453 m_impl->signal_detach_input_context (this, ic, ic_uuid);
455 case SCIM_TRANS_CMD_FOCUS_OUT:
457 m_impl->signal_focus_out (this, ic, ic_uuid);
460 case SCIM_TRANS_CMD_FOCUS_IN:
462 m_impl->signal_focus_in (this, ic, ic_uuid);
465 case ISM_TRANS_CMD_SHOW_ISE_PANEL:
469 if (m_impl->recv.get_data (&data, len))
470 m_impl->signal_ise_show (this, ic, data, len);
475 case ISM_TRANS_CMD_HIDE_ISE_PANEL:
477 m_impl->signal_ise_hide (this, ic, ic_uuid);
480 case ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY:
482 struct rectinfo info = {0, 0, 0, 0};
483 m_impl->signal_get_geometry (this, info);
484 m_impl->send.clear ();
485 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
486 m_impl->send.put_data (info.pos_x);
487 m_impl->send.put_data (info.pos_y);
488 m_impl->send.put_data (info.width);
489 m_impl->send.put_data (info.height);
490 m_impl->send.write_to_socket (m_impl->socket);
493 case ISM_TRANS_CMD_SET_ISE_MODE:
496 if (m_impl->recv.get_data (mode))
497 m_impl->signal_set_mode (this, mode);
500 case ISM_TRANS_CMD_SET_ISE_LANGUAGE:
503 if (m_impl->recv.get_data (language))
504 m_impl->signal_set_language (this, language);
507 case ISM_TRANS_CMD_SET_ISE_IMDATA:
511 if (m_impl->recv.get_data (&imdata, len))
512 m_impl->signal_set_imdata (this, imdata, len);
518 case ISM_TRANS_CMD_GET_ISE_IMDATA:
523 m_impl->signal_get_imdata (this, &buf, len);
524 m_impl->send.clear ();
525 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
526 m_impl->send.put_data (buf, len);
527 m_impl->send.write_to_socket (m_impl->socket);
532 case ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE:
535 m_impl->signal_get_language_locale (this, ic, &buf);
536 m_impl->send.clear ();
537 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
539 m_impl->send.put_data (buf, strlen (buf));
540 m_impl->send.write_to_socket (m_impl->socket);
545 case ISM_TRANS_CMD_SET_RETURN_KEY_TYPE:
548 if (m_impl->recv.get_data (type)) {
549 m_impl->signal_set_return_key_type (this, type);
553 case ISM_TRANS_CMD_GET_RETURN_KEY_TYPE:
556 m_impl->signal_get_return_key_type (this, type);
557 m_impl->send.clear ();
558 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
559 m_impl->send.put_data (type);
560 m_impl->send.write_to_socket (m_impl->socket);
563 case ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE:
566 if (m_impl->recv.get_data (disabled)) {
567 m_impl->signal_set_return_key_disable (this, disabled);
571 case ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE:
574 m_impl->signal_get_return_key_type (this, disabled);
575 m_impl->send.clear ();
576 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
577 m_impl->send.put_data (disabled);
578 m_impl->send.write_to_socket (m_impl->socket);
581 case ISM_TRANS_CMD_SET_LAYOUT:
585 if (m_impl->recv.get_data (layout))
586 m_impl->signal_set_layout (this, layout);
589 case ISM_TRANS_CMD_GET_LAYOUT:
593 m_impl->signal_get_layout (this, layout);
594 m_impl->send.clear ();
595 m_impl->send.put_command (SCIM_TRANS_CMD_REPLY);
596 m_impl->send.put_data (layout);
597 m_impl->send.write_to_socket (m_impl->socket);
600 case ISM_TRANS_CMD_SET_CAPS_MODE:
604 if (m_impl->recv.get_data (mode))
605 m_impl->signal_set_caps_mode (this, mode);
608 case SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT:
610 m_impl->signal_reset_input_context (this, ic, ic_uuid);
613 case ISM_TRANS_CMD_UPDATE_CANDIDATE_UI:
616 if (m_impl->recv.get_data (style) && m_impl->recv.get_data (mode))
617 m_impl->signal_update_candidate_ui (this, ic, ic_uuid, style, mode);
620 case ISM_TRANS_CMD_UPDATE_CANDIDATE_GEOMETRY:
622 struct rectinfo info = {0, 0, 0, 0};
623 if (m_impl->recv.get_data (info.pos_x)
624 && m_impl->recv.get_data (info.pos_y)
625 && m_impl->recv.get_data (info.width)
626 && m_impl->recv.get_data (info.height))
627 m_impl->signal_update_candidate_geometry (this, ic, ic_uuid, info);
630 case ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE:
633 if (m_impl->recv.get_data (name) && m_impl->recv.get_data (uuid))
634 m_impl->signal_update_keyboard_ise (this, ic, ic_uuid, name, uuid);
637 case ISM_TRANS_CMD_UPDATE_KEYBOARD_ISE_LIST:
641 std::vector<String> list;
642 if (m_impl->recv.get_data (num)) {
643 for (unsigned int i = 0; i < num; i++) {
644 if (m_impl->recv.get_data (ise)) {
645 list.push_back (ise);
651 m_impl->signal_update_keyboard_ise_list (this, ic, ic_uuid, list);
655 case ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_SHOW:
657 m_impl->signal_candidate_more_window_show (this, ic, ic_uuid);
660 case ISM_TRANS_CMD_CANDIDATE_MORE_WINDOW_HIDE:
662 m_impl->signal_candidate_more_window_hide (this, ic, ic_uuid);
665 case ISM_TRANS_CMD_SELECT_AUX:
668 if (m_impl->recv.get_data (item))
669 m_impl->signal_select_aux (this, ic, ic_uuid, item);
672 case SCIM_TRANS_CMD_SELECT_CANDIDATE:
675 if (m_impl->recv.get_data (item))
676 m_impl->signal_select_candidate (this, ic, ic_uuid, item);
679 case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP:
681 m_impl->signal_candidate_table_page_up (this, ic, ic_uuid);
684 case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN:
686 m_impl->signal_candidate_table_page_down (this, ic, ic_uuid);
689 case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE:
692 if (m_impl->recv.get_data (size))
693 m_impl->signal_update_candidate_table_page_size (this, ic, ic_uuid, size);
696 case ISM_TRANS_CMD_UPDATE_CANDIDATE_ITEM_LAYOUT:
698 std::vector<uint32> row_items;
699 if (m_impl->recv.get_data (row_items))
700 m_impl->signal_update_candidate_item_layout (this, row_items);
703 case ISM_TRANS_CMD_SELECT_ASSOCIATE:
706 if (m_impl->recv.get_data (item))
707 m_impl->signal_select_associate (this, ic, ic_uuid, item);
710 case ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_UP:
712 m_impl->signal_associate_table_page_up (this, ic, ic_uuid);
715 case ISM_TRANS_CMD_ASSOCIATE_TABLE_PAGE_DOWN:
717 m_impl->signal_associate_table_page_down (this, ic, ic_uuid);
720 case ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE_PAGE_SIZE:
723 if (m_impl->recv.get_data (size))
724 m_impl->signal_update_associate_table_page_size (this, ic, ic_uuid, size);
727 case ISM_TRANS_CMD_RESET_ISE_CONTEXT:
729 m_impl->signal_reset_ise_context (this, ic, ic_uuid);
732 case ISM_TRANS_CMD_TURN_ON_LOG:
735 if (m_impl->recv.get_data (isOn))
736 m_impl->signal_turn_on_log (this, isOn);
739 case ISM_TRANS_CMD_UPDATE_DISPLAYED_CANDIDATE:
742 if (m_impl->recv.get_data (size))
743 m_impl->signal_update_displayed_candidate_number (this, ic, ic_uuid, size);
746 case ISM_TRANS_CMD_LONGPRESS_CANDIDATE:
749 if (m_impl->recv.get_data (index))
750 m_impl->signal_longpress_candidate (this, ic, ic_uuid, index);
761 * @brief Request SCIM to reload all configuration.
763 * This function should only by used by Setup Helper to request
764 * scim's reloading the configuration.
767 HelperAgent::reload_config () const
769 if (m_impl->socket_active.is_connected ()) {
770 m_impl->send.clear ();
771 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
772 m_impl->send.put_data (m_impl->magic_active);
773 m_impl->send.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
774 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
779 * @brief Register some properties into Panel.
781 * This function send the request to Panel to register a list
784 * @param properties The list of Properties to be registered into Panel.
786 * @sa scim::Property.
789 HelperAgent::register_properties (const PropertyList &properties) const
791 if (m_impl->socket_active.is_connected ()) {
792 m_impl->send.clear ();
793 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
794 m_impl->send.put_data (m_impl->magic_active);
795 m_impl->send.put_command (SCIM_TRANS_CMD_REGISTER_PROPERTIES);
796 m_impl->send.put_data (properties);
797 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
802 * @brief Update a registered property.
804 * @param property The property to be updated.
807 HelperAgent::update_property (const Property &property) const
809 if (m_impl->socket_active.is_connected ()) {
810 m_impl->send.clear ();
811 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
812 m_impl->send.put_data (m_impl->magic_active);
813 m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_PROPERTY);
814 m_impl->send.put_data (property);
815 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
820 * @brief Send a set of events to an IMEngineInstance.
822 * All events should be put into a Transaction.
823 * And the events can only be received by one IMEngineInstance object.
825 * @param ic The handle of the Input Context to receive the events.
826 * @param ic_uuid The UUID of the Input Context.
827 * @param trans The Transaction object holds the events.
830 HelperAgent::send_imengine_event (int ic,
831 const String &ic_uuid,
832 const Transaction &trans) const
834 if (m_impl->socket_active.is_connected ()) {
835 m_impl->send.clear ();
836 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
837 m_impl->send.put_data (m_impl->magic_active);
838 m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_SEND_IMENGINE_EVENT);
839 m_impl->send.put_data ((uint32)ic);
840 m_impl->send.put_data (ic_uuid);
841 m_impl->send.put_data (trans);
842 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
847 * @brief Send a KeyEvent to an IMEngineInstance.
849 * @param ic The handle of the IMEngineInstance to receive the event.
850 * -1 means the currently focused IMEngineInstance.
851 * @param ic_uuid The UUID of the IMEngineInstance. Empty means don't match.
852 * @param key The KeyEvent to be sent.
855 HelperAgent::send_key_event (int ic,
856 const String &ic_uuid,
857 const KeyEvent &key) const
859 if (m_impl->socket_active.is_connected ()) {
860 m_impl->send.clear ();
861 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
862 m_impl->send.put_data (m_impl->magic_active);
863 m_impl->send.put_command (SCIM_TRANS_CMD_PANEL_SEND_KEY_EVENT);
864 m_impl->send.put_data ((uint32)ic);
865 m_impl->send.put_data (ic_uuid);
866 m_impl->send.put_data (key);
867 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
872 * @brief Forward a KeyEvent to client application directly.
874 * @param ic The handle of the client Input Context to receive the event.
875 * -1 means the currently focused Input Context.
876 * @param ic_uuid The UUID of the IMEngine used by the Input Context.
877 * Empty means don't match.
878 * @param key The KeyEvent to be forwarded.
881 HelperAgent::forward_key_event (int ic,
882 const String &ic_uuid,
883 const KeyEvent &key) const
885 if (m_impl->socket_active.is_connected ()) {
886 m_impl->send.clear ();
887 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
888 m_impl->send.put_data (m_impl->magic_active);
889 m_impl->send.put_command (SCIM_TRANS_CMD_FORWARD_KEY_EVENT);
890 m_impl->send.put_data ((uint32)ic);
891 m_impl->send.put_data (ic_uuid);
892 m_impl->send.put_data (key);
893 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
898 * @brief Commit a WideString to client application directly.
900 * @param ic The handle of the client Input Context to receive the WideString.
901 * -1 means the currently focused Input Context.
902 * @param ic_uuid The UUID of the IMEngine used by the Input Context.
903 * Empty means don't match.
904 * @param wstr The WideString to be committed.
907 HelperAgent::commit_string (int ic,
908 const String &ic_uuid,
909 const WideString &wstr) const
911 if (m_impl->socket_active.is_connected ()) {
912 m_impl->send.clear ();
913 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
914 m_impl->send.put_data (m_impl->magic_active);
915 m_impl->send.put_command (SCIM_TRANS_CMD_COMMIT_STRING);
916 m_impl->send.put_data ((uint32)ic);
917 m_impl->send.put_data (ic_uuid);
918 m_impl->send.put_data (wstr);
919 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
924 * @brief Request to show preedit string.
926 * @param ic The handle of the client Input Context to receive the request.
927 * -1 means the currently focused Input Context.
928 * @param ic_uuid The UUID of the IMEngine used by the Input Context.
929 * Empty means don't match.
932 HelperAgent::show_preedit_string (int ic,
933 const String &ic_uuid) const
935 if (m_impl->socket_active.is_connected ()) {
936 m_impl->send.clear ();
937 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
938 m_impl->send.put_data (m_impl->magic_active);
939 m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_PREEDIT_STRING);
940 m_impl->send.put_data ((uint32)ic);
941 m_impl->send.put_data (ic_uuid);
942 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
947 * @brief Request to show aux string.
950 HelperAgent::show_aux_string (void) const
952 if (m_impl->socket_active.is_connected ()) {
953 m_impl->send.clear ();
954 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
955 m_impl->send.put_data (m_impl->magic_active);
956 m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_AUX_STRING);
957 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
962 * @brief Request to show candidate string.
965 HelperAgent::show_candidate_string (void) const
967 if (m_impl->socket_active.is_connected ()) {
968 m_impl->send.clear ();
969 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
970 m_impl->send.put_data (m_impl->magic_active);
971 m_impl->send.put_command (SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE);
972 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
977 * @brief Request to show associate string.
980 HelperAgent::show_associate_string (void) const
982 if (m_impl->socket_active.is_connected ()) {
983 m_impl->send.clear ();
984 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
985 m_impl->send.put_data (m_impl->magic_active);
986 m_impl->send.put_command (ISM_TRANS_CMD_SHOW_ASSOCIATE_TABLE);
987 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
992 * @brief Request to hide preedit string.
994 * @param ic The handle of the client Input Context to receive the request.
995 * -1 means the currently focused Input Context.
996 * @param ic_uuid The UUID of the IMEngine used by the Input Context.
997 * Empty means don't match.
1000 HelperAgent::hide_preedit_string (int ic,
1001 const String &ic_uuid) const
1003 if (m_impl->socket_active.is_connected ()) {
1004 m_impl->send.clear ();
1005 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1006 m_impl->send.put_data (m_impl->magic_active);
1007 m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_PREEDIT_STRING);
1008 m_impl->send.put_data ((uint32)ic);
1009 m_impl->send.put_data (ic_uuid);
1010 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1015 * @brief Request to hide aux string.
1018 HelperAgent::hide_aux_string (void) const
1020 if (m_impl->socket_active.is_connected ()) {
1021 m_impl->send.clear ();
1022 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1023 m_impl->send.put_data (m_impl->magic_active);
1024 m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_AUX_STRING);
1025 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1030 * @brief Request to hide candidate string.
1033 HelperAgent::hide_candidate_string (void) const
1035 if (m_impl->socket_active.is_connected ()) {
1036 m_impl->send.clear ();
1037 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1038 m_impl->send.put_data (m_impl->magic_active);
1039 m_impl->send.put_command (SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE);
1040 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1045 * @brief Request to hide associate string.
1048 HelperAgent::hide_associate_string (void) const
1050 if (m_impl->socket_active.is_connected ()) {
1051 m_impl->send.clear ();
1052 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1053 m_impl->send.put_data (m_impl->magic_active);
1054 m_impl->send.put_command (ISM_TRANS_CMD_HIDE_ASSOCIATE_TABLE);
1055 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1060 * @brief Update a new WideString for preedit.
1062 * @param ic The handle of the client Input Context to receive the WideString.
1063 * -1 means the currently focused Input Context.
1064 * @param ic_uuid The UUID of the IMEngine used by the Input Context.
1065 * Empty means don't match.
1066 * @param wstr The WideString to be updated.
1067 * @param attrs The attribute list for preedit string.
1070 HelperAgent::update_preedit_string (int ic,
1071 const String &ic_uuid,
1072 const WideString &str,
1073 const AttributeList &attrs) const
1075 if (m_impl->socket_active.is_connected ()) {
1076 m_impl->send.clear ();
1077 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1078 m_impl->send.put_data (m_impl->magic_active);
1079 m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING);
1080 m_impl->send.put_data ((uint32)ic);
1081 m_impl->send.put_data (ic_uuid);
1082 m_impl->send.put_data (str);
1083 m_impl->send.put_data (attrs);
1084 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1089 * @brief Update the preedit caret position in the preedit string.
1091 * @param caret - the new position of the preedit caret.
1094 HelperAgent::update_preedit_caret (int caret) const
1096 if (m_impl->socket_active.is_connected ()) {
1097 m_impl->send.clear ();
1098 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1099 m_impl->send.put_data (m_impl->magic_active);
1100 m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET);
1101 m_impl->send.put_data ((uint32)caret);
1102 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1107 * @brief Update a new string for aux.
1109 * @param str The string to be updated.
1110 * @param attrs The attribute list for aux string.
1113 HelperAgent::update_aux_string (const String &str,
1114 const AttributeList &attrs) const
1116 if (m_impl->socket_active.is_connected ()) {
1117 m_impl->send.clear ();
1118 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1119 m_impl->send.put_data (m_impl->magic_active);
1120 m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_AUX_STRING);
1121 m_impl->send.put_data (str);
1122 m_impl->send.put_data (attrs);
1123 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1128 * @brief Request to update candidate.
1130 * @param table The lookup table for candidate.
1133 HelperAgent::update_candidate_string (const LookupTable &table) const
1135 if (m_impl->socket_active.is_connected ()) {
1136 m_impl->send.clear ();
1137 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1138 m_impl->send.put_data (m_impl->magic_active);
1139 m_impl->send.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE);
1140 m_impl->send.put_data (table);
1141 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1146 * @brief Request to update associate.
1148 * @param table The lookup table for associate.
1151 HelperAgent::update_associate_string (const LookupTable &table) const
1153 if (m_impl->socket_active.is_connected ()) {
1154 m_impl->send.clear ();
1155 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1156 m_impl->send.put_data (m_impl->magic_active);
1157 m_impl->send.put_command (ISM_TRANS_CMD_UPDATE_ASSOCIATE_TABLE);
1158 m_impl->send.put_data (table);
1159 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1164 * @brief When the input context of ISE is changed,
1165 * ISE can call this function to notify application
1167 * @param type type of event.
1168 * @param value value of event.
1171 HelperAgent::update_input_context (uint32 type, uint32 value) const
1173 if (m_impl->socket_active.is_connected ()) {
1174 m_impl->send.clear ();
1175 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1176 m_impl->send.put_data (m_impl->magic_active);
1177 m_impl->send.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
1178 m_impl->send.put_data (type);
1179 m_impl->send.put_data (value);
1180 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1185 * @brief Request to get surrounding text.
1187 * @param uuid The helper ISE UUID.
1188 * @param maxlen_before The max length of before.
1189 * @param maxlen_after The max length of after.
1192 HelperAgent::get_surrounding_text (const String &uuid, int maxlen_before, int maxlen_after) const
1194 if (m_impl->socket_active.is_connected ()) {
1195 m_impl->send.clear ();
1196 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1197 m_impl->send.put_data (m_impl->magic_active);
1198 m_impl->send.put_command (SCIM_TRANS_CMD_GET_SURROUNDING_TEXT);
1199 m_impl->send.put_data (uuid);
1200 m_impl->send.put_data (maxlen_before);
1201 m_impl->send.put_data (maxlen_after);
1202 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1207 * @brief Request to delete surrounding text.
1209 * @param offset The offset for cursor position.
1210 * @param len The length for delete text.
1213 HelperAgent::delete_surrounding_text (int offset, int len) const
1215 if (m_impl->socket_active.is_connected ()) {
1216 m_impl->send.clear ();
1217 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1218 m_impl->send.put_data (m_impl->magic_active);
1219 m_impl->send.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT);
1220 m_impl->send.put_data (offset);
1221 m_impl->send.put_data (len);
1222 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1227 * @brief Request to get uuid list of all keyboard ISEs.
1229 * @param uuid The helper ISE UUID.
1232 HelperAgent::get_keyboard_ise_list (const String &uuid) const
1234 if (m_impl->socket_active.is_connected ()) {
1235 m_impl->send.clear ();
1236 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1237 m_impl->send.put_data (m_impl->magic_active);
1238 m_impl->send.put_command (ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST);
1239 m_impl->send.put_data (uuid);
1240 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1245 * @brief Set candidate position in screen.
1247 * @param left The x position in screen.
1248 * @param top The y position in screen.
1251 HelperAgent::set_candidate_position (int left, int top) const
1253 if (m_impl->socket_active.is_connected ()) {
1254 m_impl->send.clear ();
1255 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1256 m_impl->send.put_data (m_impl->magic_active);
1257 m_impl->send.put_command (ISM_TRANS_CMD_SET_CANDIDATE_POSITION);
1258 m_impl->send.put_data (left);
1259 m_impl->send.put_data (top);
1260 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1265 * @brief Set candidate style.
1267 * @param portrait_line - the displayed line number for portrait mode.
1268 * @param mode - candidate window mode.
1271 HelperAgent::set_candidate_style (ISF_CANDIDATE_PORTRAIT_LINE_T portrait_line,
1272 ISF_CANDIDATE_MODE_T mode) const
1274 if (m_impl->socket_active.is_connected ()) {
1275 m_impl->send.clear ();
1276 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1277 m_impl->send.put_data (m_impl->magic_active);
1278 m_impl->send.put_command (ISM_TRANS_CMD_SET_CANDIDATE_UI);
1279 m_impl->send.put_data (portrait_line);
1280 m_impl->send.put_data (mode);
1281 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1286 * @brief Request to hide candidate window.
1289 HelperAgent::candidate_hide (void) const
1291 if (m_impl->socket_active.is_connected ()) {
1292 m_impl->send.clear ();
1293 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1294 m_impl->send.put_data (m_impl->magic_active);
1295 m_impl->send.put_command (ISM_TRANS_CMD_HIDE_CANDIDATE);
1296 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1301 * @brief Request to get candidate window size and position.
1303 * @param uuid The helper ISE UUID.
1306 HelperAgent::get_candidate_window_geometry (const String &uuid) const
1308 if (m_impl->socket_active.is_connected ()) {
1309 m_impl->send.clear ();
1310 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1311 m_impl->send.put_data (m_impl->magic_active);
1312 m_impl->send.put_command (ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY);
1313 m_impl->send.put_data (uuid);
1314 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1319 * @brief Set current keyboard ISE.
1321 * @param uuid The keyboard ISE UUID.
1324 HelperAgent::set_keyboard_ise_by_uuid (const String &uuid) const
1326 if (m_impl->socket_active.is_connected ()) {
1327 m_impl->send.clear ();
1328 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1329 m_impl->send.put_data (m_impl->magic_active);
1330 m_impl->send.put_command (ISM_TRANS_CMD_SET_KEYBOARD_ISE_BY_UUID);
1331 m_impl->send.put_data (uuid);
1332 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1337 * @brief Request to get current keyboard ISE information.
1339 * @param uuid The helper ISE UUID.
1342 HelperAgent::get_keyboard_ise (const String &uuid) const
1344 if (m_impl->socket_active.is_connected ()) {
1345 m_impl->send.clear ();
1346 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1347 m_impl->send.put_data (m_impl->magic_active);
1348 m_impl->send.put_command (ISM_TRANS_CMD_GET_KEYBOARD_ISE);
1349 m_impl->send.put_data (uuid);
1350 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1355 * @brief Update ISE window geometry.
1357 * @param x The x position in screen.
1358 * @param y The y position in screen.
1359 * @param width The ISE window width.
1360 * @param height The ISE window height.
1363 HelperAgent::update_geometry (int x, int y, int width, int height) const
1365 if (m_impl->socket_active.is_connected ()) {
1366 m_impl->send.clear ();
1367 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1368 m_impl->send.put_data (m_impl->magic_active);
1369 m_impl->send.put_command (ISM_TRANS_CMD_UPDATE_ISE_GEOMETRY);
1370 m_impl->send.put_data (x);
1371 m_impl->send.put_data (y);
1372 m_impl->send.put_data (width);
1373 m_impl->send.put_data (height);
1374 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1379 * @brief Request to expand candidate window.
1382 HelperAgent::expand_candidate (void) const
1384 if (m_impl->socket_active.is_connected ()) {
1385 m_impl->send.clear ();
1386 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1387 m_impl->send.put_data (m_impl->magic_active);
1388 m_impl->send.put_command (ISM_TRANS_CMD_EXPAND_CANDIDATE);
1389 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1394 * @brief Request to contract candidate window.
1397 HelperAgent::contract_candidate (void) const
1399 if (m_impl->socket_active.is_connected ()) {
1400 m_impl->send.clear ();
1401 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1402 m_impl->send.put_data (m_impl->magic_active);
1403 m_impl->send.put_command (ISM_TRANS_CMD_CONTRACT_CANDIDATE);
1404 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1409 * @brief Request to reset keyboard ISE.
1412 HelperAgent::reset_keyboard_ise (void) const
1414 if (m_impl->socket_active.is_connected ()) {
1415 m_impl->send.clear ();
1416 m_impl->send.put_command (SCIM_TRANS_CMD_REQUEST);
1417 m_impl->send.put_data (m_impl->magic_active);
1418 m_impl->send.put_command (ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE);
1419 m_impl->send.write_to_socket (m_impl->socket_active, m_impl->magic_active);
1424 * @brief Connect a slot to Helper exit signal.
1426 * This signal is used to let the Helper exit.
1428 * The prototype of the slot is:
1430 * void exit (const HelperAgent *agent, int ic, const String &ic_uuid);
1433 * - agent The pointer to the HelperAgent object which emits this signal.
1434 * - ic An opaque handle of the currently focused input context.
1435 * - ic_uuid The UUID of the IMEngineInstance associated with the focused input context.
1438 HelperAgent::signal_connect_exit (HelperAgentSlotVoid *slot)
1440 return m_impl->signal_exit.connect (slot);
1444 * @brief Connect a slot to Helper attach input context signal.
1446 * This signal is used to attach an input context to this helper.
1448 * When an input context requst to start this helper, then this
1449 * signal will be emitted as soon as the helper is started.
1451 * When an input context want to start an already started helper,
1452 * this signal will also be emitted.
1454 * Helper can send some events back to the IMEngineInstance in this
1455 * signal-slot, to inform that it has been started sccessfully.
1457 * The prototype of the slot is:
1459 * void attach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
1462 HelperAgent::signal_connect_attach_input_context (HelperAgentSlotVoid *slot)
1464 return m_impl->signal_attach_input_context.connect (slot);
1468 * @brief Connect a slot to Helper detach input context signal.
1470 * This signal is used to detach an input context from this helper.
1472 * When an input context requst to stop this helper, then this
1473 * signal will be emitted.
1475 * Helper shouldn't send any event back to the IMEngineInstance, because
1476 * the IMEngineInstance attached to the ic should have been destroyed.
1478 * The prototype of the slot is:
1480 * void detach_input_context (const HelperAgent *agent, int ic, const String &ic_uuid);
1483 HelperAgent::signal_connect_detach_input_context (HelperAgentSlotVoid *slot)
1485 return m_impl->signal_detach_input_context.connect (slot);
1489 * @brief Connect a slot to Helper reload config signal.
1491 * This signal is used to let the Helper reload configuration.
1493 * The prototype of the slot is:
1495 * void reload_config (const HelperAgent *agent, int ic, const String &ic_uuid);
1498 HelperAgent::signal_connect_reload_config (HelperAgentSlotVoid *slot)
1500 return m_impl->signal_reload_config.connect (slot);
1504 * @brief Connect a slot to Helper update screen signal.
1506 * This signal is used to let the Helper move its GUI to another screen.
1507 * It can only be emitted when SCIM_HELPER_NEED_SCREEN_INFO is set in HelperInfo.option.
1509 * The prototype of the slot is:
1511 * void update_screen (const HelperAgent *agent, int ic, const String &ic_uuid, int screen_number);
1514 HelperAgent::signal_connect_update_screen (HelperAgentSlotInt *slot)
1516 return m_impl->signal_update_screen.connect (slot);
1520 * @brief Connect a slot to Helper update spot location signal.
1522 * This signal is used to let the Helper move its GUI according to the current spot location.
1523 * It can only be emitted when SCIM_HELPER_NEED_SPOT_LOCATION_INFO is set in HelperInfo.option.
1525 * The prototype of the slot is:
1526 * void update_spot_location (const HelperAgent *agent, int ic, const String &ic_uuid, int x, int y);
1529 HelperAgent::signal_connect_update_spot_location (HelperAgentSlotIntInt *slot)
1531 return m_impl->signal_update_spot_location.connect (slot);
1535 * @brief Connect a slot to Helper update cursor position signal.
1537 * This signal is used to let the Helper get the cursor position information.
1539 * The prototype of the slot is:
1540 * void update_cursor_position (const HelperAgent *agent, int ic, const String &ic_uuid, int cursor_pos);
1543 HelperAgent::signal_connect_update_cursor_position (HelperAgentSlotInt *slot)
1545 return m_impl->signal_update_cursor_position.connect (slot);
1549 * @brief Connect a slot to Helper update surrounding text signal.
1551 * This signal is used to let the Helper get the surrounding text.
1553 * The prototype of the slot is:
1554 * void update_surrounding_text (const HelperAgent *agent, int ic, const String &text, int cursor);
1557 HelperAgent::signal_connect_update_surrounding_text (HelperAgentSlotInt *slot)
1559 return m_impl->signal_update_surrounding_text.connect (slot);
1563 * @brief Connect a slot to Helper trigger property signal.
1565 * This signal is used to trigger a property registered by this Helper.
1566 * A property will be triggered when user clicks on it.
1568 * The prototype of the slot is:
1569 * void trigger_property (const HelperAgent *agent, int ic, const String &ic_uuid, const String &property);
1572 HelperAgent::signal_connect_trigger_property (HelperAgentSlotString *slot)
1574 return m_impl->signal_trigger_property.connect (slot);
1578 * @brief Connect a slot to Helper process imengine event signal.
1580 * This signal is used to deliver the events sent from IMEngine to Helper.
1582 * The prototype of the slot is:
1583 * void process_imengine_event (const HelperAgent *agent, int ic, const String &ic_uuid, const Transaction &transaction);
1586 HelperAgent::signal_connect_process_imengine_event (HelperAgentSlotTransaction *slot)
1588 return m_impl->signal_process_imengine_event.connect (slot);
1592 * @brief Connect a slot to Helper focus out signal.
1594 * This signal is used to do something when input context is focus out.
1596 * The prototype of the slot is:
1597 * void focus_out (const HelperAgent *agent, int ic, const String &ic_uuid);
1600 HelperAgent::signal_connect_focus_out (HelperAgentSlotVoid *slot)
1602 return m_impl->signal_focus_out.connect (slot);
1606 * @brief Connect a slot to Helper focus in signal.
1608 * This signal is used to do something when input context is focus in.
1610 * The prototype of the slot is:
1611 * void focus_in (const HelperAgent *agent, int ic, const String &ic_uuid);
1614 HelperAgent::signal_connect_focus_in (HelperAgentSlotVoid *slot)
1616 return m_impl->signal_focus_in.connect (slot);
1620 * @brief Connect a slot to Helper show signal.
1622 * This signal is used to show Helper ISE window.
1624 * The prototype of the slot is:
1625 * void ise_show (const HelperAgent *agent, int ic, char *buf, size_t &len);
1628 HelperAgent::signal_connect_ise_show (HelperAgentSlotIntRawVoid *slot)
1630 return m_impl->signal_ise_show.connect (slot);
1634 * @brief Connect a slot to Helper hide signal.
1636 * This signal is used to hide Helper ISE window.
1638 * The prototype of the slot is:
1639 * void ise_hide (const HelperAgent *agent, int ic, const String &ic_uuid);
1642 HelperAgent::signal_connect_ise_hide (HelperAgentSlotVoid *slot)
1644 return m_impl->signal_ise_hide.connect (slot);
1648 * @brief Connect a slot to Helper get ISE window geometry signal.
1650 * This signal is used to get Helper ISE window size and position.
1652 * The prototype of the slot is:
1653 * void get_geometry (const HelperAgent *agent, struct rectinfo &info);
1656 HelperAgent::signal_connect_get_geometry (HelperAgentSlotSize *slot)
1658 return m_impl->signal_get_geometry.connect (slot);
1662 * @brief Connect a slot to Helper set mode signal.
1664 * This signal is used to set Helper ISE mode.
1666 * The prototype of the slot is:
1667 * void set_mode (const HelperAgent *agent, uint32 &mode);
1670 HelperAgent::signal_connect_set_mode (HelperAgentSlotUintVoid *slot)
1672 return m_impl->signal_set_mode.connect (slot);
1676 * @brief Connect a slot to Helper set language signal.
1678 * This signal is used to set Helper ISE language.
1680 * The prototype of the slot is:
1681 * void set_language (const HelperAgent *agent, uint32 &language);
1684 HelperAgent::signal_connect_set_language (HelperAgentSlotUintVoid *slot)
1686 return m_impl->signal_set_language.connect (slot);
1690 * @brief Connect a slot to Helper set im data signal.
1692 * This signal is used to send im data to Helper ISE.
1694 * The prototype of the slot is:
1695 * void set_imdata (const HelperAgent *agent, char *buf, size_t &len);
1698 HelperAgent::signal_connect_set_imdata (HelperAgentSlotRawVoid *slot)
1700 return m_impl->signal_set_imdata.connect (slot);
1704 * @brief Connect a slot to Helper get im data signal.
1706 * This signal is used to get im data from Helper ISE.
1708 * The prototype of the slot is:
1709 * void get_imdata (const HelperAgent *, char **buf, size_t &len);
1712 HelperAgent::signal_connect_get_imdata (HelperAgentSlotGetRawVoid *slot)
1714 return m_impl->signal_get_imdata.connect (slot);
1718 * @brief Connect a slot to Helper get language locale signal.
1720 * This signal is used to get language locale from Helper ISE.
1722 * The prototype of the slot is:
1723 * void get_language_locale (const HelperAgent *, int ic, char **locale);
1726 HelperAgent::signal_connect_get_language_locale (HelperAgentSlotIntGetStringVoid *slot)
1728 return m_impl->signal_get_language_locale.connect (slot);
1732 * @brief Connect a slot to Helper set return key type signal.
1734 * This signal is used to send return key type to Helper ISE.
1736 * The prototype of the slot is:
1737 * void set_return_key_type (const HelperAgent *agent, uint32 &type);
1740 HelperAgent::signal_connect_set_return_key_type (HelperAgentSlotUintVoid *slot)
1742 return m_impl->signal_set_return_key_type.connect (slot);
1746 * @brief Connect a slot to Helper get return key type signal.
1748 * This signal is used to get return key type from Helper ISE.
1750 * The prototype of the slot is:
1751 * void get_return_key_type (const HelperAgent *agent, uint32 &type);
1754 HelperAgent::signal_connect_get_return_key_type (HelperAgentSlotUintVoid *slot)
1756 return m_impl->signal_get_return_key_type.connect (slot);
1760 * @brief Connect a slot to Helper set return key disable signal.
1762 * This signal is used to send return key disable to Helper ISE.
1764 * The prototype of the slot is:
1765 * void set_return_key_disable (const HelperAgent *agent, uint32 &disabled);
1768 HelperAgent::signal_connect_set_return_key_disable (HelperAgentSlotUintVoid *slot)
1770 return m_impl->signal_set_return_key_disable.connect (slot);
1774 * @brief Connect a slot to Helper get return key disable signal.
1776 * This signal is used to get return key disable from Helper ISE.
1778 * The prototype of the slot is:
1779 * void get_return_key_disable (const HelperAgent *agent, uint32 &disabled);
1782 HelperAgent::signal_connect_get_return_key_disable (HelperAgentSlotUintVoid *slot)
1784 return m_impl->signal_get_return_key_disable.connect (slot);
1788 * @brief Connect a slot to Helper set layout signal.
1790 * This signal is used to set Helper ISE layout.
1792 * The prototype of the slot is:
1793 * void set_layout (const HelperAgent *agent, uint32 &layout);
1796 HelperAgent::signal_connect_set_layout (HelperAgentSlotUintVoid *slot)
1798 return m_impl->signal_set_layout.connect (slot);
1802 * @brief Connect a slot to Helper get layout signal.
1804 * This signal is used to get Helper ISE layout.
1806 * The prototype of the slot is:
1807 * void get_layout (const HelperAgent *agent, uint32 &layout);
1810 HelperAgent::signal_connect_get_layout (HelperAgentSlotUintVoid *slot)
1812 return m_impl->signal_get_layout.connect (slot);
1816 * @brief Connect a slot to Helper set shift mode signal.
1818 * This signal is used to set Helper shift mode.
1820 * The prototype of the slot is:
1821 * void set_caps_mode (const HelperAgent *agent, uint32 &mode);
1824 HelperAgent::signal_connect_set_caps_mode (HelperAgentSlotUintVoid *slot)
1826 return m_impl->signal_set_caps_mode.connect (slot);
1830 * @brief Connect a slot to Helper reset input context signal.
1832 * This signal is used to reset Helper ISE input context.
1834 * The prototype of the slot is:
1835 * void reset_input_context (const HelperAgent *agent, int ic, const String &uuid);
1838 HelperAgent::signal_connect_reset_input_context (HelperAgentSlotVoid *slot)
1840 return m_impl->signal_reset_input_context.connect (slot);
1844 * @brief Connect a slot to Helper update candidate window geometry signal.
1846 * This signal is used to get candidate window size and position.
1848 * The prototype of the slot is:
1849 * void update_candidate_geometry (const HelperAgent *agent, int ic, const String &uuid, const rectinfo &info);
1852 HelperAgent::signal_connect_update_candidate_geometry (HelperAgentSlotRect *slot)
1854 return m_impl->signal_update_candidate_geometry.connect (slot);
1858 * @brief Connect a slot to Helper update keyboard ISE signal.
1860 * This signal is used to get current keyboard ISE name and uuid.
1862 * The prototype of the slot is:
1863 * void update_keyboard_ise (const HelperAgent *agent, int ic, const String &uuid,
1864 * const String &ise_name, const String &ise_uuid);
1867 HelperAgent::signal_connect_update_keyboard_ise (HelperAgentSlotString2 *slot)
1869 return m_impl->signal_update_keyboard_ise.connect (slot);
1873 * @brief Connect a slot to Helper update keyboard ISE list signal.
1875 * This signal is used to get uuid list of all keyboard ISEs.
1877 * The prototype of the slot is:
1878 * void update_keyboard_ise_list (const HelperAgent *agent, int ic, const String &uuid,
1879 * const std::vector<String> &ise_list);
1882 HelperAgent::signal_connect_update_keyboard_ise_list (HelperAgentSlotStringVector *slot)
1884 return m_impl->signal_update_keyboard_ise_list.connect (slot);
1888 * @brief Connect a slot to Helper candidate more window show signal.
1890 * This signal is used to do someting when candidate more window is showed.
1892 * The prototype of the slot is:
1893 * void candidate_more_window_show (const HelperAgent *agent, int ic, const String &uuid);
1896 HelperAgent::signal_connect_candidate_more_window_show (HelperAgentSlotVoid *slot)
1898 return m_impl->signal_candidate_more_window_show.connect (slot);
1902 * @brief Connect a slot to Helper candidate more window hide signal.
1904 * This signal is used to do someting when candidate more window is hidden.
1906 * The prototype of the slot is:
1907 * void candidate_more_window_hide (const HelperAgent *agent, int ic, const String &uuid);
1910 HelperAgent::signal_connect_candidate_more_window_hide (HelperAgentSlotVoid *slot)
1912 return m_impl->signal_candidate_more_window_hide.connect (slot);
1916 * @brief Connect a slot to Helper select aux signal.
1918 * This signal is used to do something when aux is selected.
1920 * The prototype of the slot is:
1921 * void select_aux (const HelperAgent *agent, int ic, const String &uuid, int index);
1924 HelperAgent::signal_connect_select_aux (HelperAgentSlotInt *slot)
1926 return m_impl->signal_select_aux.connect (slot);
1930 * @brief Connect a slot to Helper select candidate signal.
1932 * This signal is used to do something when candidate is selected.
1934 * The prototype of the slot is:
1935 * void select_candidate (const HelperAgent *agent, int ic, const String &uuid, int index);
1938 HelperAgent::signal_connect_select_candidate (HelperAgentSlotInt *slot)
1940 return m_impl->signal_select_candidate.connect (slot);
1944 * @brief Connect a slot to Helper candidate table page up signal.
1946 * This signal is used to do something when candidate table is paged up.
1948 * The prototype of the slot is:
1949 * void candidate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
1952 HelperAgent::signal_connect_candidate_table_page_up (HelperAgentSlotVoid *slot)
1954 return m_impl->signal_candidate_table_page_up.connect (slot);
1958 * @brief Connect a slot to Helper candidate table page down signal.
1960 * This signal is used to do something when candidate table is paged down.
1962 * The prototype of the slot is:
1963 * void candidate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
1966 HelperAgent::signal_connect_candidate_table_page_down (HelperAgentSlotVoid *slot)
1968 return m_impl->signal_candidate_table_page_down.connect (slot);
1972 * @brief Connect a slot to Helper update candidate table page size signal.
1974 * This signal is used to do something when candidate table page size is changed.
1976 * The prototype of the slot is:
1977 * void update_candidate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
1980 HelperAgent::signal_connect_update_candidate_table_page_size (HelperAgentSlotInt *slot)
1982 return m_impl->signal_update_candidate_table_page_size.connect (slot);
1986 * @brief Connect a slot to Helper update candidate item layout signal.
1988 * The prototype of the slot is:
1989 * void update_candidate_item_layout (const HelperAgent *, const std::vector<uint32> &row_items);
1992 HelperAgent::signal_connect_update_candidate_item_layout (HelperAgentSlotUintVector *slot)
1994 return m_impl->signal_update_candidate_item_layout.connect (slot);
1998 * @brief Connect a slot to Helper select associate signal.
2000 * This signal is used to do something when associate is selected.
2002 * The prototype of the slot is:
2003 * void select_associate (const HelperAgent *agent, int ic, const String &uuid, int index);
2006 HelperAgent::signal_connect_select_associate (HelperAgentSlotInt *slot)
2008 return m_impl->signal_select_associate.connect (slot);
2012 * @brief Connect a slot to Helper associate table page up signal.
2014 * This signal is used to do something when associate table is paged up.
2016 * The prototype of the slot is:
2017 * void associate_table_page_up (const HelperAgent *agent, int ic, const String &uuid);
2020 HelperAgent::signal_connect_associate_table_page_up (HelperAgentSlotVoid *slot)
2022 return m_impl->signal_associate_table_page_up.connect (slot);
2026 * @brief Connect a slot to Helper associate table page down signal.
2028 * This signal is used to do something when associate table is paged down.
2030 * The prototype of the slot is:
2031 * void associate_table_page_down (const HelperAgent *agent, int ic, const String &uuid);
2034 HelperAgent::signal_connect_associate_table_page_down (HelperAgentSlotVoid *slot)
2036 return m_impl->signal_associate_table_page_down.connect (slot);
2040 * @brief Connect a slot to Helper update associate table page size signal.
2042 * This signal is used to do something when associate table page size is changed.
2044 * The prototype of the slot is:
2045 * void update_associate_table_page_size (const HelperAgent *, int ic, const String &uuid, int page_size);
2048 HelperAgent::signal_connect_update_associate_table_page_size (HelperAgentSlotInt *slot)
2050 return m_impl->signal_update_associate_table_page_size.connect (slot);
2054 * @brief Connect a slot to Helper turn on log signal.
2056 * This signal is used to turn on Helper ISE debug information.
2058 * The prototype of the slot is:
2059 * void turn_on_log (const HelperAgent *agent, uint32 &on);
2062 HelperAgent::signal_connect_turn_on_log (HelperAgentSlotUintVoid *slot)
2064 return m_impl->signal_turn_on_log.connect (slot);
2068 * @brief Connect a slot to Helper update displayed candidate number signal.
2070 * This signal is used to inform helper ISE displayed candidate number.
2072 * The prototype of the slot is:
2073 * void update_displayed_candidate_number (const HelperAgent *, int ic, const String &uuid, int number);
2076 HelperAgent::signal_connect_update_displayed_candidate_number (HelperAgentSlotInt *slot)
2078 return m_impl->signal_update_displayed_candidate_number.connect (slot);
2082 * @brief Connect a slot to Helper longpress candidate signal.
2084 * This signal is used to do something when candidate is longpress.
2086 * The prototype of the slot is:
2087 * void longpress_candidate (const HelperAgent *agent, int ic, const String &uuid, int index);
2090 HelperAgent::signal_connect_longpress_candidate (HelperAgentSlotInt *slot)
2092 return m_impl->signal_longpress_candidate.connect (slot);
2095 } /* namespace scim */
2098 vi:ts=4:nowrap:ai:expandtab