Enlightenment CVS committal Author : andrunko Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_entry.c etk_entry.h etk_main.c Log Message: Added Etk_Entry support for Ecore_IMF. Etk_Entry now can use input method modules when available. =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- etk_entry.c 18 Nov 2007 21:44:12 -0000 1.44 +++ etk_entry.c 19 Nov 2007 18:32:11 -0000 1.45 @@ -8,6 +8,9 @@ #include <stdlib.h> #include <string.h> +#include <Ecore.h> +#include <Ecore_Evas.h> + #include "etk_editable.h" #include "etk_event.h" #include "etk_image.h" @@ -63,6 +66,9 @@ static Etk_Bool _etk_entry_selection_received_cb(Etk_Object *object, void *event, void *data); static void _etk_entry_selection_copy(Etk_Entry *entry, Etk_Selection_Type selection, Etk_Bool cut); +static int _etk_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos); +static int _etk_entry_imf_event_commit_cb(void *data, int type, void *event); +static int _etk_entry_imf_event_delete_surrounding_cb(void *data, int type, void *event); /************************** * @@ -320,6 +326,10 @@ if (entry->editable_object) etk_editable_password_mode_set(entry->editable_object, password_mode); entry->password_mode = password_mode; + if (entry->imf_context) + ecore_imf_context_input_mode_set(entry->imf_context, + password_mode ? ECORE_IMF_INPUT_MODE_FULL & ECORE_IMF_INPUT_MODE_INVISIBLE : + ECORE_IMF_INPUT_MODE_FULL); etk_object_notify(ETK_OBJECT(entry), "password-mode"); } @@ -360,6 +370,7 @@ entry->pointer_set = ETK_FALSE; entry->primary_image_highlight = ETK_FALSE; entry->secondary_image_highlight = ETK_FALSE; + entry->imf_context = NULL; entry->text = NULL; entry->internal_entry = etk_widget_new(ETK_WIDGET_TYPE, "repeat-mouse-events", ETK_TRUE, @@ -552,6 +563,23 @@ if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry")))) return ETK_TRUE; + entry->imf_context = ecore_imf_context_add(ecore_imf_context_default_id_get()); + if (entry->imf_context) + { + ecore_imf_context_client_window_set(entry->imf_context, + ecore_evas_window_get(ecore_evas_ecore_evas_get(evas))); + ecore_imf_context_retrieve_surrounding_callback_set(entry->imf_context, + _etk_entry_imf_retrieve_surrounding_cb, entry); + ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, + _etk_entry_imf_event_commit_cb, entry); + ecore_event_handler_add(ECORE_IMF_EVENT_DELETE_SURROUNDIND, + _etk_entry_imf_event_delete_surrounding_cb, entry); + + ecore_imf_context_input_mode_set(entry->imf_context, + entry->password_mode ? ECORE_IMF_INPUT_MODE_INVISIBLE : + ECORE_IMF_INPUT_MODE_FULL); + } + entry->editable_object = etk_editable_add(evas); evas_object_show(entry->editable_object); etk_widget_member_object_add(internal_entry, entry->editable_object); @@ -566,6 +594,7 @@ etk_editable_cursor_hide(entry->editable_object); etk_editable_selection_hide(entry->editable_object); } + if (etk_widget_disabled_get(ETK_WIDGET(entry))) etk_editable_disabled_set(entry->editable_object, ETK_TRUE); @@ -598,6 +627,13 @@ if (etk_widget_theme_data_get(internal_entry, "icon_interspace", "%d", &entry->image_interspace) != 1) entry->image_interspace = 5; + if (entry->imf_context && + etk_widget_is_focused(ETK_WIDGET(entry))) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_focus_in(entry->imf_context); + } + return ETK_TRUE; } @@ -610,6 +646,12 @@ if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry")))) return ETK_TRUE; + if (entry->imf_context) + { + ecore_imf_context_del(entry->imf_context); + entry->imf_context = NULL; + } + free(entry->text); if ((text = etk_editable_text_get(entry->editable_object))) entry->text = strdup(text); @@ -751,12 +793,18 @@ else stop_signal = ETK_FALSE; - if (changed) etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry)); if (selection_changed) _etk_entry_selection_copy(entry, ETK_SELECTION_PRIMARY, ETK_FALSE); + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_cursor_position_set(entry->imf_context, + etk_editable_cursor_pos_get(editable)); + } + return (!stop_signal); } @@ -768,6 +816,10 @@ if (!(entry = ETK_ENTRY(data))) return; + if (entry->imf_context && + ecore_imf_context_filter_event(entry->imf_context, EVAS_CALLBACK_MOUSE_IN, event_info)) + return; + if (!entry->pointer_set) { entry->pointer_set = ETK_TRUE; @@ -783,6 +835,10 @@ if (!(entry = ETK_ENTRY(data))) return; + if (entry->imf_context && + ecore_imf_context_filter_event(entry->imf_context, EVAS_CALLBACK_MOUSE_OUT, event_info)) + return; + if (entry->pointer_set) { entry->pointer_set = ETK_FALSE; @@ -801,6 +857,10 @@ if (!(entry = ETK_ENTRY(data))) return; + if (entry->imf_context && + ecore_imf_context_filter_event(entry->imf_context, EVAS_CALLBACK_MOUSE_DOWN, event_info)) + return; + etk_event_mouse_down_wrap(ETK_WIDGET(entry), event_info, &event); evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL); pos = etk_editable_pos_get_from_coords(entry->editable_object, event.canvas.x - ox, event.canvas.y - oy); @@ -824,6 +884,13 @@ etk_selection_text_request(ETK_SELECTION_PRIMARY, ETK_WIDGET(entry)); } + + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_cursor_position_set(entry->imf_context, + etk_editable_cursor_pos_get(entry->editable_object)); + } } /* Called when the entry is released by the mouse */ @@ -835,6 +902,10 @@ if (!(entry = ETK_ENTRY(data))) return; + if (entry->imf_context && + ecore_imf_context_filter_event(entry->imf_context, EVAS_CALLBACK_MOUSE_UP, event_info)) + return; + etk_event_mouse_up_wrap(ETK_WIDGET(entry), event_info, &event); if (event.button == 1) { @@ -854,13 +925,24 @@ if (!(entry = ETK_ENTRY(data))) return; + if (entry->imf_context && + ecore_imf_context_filter_event(entry->imf_context, EVAS_CALLBACK_MOUSE_MOVE, event_info)) + return; + if (entry->selection_dragging) { etk_event_mouse_move_wrap(ETK_WIDGET(entry), event_info, &event); evas_object_geometry_get(entry->editable_object, &ox, &oy, NULL, NULL); pos = etk_editable_pos_get_from_coords(entry->editable_object, event.cur.canvas.x - ox, event.cur.canvas.y - oy); if (pos >= 0) + { etk_editable_cursor_pos_set(entry->editable_object, pos); + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_cursor_position_set(entry->imf_context, pos); + } + } } } @@ -872,7 +954,6 @@ if (!(entry = ETK_ENTRY(data)) || !(image = ETK_IMAGE(widget))) return ETK_TRUE; - etk_widget_color_set(ETK_WIDGET(image), entry->highlight_color.r, entry->highlight_color.g, entry->highlight_color.b, entry->highlight_color.a); @@ -945,6 +1026,12 @@ etk_editable_cursor_show(entry->editable_object); etk_editable_selection_show(entry->editable_object); etk_widget_theme_signal_emit(entry->internal_entry, "etk,state,focused", ETK_FALSE); + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_focus_in(entry->imf_context); + } + return ETK_TRUE; } @@ -957,10 +1044,22 @@ return ETK_TRUE; etk_editable_cursor_move_to_end(entry->editable_object); + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_cursor_position_set(entry->imf_context, + etk_editable_cursor_pos_get(entry->editable_object)); + } etk_editable_selection_move_to_end(entry->editable_object); etk_editable_cursor_hide(entry->editable_object); etk_editable_selection_hide(entry->editable_object); etk_widget_theme_signal_emit(entry->internal_entry, "etk,state,unfocused", ETK_FALSE); + if (entry->imf_context) + { + ecore_imf_context_reset(entry->imf_context); + ecore_imf_context_focus_out(entry->imf_context); + } + return ETK_TRUE; } @@ -1066,6 +1165,71 @@ etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry)); } } +} + +static int _etk_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos) +{ + Etk_Entry *entry; + Evas_Object *editable; + const char *str; + + if (!(entry = ETK_ENTRY(data))) + return 0; + + if (text) + { + str = etk_entry_text_get(entry); + *text = str ? strdup(str) : strdup(""); + } + + if (cursor_pos) + { + editable = entry->editable_object; + *cursor_pos = etk_editable_cursor_pos_get(editable); + } + + return 1; +} + +static int _etk_entry_imf_event_commit_cb(void *data, int type, void *event) +{ + Etk_Entry *entry; + Ecore_IMF_Event_Commit *ev = event; + + if (!(entry = ETK_ENTRY(data))) + return 1; + + if (entry->imf_context != ev->ctx) + return 1; + + etk_entry_text_set(entry, ev->str); + return 0; +} + +static int _etk_entry_imf_event_delete_surrounding_cb(void *data, int type, void *event) +{ + Etk_Entry *entry; + Ecore_IMF_Event_Delete_Surrounding *ev = event; + int cursor_pos; + + if (!(entry = ETK_ENTRY(data))) + return 1; + + if (entry->imf_context != ev->ctx) + return 1; + + if (entry->editable_object) + { + Evas_Object *editable; + + editable = entry->editable_object; + cursor_pos = etk_editable_cursor_pos_get(editable); + etk_editable_delete(editable, + cursor_pos + ev->offset, + cursor_pos + ev->offset + ev->n_chars); + } + + return 0; } /** @} */ =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_entry.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- etk_entry.h 18 Nov 2007 21:44:12 -0000 1.19 +++ etk_entry.h 19 Nov 2007 18:32:11 -0000 1.20 @@ -2,6 +2,7 @@ #ifndef _ETK_ENTRY_H_ #define _ETK_ENTRY_H_ +#include <Ecore_IMF.h> #include <Evas.h> #include "etk_types.h" @@ -49,6 +50,8 @@ Evas_Object *editable_object; Etk_Image *primary_image; Etk_Image *secondary_image; + + Ecore_IMF_Context *imf_context; char *text; =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_main.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- etk_main.c 14 Oct 2007 20:39:57 -0000 1.44 +++ etk_main.c 19 Nov 2007 18:32:11 -0000 1.45 @@ -11,6 +11,7 @@ #include <string.h> #include <Ecore.h> +#include <Ecore_IMF.h> #include <Ecore_Job.h> #include <Edje.h> @@ -105,6 +106,10 @@ ETK_WARNING("Ecore initialization failed!"); return 0; } + if (!ecore_imf_init()) + { + ETK_WARNING("Ecore_IMF initialization failed!"); + } if (!ecore_job_init()) { ETK_WARNING("Ecore_Job initialization failed!"); @@ -183,6 +188,7 @@ /* Shutdown the EFL*/ edje_shutdown(); ecore_job_shutdown(); + ecore_imf_shutdown(); ecore_shutdown(); evas_shutdown(); } ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs