diff --git a/src/bin/e_editable.c b/src/bin/e_editable.c index c20be5e99..8f8fe171d 100644 --- a/src/bin/e_editable.c +++ b/src/bin/e_editable.c @@ -744,24 +744,37 @@ e_editable_char_size_get(Evas_Object *editable, int *w, int *h) { int tw = 0, th = 0; Evas *evas; + Evas_Object *text_obj; E_Editable_Smart_Data *sd; char *text = "Tout est bon dans l'abricot sauf le noyau!" "Wakey wakey! Eggs and Bakey!"; + const char *font, *font_source; + Evas_Text_Style_Type style; + int font_size; if (w) *w = 0; if (h) *h = 0; if ((!editable) || (!(evas = evas_object_evas_get(editable)))) return; - if ((!(sd = evas_object_smart_data_get(editable)))) + if (!(sd = evas_object_smart_data_get(editable))) + return; + if (!(text_obj = edje_object_part_object_get(sd->text_object, "text"))) return; if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0)) { - /* TODO: 1st method */ - edje_object_part_text_set(sd->text_object, "text", text); - edje_object_size_min_calc(sd->text_object, &tw, &th); - edje_object_part_text_set(sd->text_object, "text", sd->text ? sd->text : "NULL"); + font_source = evas_object_text_font_source_get(text_obj); + evas_object_text_font_get(text_obj, &font, &font_size); + style = evas_object_text_style_get(text_obj); + + text_obj = evas_object_text_add(evas); + evas_object_text_font_source_set(text_obj, font_source); + evas_object_text_font_set(text_obj, font, font_size); + evas_object_text_style_set(text_obj, style); + evas_object_text_text_set(text_obj, text); + evas_object_geometry_get(text_obj, NULL, NULL, &tw, &th); + evas_object_del(text_obj); sd->average_char_w = tw / strlen(text); sd->average_char_h = th; diff --git a/src/bin/e_entry.c b/src/bin/e_entry.c index 44eb5ed0d..ef2a57b38 100644 --- a/src/bin/e_entry.c +++ b/src/bin/e_entry.c @@ -282,6 +282,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) int start_pos, end_pos; int selecting; int changed = 0; + char *range; if ((!obj) || (!(sd = evas_object_smart_data_get(obj)))) return; @@ -295,11 +296,6 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; selecting = (start_pos != end_pos); - /* TODO: CTRL + A, X, C, V */ - - if (!sd->enabled) - return; - /* Move the cursor/selection to the left */ if (strcmp(event->key, "Left") == 0) { @@ -339,9 +335,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) } } /* Move the cursor/selection to the start of the entry */ - else if ((strcmp(event->keyname, "Home") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x1))) + else if (strcmp(event->keyname, "Home") == 0) { e_editable_cursor_move_to_start(editable); if (!evas_key_modifier_is_set(event->modifiers, "Shift")) @@ -349,9 +343,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) e_editable_cursor_pos_get(editable)); } /* Move the cursor/selection to the end of the entry */ - else if ((strcmp(event->keyname, "End") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x5))) + else if (strcmp(event->keyname, "End") == 0) { e_editable_cursor_move_to_end(editable); if (!evas_key_modifier_is_set(event->modifiers, "Shift")) @@ -359,9 +351,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) e_editable_cursor_pos_get(editable)); } /* Remove the previous character */ - else if ((strcmp(event->keyname, "BackSpace") == 0) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x8))) + else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0)) { if (selecting) changed = e_editable_delete(editable, start_pos, end_pos); @@ -369,15 +359,38 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos); } /* Remove the next character */ - else if ((!strcmp(event->keyname, "Delete")) || - ((event->string) && (strlen(event->string) == 1) && - (event->string[0] == 0x4))) + else if ((sd->enabled) && (strcmp(event->keyname, "Delete") == 0)) { if (selecting) changed = e_editable_delete(editable, start_pos, end_pos); else changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1); } + /* Ctrl + A,C,X,V */ + else if (evas_key_modifier_is_set(event->modifiers, "Control")) + { + if (strcmp(event->keyname, "a") == 0) + e_editable_select_all(editable); + else if ((strcmp(event->keyname, "x") == 0) || + (strcmp(event->keyname, "c") == 0)) + { + if (selecting) + { + range = e_editable_text_range_get(editable, start_pos, end_pos); + if (range) + { + //ecore_x_selection_clipboard_set(); + free(range); + } + if ((sd->enabled) && (strcmp(event->keyname, "x") == 0)) + changed = e_editable_delete(editable, start_pos, end_pos); + } + } + else if (strcmp(event->keyname, "v") == 0) + { + //ecore_x_selection_clipboard_request(); + } + } /* Otherwise, we insert the corresponding character */ else if ((event->string) && ((strlen(event->string) != 1) || (event->string[0] >= 0x20)))