1 #define Uses_SCIM_TRANSACTION
2 #define Uses_ISF_REMOTE_CLIENT
3 #define Uses_STL_STRING
9 #include "isf_remote_control.h"
10 #include "isf_debug.h"
15 #define LOG_TAG "ISF_REMOTE_CONTROL"
19 static bool focus_flag;
21 struct _remote_control_client {
22 RemoteInputClient remote_client;
23 Ecore_Fd_Handler *remote_fd_handler = NULL;
25 remote_control_focus_in_cb focus_in_cb;
26 void* focus_in_cb_user_data;
27 remote_control_focus_out_cb focus_out_cb;
28 void* focus_out_cb_user_data;
29 remote_control_entry_metadata_cb metadata_cb;
30 void* metadata_cb_user_data;
31 remote_control_text_updated_cb text_updated_cb;
32 void* text_updated_cb_user_data;
33 remote_control_input_resource_changed_cb input_resource_changed_cb;
34 void* input_resource_changed_cb_user_data;
38 remote_handler(void *data, Ecore_Fd_Handler *fd_handler)
40 remote_control_client *client = static_cast<remote_control_client*>(data);
42 if (client->remote_client.has_pending_event()) {
43 switch (client->remote_client.recv_callback_message()) {
44 case REMOTE_CONTROL_CALLBACK_FOCUS_IN:
46 LOGD ("REMOTE_CONTROL_CALLBACK_FOCUS_IN");
48 client->focus_in_cb (client->focus_in_cb_user_data);
51 case REMOTE_CONTROL_CALLBACK_FOCUS_OUT:
53 LOGD ("REMOTE_CONTROL_CALLBACK_FOCUS_OUT");
55 client->focus_out_cb (client->focus_out_cb_user_data);
58 case REMOTE_CONTROL_CALLBACK_ENTRY_METADATA:
61 remote_control_entry_metadata_s *data = new remote_control_entry_metadata_s;
62 int hint = 0, layout = 0, variation = 0, autocapital_type = 0, return_key_disabled = 0;
64 client->remote_client.get_entry_metadata (&hint, &layout, &variation, &autocapital_type, &return_key_disabled);
65 data->hint = static_cast<Ecore_IMF_Input_Hints> (hint);
66 data->layout = static_cast<Ecore_IMF_Input_Panel_Layout> (layout);
67 data->variation = variation;
68 data->autocapital_type = static_cast<Ecore_IMF_Autocapital_Type> (autocapital_type);
69 data->return_key_disabled = return_key_disabled;
71 LOGD ("REMOTE_CONTROL_CALLBACK_ENTRY_METADATA hint: 0x%04x, layout: %d, variation: %d, autocapital: %d, return_key: %d",
72 data->hint, data->layout, data->variation, data->autocapital_type, data->return_key_disabled);
73 client->metadata_cb (client->metadata_cb_user_data, data);
78 case REMOTE_CONTROL_CALLBACK_TEXT_UPDATED:
81 String surrounding_text;
84 client->remote_client.get_surrounding_text (surrounding_text, &cursor);
85 SECURE_LOGD ("REMOTE_CONTROL_CALLBACK_TEXT_UPDATED \"%s\" %d", surrounding_text.c_str (), cursor);
86 client->text_updated_cb (client->text_updated_cb_user_data, surrounding_text.c_str (), cursor);
90 case REMOTE_CONTROL_CALLBACK_INPUT_RESOURCE:
95 client->remote_client.get_input_resource (&resource);
96 LOGD ("REMOTE_CONTROL_CALLBACK_INPUT_RESOURCE: %s", (resource ? "REMOTE" : "LOCAL"));
97 client->input_resource_changed_cb (client->input_resource_changed_cb_user_data,
98 static_cast<remote_control_input_resource> (resource));
102 case REMOTE_CONTROL_CALLBACK_ERROR:
108 return ECORE_CALLBACK_RENEW;
111 EXAPI remote_control_client * remote_control_connect(void)
113 remote_control_client *client = new remote_control_client;
117 RemoteInputClient *remote_client = new RemoteInputClient;
118 client->remote_client = *remote_client;
119 if (!client->remote_client.open_connection()) {
120 LOGE ("REMOTE_CONTROL_REPLY_TIMEOUT");
124 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
128 client->remote_client_id = client->remote_client.get_panel2remote_connection_number();
130 if (client->remote_client_id >= 0) {
131 client->remote_fd_handler = ecore_main_fd_handler_add(client->remote_client_id, ECORE_FD_READ, remote_handler, client, NULL, NULL);
133 if (client->remote_fd_handler == NULL) {
134 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
139 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
144 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
157 EXAPI int remote_control_disconnect(remote_control_client *client)
159 if (client == NULL) {
160 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
161 return REMOTE_CONTROL_INVALID_PARAMETER;
164 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
168 if (client->remote_fd_handler)
169 ecore_main_fd_handler_del(client->remote_fd_handler);
171 client->remote_client.close_connection();
177 return REMOTE_CONTROL_ERROR_NONE;
180 EXAPI int remote_control_focus_in_callback_set(remote_control_client *client, remote_control_focus_in_cb func, void *user_data)
182 if (client == NULL || func == NULL) {
183 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
184 return REMOTE_CONTROL_INVALID_PARAMETER;
187 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
191 client->focus_in_cb = func;
192 client->focus_in_cb_user_data = user_data;
195 return REMOTE_CONTROL_ERROR_NONE;
198 EXAPI int remote_control_focus_in_callback_unset(remote_control_client *client)
200 if (client == NULL) {
201 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
202 return REMOTE_CONTROL_INVALID_PARAMETER;
205 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
209 client->focus_in_cb = NULL;
210 client->focus_in_cb_user_data = NULL;
213 return REMOTE_CONTROL_ERROR_NONE;
216 EXAPI int remote_control_focus_out_callback_set(remote_control_client *client, remote_control_focus_out_cb func , void *user_data)
218 if (client == NULL || func == NULL) {
219 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
220 return REMOTE_CONTROL_INVALID_PARAMETER;
223 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
227 client->focus_out_cb = func;
228 client->focus_out_cb_user_data = user_data;
231 return REMOTE_CONTROL_ERROR_NONE;
234 EXAPI int remote_control_focus_out_callback_unset(remote_control_client *client)
236 if (client == NULL) {
237 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
238 return REMOTE_CONTROL_INVALID_PARAMETER;
241 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
245 client->focus_out_cb = NULL;
246 client->focus_out_cb_user_data = NULL;
249 return REMOTE_CONTROL_ERROR_NONE;
252 EXAPI int remote_control_entry_metadata_callback_set(remote_control_client *client, remote_control_entry_metadata_cb func, void *user_data)
254 if (client == NULL || func == NULL) {
255 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
256 return REMOTE_CONTROL_INVALID_PARAMETER;
259 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
263 client->metadata_cb = func;
264 client->metadata_cb_user_data = user_data;
267 return REMOTE_CONTROL_ERROR_NONE;
270 EXAPI int remote_control_entry_metadata_callback_unset(remote_control_client *client)
272 if (client == NULL) {
273 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
274 return REMOTE_CONTROL_INVALID_PARAMETER;
277 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
281 client->metadata_cb = NULL;
282 client->metadata_cb_user_data = NULL;
285 return REMOTE_CONTROL_ERROR_NONE;
288 EXAPI int remote_control_text_updated_callback_set(remote_control_client *client, remote_control_text_updated_cb func, void *user_data)
290 if (client == NULL || func == NULL) {
291 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
292 return REMOTE_CONTROL_INVALID_PARAMETER;
295 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
299 client->text_updated_cb = func;
300 client->text_updated_cb_user_data = user_data;
303 return REMOTE_CONTROL_ERROR_NONE;
306 EXAPI int remote_control_text_updated_callback_unset(remote_control_client *client)
308 if (client == NULL) {
309 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
310 return REMOTE_CONTROL_INVALID_PARAMETER;
313 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
317 client->text_updated_cb = NULL;
318 client->text_updated_cb_user_data = NULL;
321 return REMOTE_CONTROL_ERROR_NONE;
324 EXAPI int remote_control_input_resource_changed_callback_set(remote_control_client *client, remote_control_input_resource_changed_cb func , void *user_data)
326 if (client == NULL || func == NULL) {
327 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
328 return REMOTE_CONTROL_INVALID_PARAMETER;
331 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
335 client->input_resource_changed_cb = func;
336 client->input_resource_changed_cb_user_data = user_data;
339 return REMOTE_CONTROL_ERROR_NONE;
342 EXAPI int remote_control_input_resource_changed_callback_unset(remote_control_client *client)
344 if (client == NULL) {
345 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
346 return REMOTE_CONTROL_INVALID_PARAMETER;
349 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
353 client->input_resource_changed_cb = NULL;
354 client->input_resource_changed_cb_user_data = NULL;
357 return REMOTE_CONTROL_ERROR_NONE;
360 EXAPI int remote_control_send_key_event(remote_control_client *client, remote_control_key_type_e key)
362 if (client == NULL || key <= REMOTE_CONTROL_KEY_ENTER || key >= REMOTE_CONTROL_KEY_CANCEL)
363 return REMOTE_CONTROL_INVALID_PARAMETER;
365 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
369 char key_str[10] = {};
370 snprintf(key_str, sizeof(key_str), "%d", key);
371 String command = String ("|plain|send_key_event|") + String (key_str) + String ("|");
374 error_e = (remote_control_error_e)client->remote_client.send_remote_input_message(command.c_str ());
377 SECURE_LOGD ("%p, key=%d", client, key);
382 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
383 return REMOTE_CONTROL_INVALID_OPERATION;
386 EXAPI int remote_control_send_commit_string(remote_control_client *client, const char *text)
388 if (client == NULL || !text)
389 return REMOTE_CONTROL_INVALID_PARAMETER;
391 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
395 String command = String ("|plain|commit_string|") + String (text) + String ("|");
398 error_e = (remote_control_error_e)client->remote_client.send_remote_input_message(command.c_str ());
401 SECURE_LOGD ("%p, \"%s\"", client, text);
406 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
407 return REMOTE_CONTROL_INVALID_OPERATION;
410 EXAPI int remote_control_update_preedit_string(remote_control_client *client, const char *text, Eina_List *attrs, int cursor_pos)
413 return REMOTE_CONTROL_INVALID_PARAMETER;
415 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
419 char cursor_position[10] = {};
420 snprintf(cursor_position, sizeof(cursor_position), "%d", cursor_pos);
421 String command = String ("|plain|update_preedit_string|") + String (text) + String ("|") + String (cursor_position) + String ("|");
424 error_e = (remote_control_error_e)client->remote_client.send_remote_input_message(command.c_str ());
427 SECURE_LOGD ("%p, \"%s\", %d", client, text, cursor_pos);
432 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
433 return REMOTE_CONTROL_INVALID_OPERATION;
436 EXAPI int remote_control_delete_surrounding_text(remote_control_client *client, int offset, int len)
438 if (client == NULL || len < 0) {
439 LOGE ("REMOTE_CONTROL_INVALID_PARAMETER");
440 return REMOTE_CONTROL_INVALID_PARAMETER;
443 remote_control_error_e error_e = (remote_control_error_e)client->remote_client.check_privilege();
448 error_e = (remote_control_error_e)client->remote_client.delete_surrounding_text(offset, len);
451 LOGD ("%p, (%d, %d)", client, offset, len);
456 LOGE ("REMOTE_CONTROL_INVALID_OPERATION");
457 return REMOTE_CONTROL_INVALID_OPERATION;