This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository efm2.

View the commit online.

commit c7642bcfc57085a10c549e7ce55310ddce6168cb
Author: Carsten Haitzler (Rasterman) <[email protected]>
AuthorDate: Sat Jan 17 17:16:47 2026 +0000

    the very very very start of typebuf - using elm entry
---
 src/efm/efm.c         | 142 ++++++++++++++++++++++++++++++++++++++++++++++----
 src/efm/efm_structs.h |   3 ++
 2 files changed, 134 insertions(+), 11 deletions(-)

diff --git a/src/efm/efm.c b/src/efm/efm.c
index 4acfb52..e32255e 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -5,9 +5,11 @@
 //
 // maximum # of files in a dir that is sane: 10,000
 // maximum number of files in a dir on a real system to be fast with: 3,000
+#include "Evas.h"
 #include "cmd.h"
 #include "efm.h"
 #include "efm_icon.h"
+#include "efm_structs.h"
 #include "efm_util.h"
 #include "efm_dnd.h"
 #include "efm_back_end.h"
@@ -37,6 +39,112 @@ _cb_header_change(void *data)
   evas_object_smart_callback_call(sd->o_smart, "header_change", NULL);
 }
 
+static void
+_typebuf_del(Smart_Data *sd)
+{
+  Evas_Object *o = sd->o_typebuf;
+
+  printf("XXX: hide typebuf\n");
+  sd->o_typebuf = NULL;
+  evas_object_del(o);
+  evas_object_focus_set(sd->o_clip, EINA_TRUE);
+}
+
+static void
+_cb_typebuf_aborted(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  printf("XXX: typebuf aborted\n");
+  _typebuf_del(sd);
+}
+
+static void
+_cb_typebuf_activated(void *data, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  printf("XXX: typebuf activated\n");
+  _typebuf_del(sd);
+}
+
+static void
+_cb_typebuf_changed(void *data, Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+  Smart_Data *sd  = data;
+  const char *str = elm_entry_entry_get(sd->o_typebuf);
+  char       *s   = elm_entry_markup_to_utf8(str);
+
+  printf("XXX: typebuf changed[%s]\n", s);
+  free(s);
+}
+
+static void
+_cb_typebuf_cursor(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+  int         cpos = elm_entry_cursor_pos_get(sd->o_typebuf);
+  int         x, y, w, h;
+
+  if (sd->typebuf_cursor_ignore) return;
+  elm_entry_cursor_geometry_get(sd->o_typebuf, &x, &y, &w, &h);
+  printf("XXX: typebuf cursor %i @ %i,%i %ix%i\n", cpos, x, y, w, h);
+}
+
+static Eina_Bool
+_cb_typebuf_key(void *data, Evas_Object *obj EINA_UNUSED,
+                Evas_Event_Key_Down *ev)
+{
+  Smart_Data *sd = data;
+  int         cpos = elm_entry_cursor_pos_get(sd->o_typebuf);
+  int         cpos2;
+
+  if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+  if (!ev->key) return EINA_FALSE;
+  printf("INTERTCEPT %s\n", ev->key);
+  if (!strcmp(ev->key, "Tab")) return EINA_TRUE;
+  if (!strcmp(ev->key, "Up")) return EINA_TRUE;
+  if (!strcmp(ev->key, "Down")) return EINA_TRUE;
+  sd->typebuf_cursor_ignore++;
+  elm_entry_cursor_end_set(sd->o_typebuf);
+  cpos2 = elm_entry_cursor_pos_get(sd->o_typebuf);
+  elm_entry_cursor_pos_set(sd->o_typebuf, cpos);
+  sd->typebuf_cursor_ignore--;
+  if ((cpos == 0) && (!strcmp(ev->key, "Left"))) return EINA_TRUE;
+  if ((cpos == cpos2) &&  (!strcmp(ev->key, "Right"))) return EINA_TRUE;
+  return EINA_FALSE;
+}
+
+static void
+_typebuf_add(Smart_Data *sd, Evas_Event_Key_Down *ev)
+{
+  Evas_Object *o;
+
+  if (sd->o_typebuf) return;
+  elm_object_focus_set(sd->o_scroller, EINA_TRUE);
+  sd->o_typebuf = o = elm_entry_add(sd->o_scroller);
+  elm_grid_pack(sd->o_overlay_grid, o, 10, 40, 400, 20);
+  elm_entry_single_line_set(o, EINA_TRUE);
+  elm_entry_key_down_intercept_set(o, _cb_typebuf_key, sd);
+  elm_entry_scrollable_set(o, EINA_TRUE);
+  elm_scroller_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+  evas_object_move(o, 100, 100);
+  evas_object_resize(o, 200, 40);
+  elm_entry_entry_insert(o, ev->string);
+  evas_object_smart_callback_add(o, "aborted", _cb_typebuf_aborted, sd);
+  evas_object_smart_callback_add(o, "activated", _cb_typebuf_activated, sd);
+  evas_object_smart_callback_add(o, "changed,user", _cb_typebuf_changed, sd);
+  evas_object_smart_callback_add(o, "cursor,changed", _cb_typebuf_cursor, sd);
+  evas_object_show(o);
+  elm_object_focus_set(o, EINA_TRUE);
+  // handle first initial text
+  _cb_typebuf_changed(sd, o, NULL);
+}
+
 static void
 _cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
              void *event_info)
@@ -45,13 +153,18 @@ _cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
   Evas_Event_Key_Down *ev      = event_info;
   Eina_Bool            handled = EINA_FALSE;
 
-  handled = _efm_key_handle(sd, ev);
-  // flag on hold if we use the  event - otherwise pass it on
-  if (handled)
+  if (!sd->o_typebuf)
     {
-      ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-      sd->key_control = EINA_TRUE;
+      handled = _efm_key_handle(sd, ev);
+      // flag on hold if we use the  event - otherwise pass it on
+      if (handled)
+        {
+          ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+          sd->key_control = EINA_TRUE;
+        }
+      else if (ev->string) _typebuf_add(sd, ev);
     }
+  else elm_object_focus_set(sd->o_typebuf, EINA_TRUE);
   // XXX: if we're dnding - modify dnd action based on shift, ctrl etc.
   printf("XXX: KEY: [%c] [%s]\n", handled ? '#' : ' ', ev->key);
 }
@@ -63,18 +176,20 @@ _cb_refocus(void *data)
 
   sd->refocus_job = NULL;
   if (sd->rename_icon) return;
-  //  printf("XXX: REFOCUS\n");
+  printf("XXX: REFOCUS\n");
   if (sd->focused)
     {
-      //      printf("XXX:  focus widget\n");
-      evas_object_focus_set(sd->o_clip, EINA_TRUE);
+      printf("XXX:  focus widget\n");
+      if (sd->o_typebuf) elm_object_focus_set(sd->o_typebuf, EINA_TRUE);
+      else evas_object_focus_set(sd->o_clip, EINA_TRUE);
       if (sd->key_control) _icon_focus_show(sd);
     }
   else
     {
-      //      printf("XXX:  unfocused widget\n");
+      printf("XXX:  unfocused widget\n");
       _icon_focus_hide(sd);
-      // XXX: exit rename mode if on...
+      // exit rename mode if on...
+      if (sd->rename_icon) _icon_rename_end(sd->rename_icon);
     }
 }
 
@@ -685,6 +800,11 @@ _smart_del(Evas_Object *obj)
       evas_object_del(sd->o_over);
       sd->o_over = NULL;
     }
+  if (sd->o_typebuf)
+    {
+      evas_object_del(sd->o_typebuf);
+      sd->o_typebuf = NULL;
+    }
   if (sd->o_list_detailed_dummy)
     {
       evas_object_del(sd->o_list_detailed_dummy);
@@ -1196,7 +1316,7 @@ _cb_scroller_focus(void *data, Evas_Object *obj EINA_UNUSED,
 {
   Smart_Data *sd = data;
 
-  //  printf("XXX: FOCUS\n");
+  printf("XXX: FOCUS\n");
   sd->focused = EINA_TRUE;
   evas_object_focus_set(sd->o_clip, EINA_TRUE);
 }
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index 807b085..76eef57 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -44,6 +44,7 @@ struct _Smart_Data
   Evas_Object *o_focus;
   Evas_Object *o_sel;
   Evas_Object *o_over;
+  Evas_Object *o_typebuf;
   Evas_Object *o_detail_header;
   Evas_Object *o_detail_header_item[7];
 
@@ -79,6 +80,8 @@ struct _Smart_Data
   Icon      *rename_icon;
   Icon      *dnd_over_icon;
 
+  int        typebuf_cursor_ignore;
+
   Evas_Coord      icon_min_w, icon_min_h;
   Evas_Coord      list_min_w, list_min_h;
   Evas_Coord      list_detailed_min_w, list_detailed_min_h;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to