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 5661ec1913fe815978d43a3d465c495e55d379ce
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Tue Mar 5 13:05:29 2024 +0000

    add core of sub-open to default open to handle cnp/dnd over icons
---
 src/backends/default/open.c | 238 ++++++++++++++++++++++++++++++++++++++++++++
 src/efm/efm_back_end.c      |   4 +-
 src/efm/efm_structs.h       |   4 +-
 3 files changed, 242 insertions(+), 4 deletions(-)

diff --git a/src/backends/default/open.c b/src/backends/default/open.c
index 9437f5d..04d2be2 100644
--- a/src/backends/default/open.c
+++ b/src/backends/default/open.c
@@ -7,6 +7,8 @@
 // itself at all and do everything via fs handlers for open, delete, rename
 // copy, import, export etc.
 #include "cmd.h"
+#include "ecore_exe_eo.legacy.h"
+#include "eina_stringshare.h"
 #include "eina_types.h"
 #include "sha.h"
 #include "meta.h"
@@ -42,6 +44,235 @@ static Eina_List           *thumb_busy_queue      = NULL;
 static unsigned int         thumb_busy_max        = 8;
 static double               thumb_update_delay    = 0.25;
 
+typedef struct
+{
+  const char *op;
+  const char *src;
+  const char *dst;
+  const char *uuid;
+  Ecore_Exe  *exe;
+} Op;
+
+//static Eina_List *op_queue = NULL;
+
+typedef struct
+{
+  const char          *path;
+  Ecore_Event_Handler *handler_exe_del;
+  Ecore_Event_Handler *handler_exe_data;
+  Ecore_Exe           *exe;
+  Eina_List           *cmd_pending;
+  Eina_List           *timers;
+  Eina_Bool            ready : 1;
+} Sub;
+
+typedef struct
+{
+  Sub              *sub;
+  Eina_Stringshare *name;
+  Ecore_Timer      *timer;
+  double            delay;
+  Eina_Bool         repeat : 1;
+} Sub_Timer;
+
+static Eina_List *sub_queue = NULL;
+
+static Sub *_sub_open(const char *path, const char *backend);
+
+static Eina_Bool
+_cb_sub_timer(void *data)
+{
+  Sub_Timer *st = data;
+  Eina_Strbuf *buf = cmd_strbuf_new("timer");
+
+  cmd_strbuf_append(buf, "name", st->name);
+  cmd_strbuf_exe_consume(buf, st->sub->exe);
+  if (st->repeat) return EINA_TRUE;
+  st->sub->timers = eina_list_remove(st->sub->timers, st);
+  eina_stringshare_del(st->name);
+  free(st);
+  return EINA_FALSE;
+}
+
+static void
+_sub_del(Sub *sub)
+{
+  sub_queue = eina_list_remove(sub_queue, sub);
+  eina_stringshare_replace(&(sub->path), NULL);
+  ecore_event_handler_del(sub->handler_exe_del);
+  ecore_event_handler_del(sub->handler_exe_data);
+  ecore_exe_free(sub->exe);
+  free(sub);  
+}
+
+static void
+_sub_cmd_flush(Sub *sub)
+{
+  Eina_Strbuf *buf;
+
+  if ((!sub->ready) || (!sub->cmd_pending)) return;
+
+  EINA_LIST_FREE(sub->cmd_pending, buf)
+  {
+    cmd_strbuf_exe_consume(buf, sub->exe);
+  }
+}
+
+static void
+_sub_cmd_send(Sub *sub, Eina_Strbuf *buf)
+{
+  if (!sub->ready)
+    {
+      sub->cmd_pending = eina_list_append(sub->cmd_pending, buf);
+      return;
+    }
+  cmd_strbuf_exe_consume(buf, sub->exe);
+}
+
+static void
+_sub_command(Sub *sub, const char *str)
+{
+  Eina_Strbuf *buf;
+  Cmd         *c = cmd_parse(str);
+
+  if (!c) return;
+
+  if (!strcmp(c->command, "backend-set"))
+    { // *** must call before list-begin
+      const char *backend = cmd_key_find(c, "backend");
+
+      if (backend)
+        {
+          Sub *sub2 = _sub_open(sub->path, backend);
+          EINA_LIST_FREE(sub->cmd_pending, buf)
+          {
+            _sub_cmd_send(sub2, buf);
+          }
+          ecore_exe_kill(sub->exe);
+          _sub_del(sub);
+        }
+    }
+  else if (!strcmp(c->command, "list-end"))
+    {
+      sub->ready = EINA_TRUE;
+      _sub_cmd_flush(sub);
+    }
+  else if (!strcmp(c->command, "timer-add"))
+    {
+      const char *name   = cmd_key_find(c, "name");
+      const char *delay  = cmd_key_find(c, "delay");
+      const char *repeat = cmd_key_find(c, "repeat");
+
+      if (name && delay)
+        {
+          Sub_Timer *st = calloc(1, sizeof(Sub_Timer));
+
+          if (st)
+            {
+              st->sub = sub;
+              st->name   = eina_stringshare_add(name);
+              st->repeat = repeat ? EINA_TRUE : EINA_FALSE;
+              st->delay  = (double)atoi(delay) / 1000.0;
+              st->timer  = ecore_timer_add(st->delay, _cb_sub_timer, st);
+              sub->timers = eina_list_append(sub->timers, st);
+            }
+        }
+    }
+  else if (!strcmp(c->command, "timer-del"))
+    {
+      const char *name = cmd_key_find(c, "name");
+      Sub_Timer  *st;
+      Eina_List  *l;
+
+      if (name)
+        {
+          EINA_LIST_FOREACH(sub->timers, l, st)
+          {
+            if (!strcmp(st->name, name))
+              {
+                sub->timers = eina_list_remove_list(sub->timers, l);
+                eina_stringshare_del(st->name);
+                ecore_timer_del(st->timer);
+                free(st);
+              }
+          }
+        }
+    }
+  // XXX: handle: dir-request
+  cmd_free(c);
+}
+
+static Eina_Bool
+_cb_sub_exe_del(void *data, int ev_type EINA_UNUSED, void *event)
+{
+  Sub                 *sub = data;
+  Ecore_Exe_Event_Del *ev  = event;
+
+  if (sub->exe != ev->exe) return ECORE_CALLBACK_PASS_ON;
+  // XXX: handle anything on sub del
+  _sub_del(sub);
+  return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_cb_sub_exe_data(void *data, int ev_type EINA_UNUSED, void *event)
+{
+  Sub                  *sub = data;
+  Ecore_Exe_Event_Data *ev  = event;
+  int                   i;
+
+  if (sub->exe != ev->exe) return ECORE_CALLBACK_PASS_ON;
+  for (i = 0; ev->lines[i].line; i++) _sub_command(sub, ev->lines[i].line);
+  return ECORE_CALLBACK_DONE;
+}
+
+static Sub *
+_sub_open(const char *path, const char *backend)
+{
+  Eina_Strbuf *buf;
+  const char  *s;
+  Sub         *sub = calloc(1, sizeof(Sub));
+
+  if (!sub) return NULL;
+  sub->path = eina_stringshare_add(path);
+  buf       = eina_strbuf_new();
+  s         = getenv("E_HOME_DIR");
+  if (s) eina_strbuf_append(buf, s);
+  else
+    {
+      s = getenv("HOME");
+      eina_strbuf_append(buf, s);
+      eina_strbuf_append(buf, "/.e/e");
+    }
+  eina_strbuf_append(buf, "/efm/backends/");
+  eina_strbuf_append(buf, backend);
+  eina_strbuf_append(buf, "/open");
+  if (!ecore_file_can_exec(eina_strbuf_string_get(buf)))
+    {
+      eina_strbuf_reset(buf);
+
+      eina_strbuf_append(buf, elm_app_lib_dir_get());
+      eina_strbuf_append(buf, "/efm/backends/");
+      eina_strbuf_append(buf, backend);
+      eina_strbuf_append(buf, "/open");
+    }
+  sub->handler_exe_del = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
+                                                 _cb_sub_exe_del, sub);
+  sub->handler_exe_data = ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
+                                                  _cb_sub_exe_data, sub);
+  sub->exe              = ecore_exe_pipe_run(eina_strbuf_string_get(buf),
+                                             ECORE_EXE_PIPE_READ |
+                                             ECORE_EXE_PIPE_READ_LINE_BUFFERED |
+                                             ECORE_EXE_PIPE_WRITE,
+                                             sub);
+  eina_strbuf_free(buf);
+  buf = cmd_strbuf_new("dir-set");
+  cmd_strbuf_append(buf, "path", path);
+  cmd_strbuf_exe_consume(buf, sub->exe);
+  sub_queue = eina_list_append(sub_queue, sub);
+  return sub;
+}
+
 static Eina_Bool _file_add_mod_info(Eina_Strbuf *strbuf, const char *path,
                                     Eina_Bool delay);
 
@@ -954,11 +1185,18 @@ _path_in_mon_dir(const char *path)
 static void
 _handle_drop_paste(const char *over, const char *action, const char *path)
 {
+  const char *mondir;
+
+  if (!mon) return;
+  mondir = ecore_file_monitor_path_get(mon);
+  if (!mondir) return;
   if (over)
     fprintf(stderr, "DROP over=[%s] action=""  >  [%s]\n", over, action, path);
   else 
     fprintf(stderr, "DROP action=""  >  [%s]\n", action, path);
   // XXX: decide what to do with file and tell frontend
+  // XXX: action = "" move, ask, list, link, description
+  // XXX: if over, then spin up backedn for that over dir and hand work to that
 }
 
 void
diff --git a/src/efm/efm_back_end.c b/src/efm/efm_back_end.c
index 56ec21a..31a26ed 100644
--- a/src/efm/efm_back_end.c
+++ b/src/efm/efm_back_end.c
@@ -447,7 +447,7 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
         CMD_DONE;
       }
     else if (!strcmp(c->command, "timer-add"))
-      { // *** must call before list-begin
+      {
         const char *name = cmd_key_find(c, "name");
         const char *delay = cmd_key_find(c, "delay");
         const char *repeat = cmd_key_find(c, "repeat");
@@ -469,7 +469,7 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
         CMD_DONE;
       }
     else if (!strcmp(c->command, "timer-del"))
-      { // *** must call before list-begin
+      {
         const char *name = cmd_key_find(c, "name");
         Smart_Data_Timer *st;
         Eina_List        *l;
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index cfb852b..78edbe8 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -30,8 +30,8 @@ struct _Smart_Data_Timer
   Eina_Bool         repeat : 1;
 };
 
-  // an icon view gui data
-  struct _Smart_Data
+// an icon view gui data
+struct _Smart_Data
 {
   Evas_Object_Smart_Clipped_Data __clipped_data;
 

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

Reply via email to