5 #include <Ecore_IMF_Evas.h>
8 typedef struct _E_Entry_Smart_Data E_Entry_Smart_Data;
10 struct _E_Entry_Smart_Data
12 Evas_Object *entry_object;
13 Evas_Object *editable_object;
15 Ecore_Event_Handler *selection_handler;
17 Ecore_IMF_Context *imf_context;
22 int selection_dragging;
27 int preedit_start_pos;
29 Eina_Bool have_preedit : 1;
32 /* local subsystem functions */
33 static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
34 static void _e_entry_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
35 static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
36 static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
37 static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
38 static Eina_Bool _e_entry_x_selection_notify_handler(void *data, int type, void *event);
40 static void _e_entry_x_selection_update(Evas_Object *entry);
41 static void _e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event);
42 static void _e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event);
44 static void _e_entry_smart_add(Evas_Object *object);
45 static void _e_entry_smart_del(Evas_Object *object);
46 static void _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y);
47 static void _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h);
48 static void _e_entry_smart_show(Evas_Object *object);
49 static void _e_entry_smart_hide(Evas_Object *object);
50 static void _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a);
51 static void _e_entry_clip_set(Evas_Object *object, Evas_Object *clip);
52 static void _e_entry_clip_unset(Evas_Object *object);
53 static void _e_entry_cb_menu_post(void *data, E_Menu *m);
54 static void _e_entry_cb_cut(void *data, E_Menu *m, E_Menu_Item *mi);
55 static void _e_entry_cb_copy(void *data, E_Menu *m, E_Menu_Item *mi);
56 static void _e_entry_cb_paste(void *data, E_Menu *m, E_Menu_Item *mi);
57 static void _e_entry_cb_select_all(void *data, E_Menu *m, E_Menu_Item *mi);
58 static void _e_entry_cb_delete(void *data, E_Menu *m, E_Menu_Item *mi);
59 static void _e_entry_imf_cursor_info_set(Evas_Object *object);
60 static void _e_entry_imf_context_reset(Evas_Object *object);
62 static Eina_Bool _e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
63 static void _e_entry_cb_imf_event_commit(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info);
64 static void _e_entry_cb_imf_event_preedit_changed(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info);
65 static void _e_entry_cb_imf_event_delete_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info);
68 /* local subsystem globals */
69 static Evas_Smart *_e_entry_smart = NULL;
70 static int _e_entry_smart_use = 0;
71 static int _e_entry_emacs_keybindings = 0;
74 /* externally accessible functions */
77 * Creates a new entry object. An entry is a field where the user can type
79 * Use the "changed" smart callback to know when the content of the entry is
82 * @param evas the evas where the entry object should be added
83 * @return Returns the new entry object
86 e_entry_add(Evas *evas)
90 static const Evas_Smart_Class sc =
93 EVAS_SMART_CLASS_VERSION,
97 _e_entry_smart_resize,
111 _e_entry_smart = evas_smart_class_new(&sc);
112 _e_entry_smart_use = 0;
115 _e_entry_smart_use++;
116 return evas_object_smart_add(evas, _e_entry_smart);
120 * Sets the text of the entry object
122 * @param entry an entry object
123 * @param text the text to set
126 e_entry_text_set(Evas_Object *entry, const char *text)
128 E_Entry_Smart_Data *sd;
130 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
131 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
134 e_editable_text_set(sd->editable_object, text);
135 evas_object_smart_callback_call(entry, "changed", NULL);
139 * Gets the text of the entry object
141 * @param entry an entry object
142 * @return Returns the text of the entry object
145 e_entry_text_get(Evas_Object *entry)
147 E_Entry_Smart_Data *sd;
149 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERR(NULL);
150 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
152 return e_editable_text_get(sd->editable_object);
156 * Clears the entry object
158 * @param entry an entry object
161 e_entry_clear(Evas_Object *entry)
163 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
164 e_entry_text_set(entry, "");
168 * Gets the editable object used by the entry object. It will allow you to have
169 * better control on the text, the cursor or the selection of the entry with
170 * the e_editable_*() functions.
172 * @param entry an entry object
173 * @return Returns the editable object used by the entry object
176 e_entry_editable_object_get(Evas_Object *entry)
178 E_Entry_Smart_Data *sd;
180 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERR(NULL);
181 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
183 return sd->editable_object;
187 * Sets whether or not the entry object is in password mode. In password mode,
188 * the entry displays '*' instead of the characters
190 * @param entry an entry object
191 * @param password_mode 1 to turn on password mode, 0 to turn it off
194 e_entry_password_set(Evas_Object *entry, int password_mode)
196 E_Entry_Smart_Data *sd;
198 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
199 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
201 e_editable_password_set(sd->editable_object, password_mode);
202 #ifdef HAVE_ECORE_IMF
204 ecore_imf_context_input_mode_set(sd->imf_context,
205 password_mode ? ECORE_IMF_INPUT_MODE_FULL & ECORE_IMF_INPUT_MODE_INVISIBLE :
206 ECORE_IMF_INPUT_MODE_FULL);
211 * Gets the minimum size of the entry object
213 * @param entry an entry object
214 * @param minw the location where to store the minimun width of the entry
215 * @param minh the location where to store the minimun height of the entry
218 e_entry_size_min_get(Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh)
220 E_Entry_Smart_Data *sd;
222 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
223 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
226 if (minw) *minw = sd->min_width;
227 if (minh) *minh = sd->height;
231 * Focuses the entry object. It will receives keyboard events and the user could
232 * then type some text (the entry should also be enabled. The cursor and the
233 * selection will be shown
235 * @param entry the entry to focus
238 e_entry_focus(Evas_Object *entry)
240 E_Entry_Smart_Data *sd;
242 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
243 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
248 evas_object_focus_set(entry, 1);
249 edje_object_signal_emit(sd->entry_object, "e,state,focused", "e");
250 if (!sd->selection_dragging)
252 _e_entry_imf_context_reset(entry);
253 e_editable_cursor_move_to_end(sd->editable_object);
254 _e_entry_imf_cursor_info_set(entry);
256 e_editable_selection_move_to_end(sd->editable_object);
259 e_editable_cursor_show(sd->editable_object);
260 e_editable_selection_show(sd->editable_object);
261 #ifdef HAVE_ECORE_IMF
263 ecore_imf_context_focus_in(sd->imf_context);
269 * Unfocuses the entry object. It will no longer receives keyboard events so
270 * the user could no longer type some text. The cursor and the selection will
273 * @param entry the entry object to unfocus
276 e_entry_unfocus(Evas_Object *entry)
278 E_Entry_Smart_Data *sd;
280 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
281 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
286 evas_object_focus_set(entry, 0);
287 edje_object_signal_emit(sd->entry_object, "e,state,unfocused", "e");
288 e_editable_cursor_hide(sd->editable_object);
289 e_editable_selection_hide(sd->editable_object);
290 #ifdef HAVE_ECORE_IMF
293 ecore_imf_context_reset(sd->imf_context);
294 ecore_imf_context_focus_out(sd->imf_context);
301 * Enables the entry object: the user will be able to type text
303 * @param entry the entry object to enable
306 e_entry_enable(Evas_Object *entry)
308 E_Entry_Smart_Data *sd;
310 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
311 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
316 edje_object_signal_emit(sd->entry_object, "e,state,enabled", "e");
317 e_editable_enable(sd->editable_object);
319 e_editable_cursor_show(sd->editable_object);
324 * Disables the entry object: the user won't be able to type anymore. Selection
325 * will still be possible (to copy the text)
327 * @param entry the entry object to disable
330 e_entry_disable(Evas_Object *entry)
332 E_Entry_Smart_Data *sd;
334 if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
335 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
340 edje_object_signal_emit(sd->entry_object, "e,state,disabled", "e");
341 e_editable_disable(sd->editable_object);
342 e_editable_cursor_hide(sd->editable_object);
347 /* Private functions */
349 /* Called when a key has been pressed by the user */
351 _e_entry_key_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
353 E_Entry_Smart_Data *sd;
355 if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
358 #ifdef HAVE_ECORE_IMF
361 Ecore_IMF_Event_Key_Down ev;
363 ecore_imf_evas_event_key_down_wrap(event_info, &ev);
364 if (ecore_imf_context_filter_event(sd->imf_context,
365 ECORE_IMF_EVENT_KEY_DOWN,
366 (Ecore_IMF_Event *) &ev))
371 if (_e_entry_emacs_keybindings)
372 _e_entry_key_down_emacs(obj, event_info);
374 _e_entry_key_down_windows(obj, event_info);
377 /* Called when a key has been released by the user */
378 #ifdef HAVE_ECORE_IMF
380 _e_entry_key_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
383 _e_entry_key_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
386 E_Entry_Smart_Data *sd;
388 if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
391 #ifdef HAVE_ECORE_IMF
394 Ecore_IMF_Event_Key_Up ev;
396 ecore_imf_evas_event_key_up_wrap(event_info, &ev);
397 if (ecore_imf_context_filter_event(sd->imf_context,
398 ECORE_IMF_EVENT_KEY_UP,
399 (Ecore_IMF_Event *) &ev))
405 /* Called when the entry object is pressed by the mouse */
407 _e_entry_mouse_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
409 E_Entry_Smart_Data *sd;
410 Evas_Event_Mouse_Down *event;
414 if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
416 if (!(event = event_info))
419 #ifdef HAVE_ECORE_IMF
422 Ecore_IMF_Event_Mouse_Down ev;
424 ecore_imf_evas_event_mouse_down_wrap(event_info, &ev);
425 if (ecore_imf_context_filter_event(sd->imf_context,
426 ECORE_IMF_EVENT_MOUSE_DOWN,
427 (Ecore_IMF_Event *) &ev))
432 _e_entry_imf_context_reset(obj);
434 evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL);
435 pos = e_editable_pos_get_from_coords(sd->editable_object,
436 event->canvas.x - ox,
437 event->canvas.y - oy);
439 if (event->button == 1)
441 if (event->flags & EVAS_BUTTON_TRIPLE_CLICK)
443 e_editable_select_all(sd->editable_object);
444 _e_entry_x_selection_update(obj);
446 else if (event->flags & EVAS_BUTTON_DOUBLE_CLICK)
448 e_editable_select_word(sd->editable_object, pos);
449 _e_entry_x_selection_update(obj);
453 e_editable_cursor_pos_set(sd->editable_object, pos);
454 if (!evas_key_modifier_is_set(event->modifiers, "Shift"))
455 e_editable_selection_pos_set(sd->editable_object, pos);
457 sd->selection_dragging = 1;
460 else if (event->button == 2)
464 e_editable_cursor_pos_set(sd->editable_object, pos);
465 e_editable_selection_pos_set(sd->editable_object, pos);
467 if ((win = e_win_evas_object_win_get(obj)))
468 ecore_x_selection_primary_request(win->evas_win,
469 ECORE_X_SELECTION_TARGET_UTF8_STRING);
471 else if (event->button == 3)
477 int cursor_pos, selection_pos;
478 int start_pos, end_pos;
479 int s_enabled, s_selecting, s_empty, s_passwd;
481 cursor_pos = e_editable_cursor_pos_get(sd->editable_object);
482 selection_pos = e_editable_selection_pos_get(sd->editable_object);
483 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
484 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
486 s_selecting = (start_pos != end_pos);
487 s_enabled = sd->enabled;
488 s_empty = !e_editable_text_length_get(sd->editable_object);
489 s_passwd = e_editable_password_get(sd->editable_object);
491 if (!s_selecting && !s_enabled && s_empty) return;
493 man = e_manager_current_get();
494 con = e_container_current_get(man);
495 ecore_x_pointer_xy_get(con->win, &x, &y);
498 sd->popup = e_menu_new();
499 e_menu_post_deactivate_callback_set(sd->popup,
500 _e_entry_cb_menu_post, sd);
505 mi = e_menu_item_new(sd->popup);
506 e_menu_item_label_set(mi, _("Delete"));
507 e_util_menu_item_theme_icon_set(mi, "edit-delete");
508 e_menu_item_callback_set(mi, _e_entry_cb_delete, sd);
510 mi = e_menu_item_new(sd->popup);
511 e_menu_item_separator_set(mi, 1);
515 mi = e_menu_item_new(sd->popup);
516 e_menu_item_label_set(mi, _("Cut"));
517 e_util_menu_item_theme_icon_set(mi, "edit-cut");
518 e_menu_item_callback_set(mi, _e_entry_cb_cut, sd);
523 mi = e_menu_item_new(sd->popup);
524 e_menu_item_label_set(mi, _("Copy"));
525 e_util_menu_item_theme_icon_set(mi, "edit-copy");
526 e_menu_item_callback_set(mi, _e_entry_cb_copy, sd);
531 mi = e_menu_item_new(sd->popup);
532 e_menu_item_label_set(mi, _("Paste"));
533 e_util_menu_item_theme_icon_set(mi, "edit-paste");
534 e_menu_item_callback_set(mi, _e_entry_cb_paste, sd);
538 mi = e_menu_item_new(sd->popup);
539 e_menu_item_separator_set(mi, 1);
541 mi = e_menu_item_new(sd->popup);
542 e_menu_item_label_set(mi, _("Select All"));
543 e_util_menu_item_theme_icon_set(mi, "edit-select-all");
544 e_menu_item_callback_set(mi, _e_entry_cb_select_all, sd);
547 e_menu_activate_mouse(sd->popup, e_util_zone_current_get(man),
549 E_MENU_POP_DIRECTION_DOWN, event->timestamp);
552 _e_entry_imf_cursor_info_set(obj);
555 /* Called when the entry object is released by the mouse */
556 #ifdef HAVE_ECORE_IMF
558 _e_entry_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
561 _e_entry_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
564 E_Entry_Smart_Data *sd;
566 if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
569 #ifdef HAVE_ECORE_IMF
572 Ecore_IMF_Event_Mouse_Up ev;
574 ecore_imf_evas_event_mouse_up_wrap(event_info, &ev);
575 if (ecore_imf_context_filter_event(sd->imf_context,
576 ECORE_IMF_EVENT_MOUSE_UP,
577 (Ecore_IMF_Event *) &ev))
582 if (sd->selection_dragging)
584 sd->selection_dragging = 0;
585 _e_entry_x_selection_update(obj);
589 /* Called when the mouse moves over the entry object */
591 _e_entry_mouse_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
593 E_Entry_Smart_Data *sd;
594 Evas_Event_Mouse_Move *event;
598 if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
600 if (!(event = event_info))
603 #ifdef HAVE_ECORE_IMF
606 Ecore_IMF_Event_Mouse_Move ev;
608 ecore_imf_evas_event_mouse_move_wrap(event_info, &ev);
609 if (ecore_imf_context_filter_event(sd->imf_context,
610 ECORE_IMF_EVENT_MOUSE_MOVE,
611 (Ecore_IMF_Event *) &ev))
616 if (sd->selection_dragging)
618 evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL);
619 pos = e_editable_pos_get_from_coords(sd->editable_object,
620 event->cur.canvas.x - ox,
621 event->cur.canvas.y - oy);
622 _e_entry_imf_context_reset(obj);
623 e_editable_cursor_pos_set(sd->editable_object, pos);
624 _e_entry_imf_cursor_info_set(obj);
628 /* Called when the the "selection_notify" event is emitted */
630 _e_entry_x_selection_notify_handler(void *data, int type __UNUSED__, void *event)
633 E_Entry_Smart_Data *sd;
634 Ecore_X_Event_Selection_Notify *ev;
635 Evas_Object *editable;
636 int cursor_pos, selection_pos;
637 int start_pos, end_pos;
641 if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry))))
646 editable = sd->editable_object;
647 cursor_pos = e_editable_cursor_pos_get(editable);
648 selection_pos = e_editable_selection_pos_get(editable);
649 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
650 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
651 selecting = (start_pos != end_pos);
654 if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) ||
655 (ev->selection == ECORE_X_SELECTION_PRIMARY))
657 if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0)
659 Ecore_X_Selection_Data_Text *text_data;
661 text_data = ev->data;
662 if (selecting && !_e_entry_emacs_keybindings)
663 changed |= e_editable_delete(editable, start_pos, end_pos);
664 changed |= e_editable_insert(editable, start_pos, text_data->text);
669 evas_object_smart_callback_call(entry, "changed", NULL);
671 return ECORE_CALLBACK_PASS_ON;
674 /* Updates the X selection with the selected text of the entry */
676 _e_entry_x_selection_update(Evas_Object *entry)
678 E_Entry_Smart_Data *sd;
679 Evas_Object *editable;
681 int cursor_pos, selection_pos;
682 int start_pos, end_pos;
686 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
688 if (!(win = e_win_evas_object_win_get(entry)))
691 editable = sd->editable_object;
692 if (e_editable_password_get(editable)) return;
694 cursor_pos = e_editable_cursor_pos_get(editable);
695 selection_pos = e_editable_selection_pos_get(editable);
696 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
697 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
698 selecting = (start_pos != end_pos);
701 (!(text = e_editable_text_range_get(editable, start_pos, end_pos))))
704 ecore_x_selection_primary_set(win->evas_win, text, strlen(text) + 1);
708 /* Treats the "key down" event to mimick the behavior of Windows/Gtk2/Qt */
710 _e_entry_key_down_windows(Evas_Object *entry, Evas_Event_Key_Down *event)
712 E_Entry_Smart_Data *sd;
713 Evas_Object *editable;
714 int cursor_pos, selection_pos;
715 int start_pos, end_pos;
718 int selection_changed = 0;
722 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
724 if ((!event) || (!event->keyname))
727 editable = sd->editable_object;
728 cursor_pos = e_editable_cursor_pos_get(editable);
729 selection_pos = e_editable_selection_pos_get(editable);
730 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
731 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
732 selecting = (start_pos != end_pos);
734 if ((!strcmp(event->key, "Escape")) ||
735 (!strcmp(event->key, "Return")) || (!strcmp(event->key, "KP_Enter")))
736 _e_entry_imf_context_reset(entry);
738 /* Move the cursor/selection to the left */
739 if (strcmp(event->key, "Left") == 0 ||
740 ((strcmp(event->key, "KP_Left") == 0) && (!event->string)))
742 if (evas_key_modifier_is_set(event->modifiers, "Shift"))
744 e_editable_cursor_move_left(editable);
745 selection_changed = 1;
749 if (cursor_pos < selection_pos)
750 e_editable_selection_pos_set(editable, cursor_pos);
752 e_editable_cursor_pos_set(editable, selection_pos);
756 e_editable_cursor_move_left(editable);
757 e_editable_selection_pos_set(editable,
758 e_editable_cursor_pos_get(editable));
761 /* Move the cursor/selection to the right */
762 else if (strcmp(event->key, "Right") == 0 ||
763 ((strcmp(event->key, "KP_Right") == 0) && (!event->string)))
765 if (evas_key_modifier_is_set(event->modifiers, "Shift"))
767 e_editable_cursor_move_right(editable);
768 selection_changed = 1;
772 if (cursor_pos > selection_pos)
773 e_editable_selection_pos_set(editable, cursor_pos);
775 e_editable_cursor_pos_set(editable, selection_pos);
779 e_editable_cursor_move_right(editable);
780 e_editable_selection_pos_set(editable,
781 e_editable_cursor_pos_get(editable));
784 /* Move the cursor/selection to the start of the entry */
785 else if (strcmp(event->keyname, "Home") == 0 ||
786 ((strcmp(event->key, "KP_Home") == 0) && (!event->string)))
788 e_editable_cursor_move_to_start(editable);
789 if (!evas_key_modifier_is_set(event->modifiers, "Shift"))
790 e_editable_selection_pos_set(editable,
791 e_editable_cursor_pos_get(editable));
793 selection_changed = 1;
795 /* Move the cursor/selection to the end of the entry */
796 else if (strcmp(event->keyname, "End") == 0 ||
797 ((strcmp(event->key, "KP_End") == 0) && (!event->string)))
799 e_editable_cursor_move_to_end(editable);
800 if (!evas_key_modifier_is_set(event->modifiers, "Shift"))
801 e_editable_selection_pos_set(editable,
802 e_editable_cursor_pos_get(editable));
804 selection_changed = 1;
806 /* Delete the previous character */
807 else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0))
810 changed = e_editable_delete(editable, start_pos, end_pos);
812 changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos);
814 /* Delete the next character */
815 else if ((sd->enabled) && ((strcmp(event->keyname, "Delete") == 0) ||
816 ((strcmp(event->key, "KP_Delete") == 0) && (!event->string))))
819 changed = e_editable_delete(editable, start_pos, end_pos);
821 changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1);
824 else if (evas_key_modifier_is_set(event->modifiers, "Control"))
826 if (strcmp(event->keyname, "a") == 0)
828 e_editable_select_all(editable);
829 selection_changed = 1;
831 else if ((strcmp(event->keyname, "x") == 0) ||
832 (strcmp(event->keyname, "c") == 0))
834 if (!e_editable_password_get(editable) && selecting)
836 range = e_editable_text_range_get(editable, start_pos, end_pos);
839 if ((win = e_win_evas_object_win_get(entry)))
840 ecore_x_selection_clipboard_set(win->evas_win,
845 if ((sd->enabled) && (strcmp(event->keyname, "x") == 0))
846 changed = e_editable_delete(editable, start_pos, end_pos);
849 else if ((sd->enabled) && (strcmp(event->keyname, "v") == 0))
851 if ((win = e_win_evas_object_win_get(entry)))
852 ecore_x_selection_clipboard_request(win->evas_win,
853 ECORE_X_SELECTION_TARGET_UTF8_STRING);
856 /* Otherwise, we insert the corresponding character */
857 else if ((event->string) && ((sd->enabled)) &&
858 ((strlen(event->string) != 1) || (event->string[0] >= 0x20)))
861 changed |= e_editable_delete(editable, start_pos, end_pos);
862 changed |= e_editable_insert(editable, start_pos, event->string);
865 _e_entry_imf_cursor_info_set(entry);
868 evas_object_smart_callback_call(entry, "changed", NULL);
869 if (selection_changed)
870 _e_entry_x_selection_update(entry);
873 /* Treats the "key down" event to mimick the behavior of Emacs */
875 _e_entry_key_down_emacs(Evas_Object *entry, Evas_Event_Key_Down *event)
877 E_Entry_Smart_Data *sd;
878 Evas_Object *editable;
879 int cursor_pos, selection_pos;
880 int start_pos, end_pos;
883 int selection_changed = 0;
887 if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
889 if ((!event) || (!event->keyname))
892 editable = sd->editable_object;
893 cursor_pos = e_editable_cursor_pos_get(editable);
894 selection_pos = e_editable_selection_pos_get(editable);
895 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
896 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
897 selecting = (start_pos != end_pos);
899 if ((!strcmp(event->key, "Escape")) ||
900 (!strcmp(event->key, "Return")) || (!strcmp(event->key, "KP_Enter")))
901 _e_entry_imf_context_reset(entry);
903 /* Move the cursor/selection to the left */
904 if ((strcmp(event->key, "Left") == 0) ||
905 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
906 (strcmp(event->key, "b") == 0)))
908 e_editable_cursor_move_left(editable);
909 if (sd->selection_mode)
910 selection_changed = 1;
912 e_editable_selection_pos_set(editable,
913 e_editable_cursor_pos_get(editable));
915 /* Move the cursor/selection to the right */
916 else if ((strcmp(event->key, "Right") == 0) ||
917 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
918 (strcmp(event->key, "f") == 0)))
920 e_editable_cursor_move_right(editable);
921 if (sd->selection_mode)
922 selection_changed = 1;
924 e_editable_selection_pos_set(editable,
925 e_editable_cursor_pos_get(editable));
927 /* Move the cursor/selection to the start of the entry */
928 else if ((strcmp(event->keyname, "Home") == 0) ||
929 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
930 (strcmp(event->key, "a") == 0)))
932 e_editable_cursor_move_to_start(editable);
933 if (sd->selection_mode)
934 selection_changed = 1;
936 e_editable_selection_pos_set(editable,
937 e_editable_cursor_pos_get(editable));
939 /* Move the cursor/selection to the end of the entry */
940 else if ((strcmp(event->keyname, "End") == 0) ||
941 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
942 (strcmp(event->key, "e") == 0)))
944 e_editable_cursor_move_to_end(editable);
945 if (sd->selection_mode)
946 selection_changed = 1;
948 e_editable_selection_pos_set(editable,
949 e_editable_cursor_pos_get(editable));
951 /* Delete the previous character */
952 else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0))
953 changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos);
954 /* Delete the next character */
955 else if ((sd->enabled) &&
956 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
957 (strcmp(event->key, "d") == 0)))
958 changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1);
959 /* Delete until end of line */
960 else if ((sd->enabled) &&
961 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
962 (strcmp(event->key, "k") == 0)))
963 changed = e_editable_delete(editable, cursor_pos,
964 e_editable_text_length_get(editable));
965 /* Toggle the selection mode */
966 else if ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
967 (strcmp(event->key, "space") == 0))
969 if (sd->selection_mode)
971 e_editable_selection_pos_set(editable, cursor_pos);
972 sd->selection_mode = 0;
975 sd->selection_mode = 1;
978 else if ((evas_key_modifier_is_set(event->modifiers, "Control") ||
979 evas_key_modifier_is_set(event->modifiers, "Shift")) &&
980 (strcmp(event->key, "w") == 0))
982 if (!e_editable_password_get(editable) && selecting)
984 range = e_editable_text_range_get(editable, start_pos, end_pos);
987 if ((win = e_win_evas_object_win_get(entry)))
988 ecore_x_selection_clipboard_set(win->evas_win,
993 if ((sd->enabled) && (evas_key_modifier_is_set(event->modifiers, "Control")))
995 changed = e_editable_delete(editable, start_pos, end_pos);
996 sd->selection_mode = 0;
1001 else if ((sd->enabled) &&
1002 ((evas_key_modifier_is_set(event->modifiers, "Control")) &&
1003 (strcmp(event->key, "y") == 0)))
1005 if ((win = e_win_evas_object_win_get(entry)))
1006 ecore_x_selection_clipboard_request(win->evas_win,
1007 ECORE_X_SELECTION_TARGET_UTF8_STRING);
1009 /* Otherwise, we insert the corresponding character */
1010 else if ((event->string) &&
1011 ((strlen(event->string) != 1) ||
1012 (event->string[0] >= 0x20 && event->string[0] != 0x7f)))
1013 changed = e_editable_insert(editable, cursor_pos, event->string);
1015 _e_entry_imf_cursor_info_set(entry);
1018 evas_object_smart_callback_call(entry, "changed", NULL);
1019 if (selection_changed)
1020 _e_entry_x_selection_update(entry);
1023 /* Editable object's smart methods */
1026 _e_entry_smart_add(Evas_Object *object)
1029 E_Entry_Smart_Data *sd;
1032 #ifdef HAVE_ECORE_IMF
1034 const Ecore_IMF_Context_Info *ctx_info;
1037 if ((!object) || !(evas = evas_object_evas_get(object)))
1040 sd = calloc(1, sizeof(E_Entry_Smart_Data));
1043 evas_object_smart_data_set(object, sd);
1045 #ifdef HAVE_ECORE_IMF
1046 ctx_id = ecore_imf_context_default_id_get();
1049 ctx_info = ecore_imf_context_info_by_id_get(ctx_id);
1050 if (!ctx_info->canvas_type ||
1051 strcmp(ctx_info->canvas_type, "evas") == 0)
1052 sd->imf_context = ecore_imf_context_add(ctx_id);
1055 ctx_id = ecore_imf_context_default_id_by_canvas_type_get("evas");
1057 sd->imf_context = ecore_imf_context_add(ctx_id);
1059 sd->imf_context = NULL;
1063 sd->imf_context = NULL;
1065 if (sd->imf_context)
1067 ecore_imf_context_client_window_set(sd->imf_context,
1068 (long *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
1069 ecore_imf_context_client_canvas_set(sd->imf_context, evas);
1070 ecore_imf_context_retrieve_surrounding_callback_set(sd->imf_context,
1071 _e_entry_cb_imf_retrieve_surrounding,
1073 ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_COMMIT, _e_entry_cb_imf_event_commit, object);
1074 ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, _e_entry_cb_imf_event_preedit_changed, object);
1075 ecore_imf_context_event_callback_add(sd->imf_context, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, _e_entry_cb_imf_event_delete_surrounding, sd);
1081 sd->selection_dragging = 0;
1082 sd->selection_mode = 0;
1085 o = edje_object_add(evas);
1086 sd->entry_object = o;
1087 e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/entry");
1088 evas_object_smart_member_add(o, object);
1090 o = e_editable_add(evas);
1091 sd->editable_object = o;
1092 e_editable_theme_set(o, "base/theme/widgets", "e/widgets/entry");
1093 e_editable_cursor_hide(o);
1094 e_editable_char_size_get(o, &cw, &ch);
1095 edje_extern_object_min_size_set(o, cw, ch);
1096 edje_object_part_swallow(sd->entry_object, "e.swallow.text", o);
1097 edje_object_size_min_calc(sd->entry_object, &sd->min_width, &sd->height);
1098 evas_object_show(o);
1100 evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN,
1101 _e_entry_key_down_cb, NULL);
1102 evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_UP,
1103 _e_entry_key_up_cb, NULL);
1104 evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN,
1105 _e_entry_mouse_down_cb, NULL);
1106 evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP,
1107 _e_entry_mouse_up_cb, NULL);
1108 evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_MOVE,
1109 _e_entry_mouse_move_cb, NULL);
1110 sd->selection_handler =
1111 ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY,
1112 _e_entry_x_selection_notify_handler, object);
1116 _e_entry_smart_del(Evas_Object *object)
1118 E_Entry_Smart_Data *sd;
1120 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1123 #ifdef HAVE_ECORE_IMF
1124 if (sd->imf_context)
1126 ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_COMMIT, _e_entry_cb_imf_event_commit);
1127 ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, _e_entry_cb_imf_event_preedit_changed);
1128 ecore_imf_context_event_callback_del(sd->imf_context, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, _e_entry_cb_imf_event_delete_surrounding);
1130 ecore_imf_context_del(sd->imf_context);
1134 evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_DOWN,
1135 _e_entry_key_down_cb);
1136 evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_UP,
1137 _e_entry_key_up_cb);
1138 evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_DOWN,
1139 _e_entry_mouse_down_cb);
1140 evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_UP,
1141 _e_entry_mouse_up_cb);
1142 evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_MOVE,
1143 _e_entry_mouse_move_cb);
1145 if (sd->selection_handler)
1146 ecore_event_handler_del(sd->selection_handler);
1147 evas_object_del(sd->editable_object);
1148 evas_object_del(sd->entry_object);
1153 _e_entry_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y)
1155 E_Entry_Smart_Data *sd;
1156 Evas_Coord prev_x, prev_y;
1159 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1162 evas_object_geometry_get(object, &prev_x, &prev_y, NULL, NULL);
1163 evas_object_geometry_get(sd->entry_object, &ox, &oy, NULL, NULL);
1164 evas_object_move(sd->entry_object, ox + (x - prev_x), oy + (y - prev_y));
1168 _e_entry_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h)
1170 E_Entry_Smart_Data *sd;
1173 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1176 evas_object_geometry_get(object, &x, &y, NULL, NULL);
1177 evas_object_move(sd->entry_object, x, y + ((h - sd->height) * sd->valign));
1178 evas_object_resize(sd->entry_object, w, sd->height);
1182 _e_entry_smart_show(Evas_Object *object)
1184 E_Entry_Smart_Data *sd;
1186 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1188 evas_object_show(sd->entry_object);
1192 _e_entry_smart_hide(Evas_Object *object)
1194 E_Entry_Smart_Data *sd;
1196 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1198 evas_object_hide(sd->entry_object);
1202 _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a)
1204 E_Entry_Smart_Data *sd;
1206 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1208 evas_object_color_set(sd->entry_object, r, g, b, a);
1212 _e_entry_clip_set(Evas_Object *object, Evas_Object *clip)
1214 E_Entry_Smart_Data *sd;
1216 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1218 evas_object_clip_set(sd->entry_object, clip);
1222 _e_entry_clip_unset(Evas_Object *object)
1224 E_Entry_Smart_Data *sd;
1226 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1228 evas_object_clip_unset(sd->entry_object);
1232 _e_entry_cb_menu_post(void *data, E_Menu *m __UNUSED__)
1234 E_Entry_Smart_Data *sd;
1237 if (!sd->popup) return;
1238 e_object_del(E_OBJECT(sd->popup));
1243 _e_entry_cb_cut(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1245 E_Entry_Smart_Data *sd;
1246 Evas_Object *editable;
1247 int cursor_pos, selection_pos;
1248 int start_pos, end_pos;
1249 int selecting, changed;
1254 if (!sd->enabled) return;
1256 editable = sd->editable_object;
1257 cursor_pos = e_editable_cursor_pos_get(editable);
1258 selection_pos = e_editable_selection_pos_get(editable);
1259 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
1260 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
1261 selecting = (start_pos != end_pos);
1262 if (!selecting) return;
1264 range = e_editable_text_range_get(editable, start_pos, end_pos);
1267 if ((win = e_win_evas_object_win_get(sd->entry_object)))
1268 ecore_x_selection_clipboard_set(win->evas_win,
1269 range, strlen(range) + 1);
1272 changed = e_editable_delete(editable, start_pos, end_pos);
1274 evas_object_smart_callback_call(sd->entry_object, "changed", NULL);
1278 _e_entry_cb_copy(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1280 E_Entry_Smart_Data *sd;
1281 Evas_Object *editable;
1282 int cursor_pos, selection_pos;
1283 int start_pos, end_pos;
1290 editable = sd->editable_object;
1291 cursor_pos = e_editable_cursor_pos_get(editable);
1292 selection_pos = e_editable_selection_pos_get(editable);
1293 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
1294 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
1295 selecting = (start_pos != end_pos);
1296 if (!selecting) return;
1298 range = e_editable_text_range_get(editable, start_pos, end_pos);
1301 if ((win = e_win_evas_object_win_get(sd->entry_object)))
1302 ecore_x_selection_clipboard_set(win->evas_win,
1303 range, strlen(range) + 1);
1309 _e_entry_cb_paste(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1311 E_Entry_Smart_Data *sd;
1315 if (!sd->enabled) return;
1317 if ((win = e_win_evas_object_win_get(sd->entry_object)))
1318 ecore_x_selection_clipboard_request(win->evas_win,
1319 ECORE_X_SELECTION_TARGET_UTF8_STRING);
1323 _e_entry_cb_select_all(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1325 E_Entry_Smart_Data *sd;
1328 e_editable_select_all(sd->editable_object);
1329 _e_entry_x_selection_update(sd->entry_object);
1333 _e_entry_cb_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1335 E_Entry_Smart_Data *sd;
1336 Evas_Object *editable;
1337 int cursor_pos, selection_pos;
1338 int start_pos, end_pos;
1343 if (!sd->enabled) return;
1345 editable = sd->editable_object;
1346 cursor_pos = e_editable_cursor_pos_get(editable);
1347 selection_pos = e_editable_selection_pos_get(editable);
1348 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
1349 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
1350 selecting = (start_pos != end_pos);
1351 if (!selecting) return;
1353 range = e_editable_text_range_get(editable, start_pos, end_pos);
1356 e_editable_delete(editable, start_pos, end_pos);
1357 evas_object_smart_callback_call(sd->entry_object, "changed", NULL);
1363 _e_entry_imf_context_reset(Evas_Object *object)
1365 E_Entry_Smart_Data *sd;
1367 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1370 #ifdef HAVE_ECORE_IMF
1371 if (sd->imf_context)
1372 ecore_imf_context_reset(sd->imf_context);
1377 _e_entry_imf_cursor_info_set(Evas_Object *object)
1379 E_Entry_Smart_Data *sd;
1380 #ifdef HAVE_ECORE_IMF
1381 Evas_Coord cx, cy, cw, ch;
1382 Evas_Object *editable;
1385 if ((!object) || !(sd = evas_object_smart_data_get(object)))
1388 #ifdef HAVE_ECORE_IMF
1389 if (!sd || !sd->imf_context) return;
1391 editable = sd->editable_object;
1393 e_editable_cursor_geometry_get(editable, &cx, &cy, &cw, &ch);
1395 ecore_imf_context_cursor_position_set(sd->imf_context,
1396 e_editable_cursor_pos_get(editable));
1397 ecore_imf_context_cursor_location_set(sd->imf_context, cx, cy, cw, ch);
1401 #ifdef HAVE_ECORE_IMF
1403 _e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, char **text, int *cursor_pos)
1405 E_Entry_Smart_Data *sd;
1413 str = e_editable_text_get(sd->editable_object);
1414 *text = str ? strdup(str) : strdup("");
1418 *cursor_pos = e_editable_cursor_pos_get(sd->editable_object);
1424 _e_entry_cb_imf_event_commit(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info)
1427 E_Entry_Smart_Data *sd;
1428 Evas_Object *editable;
1429 char *commit_str = event_info;
1430 int cursor_pos, selection_pos;
1431 int start_pos, end_pos;
1435 if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry))))
1438 if (!sd->imf_context)
1441 editable = sd->editable_object;
1442 cursor_pos = e_editable_cursor_pos_get(editable);
1443 selection_pos = e_editable_selection_pos_get(editable);
1444 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
1445 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
1446 selecting = (start_pos != end_pos);
1449 changed |= e_editable_delete(editable, start_pos, end_pos);
1451 /* delete preedit characters */
1452 if (sd->have_preedit)
1454 if (sd->preedit_start_pos != sd->preedit_end_pos)
1455 e_editable_delete(editable, sd->preedit_start_pos, sd->preedit_end_pos);
1456 sd->have_preedit = EINA_FALSE;
1457 start_pos = sd->preedit_start_pos;
1460 changed |= e_editable_insert(editable, start_pos, commit_str);
1462 _e_entry_imf_cursor_info_set(entry);
1465 evas_object_smart_callback_call(entry, "changed", NULL);
1469 _e_entry_cb_imf_event_preedit_changed(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info __UNUSED__)
1472 E_Entry_Smart_Data *sd;
1473 Evas_Object *editable;
1474 int cursor_pos, selection_pos;
1475 char *preedit_string = NULL;
1476 int start_pos, end_pos;
1480 if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry))))
1483 if (!sd->imf_context)
1486 /* Get the preedit string from IMF */
1487 ecore_imf_context_preedit_string_get(sd->imf_context, &preedit_string, &cursor_pos);
1488 if (!preedit_string) return;
1490 editable = sd->editable_object;
1491 cursor_pos = e_editable_cursor_pos_get(editable);
1492 selection_pos = e_editable_selection_pos_get(editable);
1493 start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos;
1494 end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
1495 selecting = (start_pos != end_pos);
1498 changed |= e_editable_delete(editable, start_pos, end_pos);
1500 /* delete preedit characters */
1501 if (sd->have_preedit)
1503 if (sd->preedit_start_pos != sd->preedit_end_pos)
1504 e_editable_delete(editable, sd->preedit_start_pos, sd->preedit_end_pos);
1507 cursor_pos = e_editable_cursor_pos_get(editable);
1508 sd->preedit_start_pos = cursor_pos;
1510 /* insert preedit character(s) */
1511 changed |= e_editable_insert(editable, cursor_pos, preedit_string);
1513 sd->preedit_end_pos = e_editable_cursor_pos_get(editable);
1515 if (!strcmp(preedit_string, ""))
1516 sd->have_preedit = EINA_FALSE;
1518 sd->have_preedit = EINA_TRUE;
1520 _e_entry_imf_cursor_info_set(entry);
1523 evas_object_smart_callback_call(entry, "preedit,changed", NULL);
1525 free(preedit_string);
1529 _e_entry_cb_imf_event_delete_surrounding(void *data, Ecore_IMF_Context *ctx __UNUSED__, void *event_info)
1531 E_Entry_Smart_Data *sd;
1532 Ecore_IMF_Event_Delete_Surrounding *ev = event_info;
1533 Evas_Object *editable;
1538 if ((!sd) || (!sd->imf_context))
1541 editable = sd->editable_object;
1542 cursor_pos = e_editable_cursor_pos_get(editable);
1543 e_editable_delete(editable,
1544 cursor_pos + ev->offset,
1545 cursor_pos + ev->offset + ev->n_chars);