Enlightenment CVS committal

Author  : andrunko
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_entry.c e_main.c 


Log Message:
Added support for Ecore_IMF on E_Entry.

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -3 -r1.47 -r1.48
--- e_entry.c   15 Nov 2007 06:29:10 -0000      1.47
+++ e_entry.c   19 Nov 2007 18:42:40 -0000      1.48
@@ -3,6 +3,8 @@
  */
 #include "e.h"
 
+#include <Ecore_IMFF.h>
+
 typedef struct _E_Entry_Smart_Data E_Entry_Smart_Data;
 
 struct _E_Entry_Smart_Data
@@ -11,6 +13,7 @@
    Evas_Object *editable_object;
    E_Menu *popup;
    Ecore_Event_Handler *selection_handler;
+   Ecore_IMF_Context *imf_context;
    
    int enabled;
    int focused;
@@ -23,6 +26,7 @@
 
 /* local subsystem functions */
 static void _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
+static void _e_entry_key_up_cb(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
 static void _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
 static void _e_entry_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
 static void _e_entry_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
@@ -47,6 +51,9 @@
 static void _e_entry_cb_paste(void *data, E_Menu *m, E_Menu_Item *mi);
 static void _e_entry_cb_select_all(void *data, E_Menu *m, E_Menu_Item *mi);
 static void _e_entry_cb_delete(void *data, E_Menu *m, E_Menu_Item *mi);
+static int _e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context 
*ctx, char **text, int *cursor_pos);
+static int _e_entry_cb_imf_event_commit(void *data, int type, void *event);
+static int _e_entry_cb_imf_event_delete_surrounding(void *data, int type, void 
*event);
 
 /* local subsystem globals */
 static Evas_Smart *_e_entry_smart = NULL;
@@ -171,6 +178,10 @@
    if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
      return;
    e_editable_password_set(sd->editable_object, password_mode);
+   if (sd->imf_context)
+     ecore_imf_context_input_mode_set(sd->imf_context,
+                                      password_mode ? 
ECORE_IMF_INPUT_MODE_FULL & ECORE_IMF_INPUT_MODE_INVISIBLE :
+                                                      
ECORE_IMF_INPUT_MODE_FULL);
 }
 
 /**
@@ -214,11 +225,22 @@
    if (!sd->selection_dragging)
      {
         e_editable_cursor_move_to_end(sd->editable_object);
+        if (sd->imf_context)
+          {
+             ecore_imf_context_reset(sd->imf_context);
+             ecore_imf_context_cursor_position_set(sd->imf_context,
+                                                   
e_editable_cursor_pos_get(sd->editable_object));
+          }
         e_editable_selection_move_to_end(sd->editable_object);
      }
    if (sd->enabled)
       e_editable_cursor_show(sd->editable_object);
    e_editable_selection_show(sd->editable_object);
+   if (sd->imf_context)
+     {
+        ecore_imf_context_reset(sd->imf_context);
+        ecore_imf_context_focus_in(sd->imf_context);
+     }
    sd->focused = 1;
 }
 
@@ -243,6 +265,11 @@
    edje_object_signal_emit(sd->entry_object, "e,state,unfocused", "e");
    e_editable_cursor_hide(sd->editable_object);
    e_editable_selection_hide(sd->editable_object);
+   if (sd->imf_context)
+     {
+        ecore_imf_context_reset(sd->imf_context);
+        ecore_imf_context_focus_out(sd->imf_context);
+     }
    sd->focused = 0;
 }
 
@@ -295,12 +322,34 @@
 static void
 _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
+   E_Entry_Smart_Data *sd;
+
+   if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
+     return;
+
+   if (sd->imf_context &&
+       ecore_imf_context_filter_event(sd->imf_context, EVAS_CALLBACK_KEY_DOWN, 
event_info))
+     return;
+
    if (_e_entry_emacs_keybindings)
      _e_entry_key_down_emacs(obj, event_info);
    else
      _e_entry_key_down_windows(obj, event_info);
 }
 
+/* Called when a key has been released by the user */
+static void
+_e_entry_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   E_Entry_Smart_Data *sd;
+
+   if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
+     return;
+
+   if (sd->imf_context)
+     ecore_imf_context_filter_event(sd->imf_context, EVAS_CALLBACK_KEY_UP, 
event_info);
+}
+
 /* Called when the entry object is pressed by the mouse */
 static void
 _e_entry_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
@@ -314,7 +363,11 @@
      return;
    if (!(event = event_info))
      return;
-   
+
+   if (sd->imf_context &&
+       ecore_imf_context_filter_event(sd->imf_context, 
EVAS_CALLBACK_MOUSE_DOWN, event_info))
+     return;
+
    evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL);
    pos = e_editable_pos_get_from_coords(sd->editable_object,
                                         event->canvas.x - ox,
@@ -446,6 +499,13 @@
                              E_MENU_POP_DIRECTION_DOWN, event->timestamp);
        e_util_evas_fake_mouse_up_later(e, event->button);
      }
+
+   if (sd->imf_context)
+     {
+        ecore_imf_context_reset(sd->imf_context);
+        ecore_imf_context_cursor_position_set(sd->imf_context,
+                                              
e_editable_cursor_pos_get(sd->editable_object));
+     }
 }
 
 /* Called when the entry object is released by the mouse */
@@ -457,6 +517,10 @@
    if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
      return;
    
+   if (sd->imf_context &&
+       ecore_imf_context_filter_event(sd->imf_context, EVAS_CALLBACK_MOUSE_UP, 
event_info))
+     return;
+
    if (sd->selection_dragging)
      {
         sd->selection_dragging = 0;
@@ -477,7 +541,11 @@
      return;
    if (!(event = event_info))
      return;
-   
+
+   if (sd->imf_context &&
+       ecore_imf_context_filter_event(sd->imf_context, 
EVAS_CALLBACK_MOUSE_MOVE, event_info))
+     return;
+
    if (sd->selection_dragging)
      {
         evas_object_geometry_get(sd->editable_object, &ox, &oy, NULL, NULL);
@@ -485,6 +553,12 @@
                                              event->cur.canvas.x - ox,
                                              event->cur.canvas.y - oy);
         e_editable_cursor_pos_set(sd->editable_object, pos);
+        if (sd->imf_context)
+          {
+             ecore_imf_context_reset(sd->imf_context);
+             ecore_imf_context_cursor_position_set(sd->imf_context,
+                                                   pos);
+          }
      }
 }
 
@@ -715,7 +789,14 @@
           changed |= e_editable_delete(editable, start_pos, end_pos);
         changed |= e_editable_insert(editable, start_pos, event->string);
      }
-   
+
+   if (sd->imf_context)
+     {
+        ecore_imf_context_reset(sd->imf_context);
+        ecore_imf_context_cursor_position_set(sd->imf_context,
+                                              
e_editable_cursor_pos_get(editable));
+     }
+
    if (changed)
      evas_object_smart_callback_call(entry, "changed", NULL);
    if (selection_changed)
@@ -859,8 +940,14 @@
            ((strlen(event->string) != 1) ||
             (event->string[0] >= 0x20 && event->string[0] != 0x7f)))
      changed = e_editable_insert(editable, cursor_pos, event->string);
-   
-   
+
+   if (sd->imf_context)
+     {
+        ecore_imf_context_reset(sd->imf_context);
+        ecore_imf_context_cursor_position_set(sd->imf_context,
+                                              
e_editable_cursor_pos_get(editable));
+     }
+
    if (changed)
      evas_object_smart_callback_call(entry, "changed", NULL);
    if (selection_changed)
@@ -884,7 +971,23 @@
    if (!sd) return;
    
    evas_object_smart_data_set(object, sd);
-   
+
+   sd->imf_context = ecore_imf_context_add(ecore_imf_context_default_id_get());
+   if (sd->imf_context)
+     {
+        ecore_imf_context_client_window_set(sd->imf_context,
+                                            
ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+        ecore_imf_context_retrieve_surrounding_callback_set(sd->imf_context,
+                                                            
_e_entry_cb_imf_retrieve_surrounding,
+                                                            sd);
+        ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT,
+                                _e_entry_cb_imf_event_commit,
+                                object);
+        ecore_event_handler_add(ECORE_IMF_EVENT_DELETE_SURROUNDIND,
+                                _e_entry_cb_imf_event_delete_surrounding,
+                                sd);
+     }
+
    sd->enabled = 1;
    sd->focused = 0;
    sd->selection_dragging = 0;
@@ -908,6 +1011,8 @@
    
    evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_DOWN,
                                   _e_entry_key_down_cb, NULL);
+   evas_object_event_callback_add(object, EVAS_CALLBACK_KEY_UP,
+                                  _e_entry_key_up_cb, NULL);
    evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN,
                                   _e_entry_mouse_down_cb, NULL);
    evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP,
@@ -928,8 +1033,13 @@
    if ((!object) || !(sd = evas_object_smart_data_get(object)))
      return;
 
+   if (sd->imf_context)
+     ecore_imf_context_del(sd->imf_context);
+
    evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_DOWN,
                                   _e_entry_key_down_cb);
+   evas_object_event_callback_del(object, EVAS_CALLBACK_KEY_DOWN,
+                                  _e_entry_key_up_cb);
    evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_DOWN,
                                   _e_entry_mouse_down_cb);
    evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_UP,
@@ -1152,4 +1262,64 @@
        evas_object_smart_callback_call(sd->entry_object, "changed", NULL);
        free(range);
      }
+}
+
+static int
+ _e_entry_cb_imf_retrieve_surrounding(void *data, Ecore_IMF_Context *ctx, char 
**text, int *cursor_pos)
+{
+   E_Entry_Smart_Data *sd;
+
+   sd = data;
+
+   if (text)
+     {
+        const char *str;
+
+        str = e_editable_text_get(sd->editable_object);
+        *text = str ? strdup(str) : strdup("");
+     }
+
+   if (cursor_pos)
+     *cursor_pos = e_editable_cursor_pos_get(sd->editable_object);
+
+   return 1;
+}
+
+static int
+_e_entry_cb_imf_event_commit(void *data, int type, void *event)
+{
+   Evas_Object *entry;
+   E_Entry_Smart_Data *sd;
+   Ecore_IMF_Event_Commit *ev = event;
+
+   if ((!(entry = data)) || (!(sd = evas_object_smart_data_get(entry))))
+     return 1;
+
+   if (sd->imf_context != ev->ctx)
+      return 1;
+
+   e_entry_text_set(entry, ev->str);
+   return 0;
+}
+
+static int
+_e_entry_cb_imf_event_delete_surrounding(void *data, int type, void *event)
+{
+   E_Entry_Smart_Data *sd;
+   Ecore_IMF_Event_Delete_Surrounding *ev = event;
+   Evas_Object *editable;
+   int cursor_pos;
+
+   sd = data;
+
+   if (sd->imf_context != ev->ctx)
+      return 1;
+
+   editable = sd->editable_object;
+   cursor_pos = e_editable_cursor_pos_get(editable);
+   e_editable_delete(editable,
+                     cursor_pos + ev->offset,
+                     cursor_pos + ev->offset + ev->n_chars);
+
+   return 0;
 }
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.239
retrieving revision 1.240
diff -u -3 -r1.239 -r1.240
--- e_main.c    4 Nov 2007 04:13:59 -0000       1.239
+++ e_main.c    19 Nov 2007 18:42:40 -0000      1.240
@@ -3,6 +3,8 @@
  */
 #include "e.h"
 
+#include <Ecore_IM.h>
+
 EAPI int e_precache_end = 0;
 
 /* local subsystem functions */
@@ -311,6 +313,8 @@
                               "Perhaps you are out of memory?"));
        exit(-1);
      }
+   ecore_im_init();
+   _e_main_shutdown_push(ecore_im_shutdown);
 // FIXME: SEGV's on shutdown if fm2 windows up - disable for now.   
 //   _e_main_shutdown_push(ecore_shutdown);
    ecore_job_init();



-------------------------------------------------------------------------
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

Reply via email to