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 5f6a92af17c06ffe1b36c6087cf8be9170306e2f
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Thu Apr 10 08:16:52 2025 +0100

    implement deletion - trash + unlink. both do the same right now
    
    for now trash unlinks. it needs to change to have a trash tool that
    uses the trashcan... ie uses efreet_trash_delete_uri() ... but that's
    for later
---
 src/backends/default/fs.c        |  14 ++--
 src/backends/default/meson.build |  13 +++
 src/backends/default/open.c      |  55 +++++++++++--
 src/backends/default/rm.c        | 168 +++++++++++++++++++++++++++++++++++++++
 src/efm/efm.c                    |   6 +-
 src/efm/efm_popup_menu.c         |  58 +++++++++-----
 src/efm/efm_util.c               |  42 +++++++++-
 src/efm/efm_util.h               |   2 +
 8 files changed, 321 insertions(+), 37 deletions(-)

diff --git a/src/backends/default/fs.c b/src/backends/default/fs.c
index 0aa89ae..a31db08 100644
--- a/src/backends/default/fs.c
+++ b/src/backends/default/fs.c
@@ -251,7 +251,7 @@ fs_cp_rm(const char *src, const char *dst, Eina_Bool report_err, Eina_Bool cp,
   const char    *op = "";
   int            ret;
 
-  if ((!src) || (!dst) || (strlen(src) < 1)) return EINA_FALSE;
+  if ((!src) || (strlen(src) < 1)) return EINA_FALSE;
 
   if (rm && cp) op = "Move";
   else if (!rm && cp) op = "Copy";
@@ -302,17 +302,19 @@ fs_cp_rm(const char *src, const char *dst, Eina_Bool report_err, Eina_Bool cp,
           {
             const char *fs = ecore_file_file_get(s);
 
-            if (buf)
+            if ((res) && (fs))
               {
-                if ((res) && (fs))
+                if (dst)
                   {
                     eina_strbuf_reset(buf);
                     eina_strbuf_append(buf, dst);
                     eina_strbuf_append(buf, "/");
                     eina_strbuf_append(buf, fs);
-                    if (!fs_cp_rm(s, eina_strbuf_string_get(buf), report_err,
-                                  cp, rm))
-                      res = EINA_FALSE;
+                  }
+                if (!fs_cp_rm(s, dst ? eina_strbuf_string_get(buf) : NULL,
+                              report_err, cp, rm))
+                  {
+                    if (report_err) res = EINA_FALSE;
                   }
               }
             eina_stringshare_del(s);
diff --git a/src/backends/default/meson.build b/src/backends/default/meson.build
index 53972f9..2d3db91 100644
--- a/src/backends/default/meson.build
+++ b/src/backends/default/meson.build
@@ -76,3 +76,16 @@ executable('ln', [
   dependencies: deps,
   install: true,
   install_dir: dir)
+executable('rm', [
+    '../../shared/sha.c',
+    '../../shared/esc.c',
+    '../../shared/util.c',
+    'fs.c',
+    'rm.c',
+    'meta.c',
+    'status.c'
+  ],
+  include_directories: inc,
+  dependencies: deps,
+  install: true,
+  install_dir: dir)
diff --git a/src/backends/default/open.c b/src/backends/default/open.c
index 492dcce..72e4531 100644
--- a/src/backends/default/open.c
+++ b/src/backends/default/open.c
@@ -1295,10 +1295,13 @@ _op_run(const char *op, Eina_List *files, const char *dst)
     str = escape(s);
     eina_strbuf_append(buf, str);
     free(str);
-    eina_strbuf_append(buf, "\ndst=");
-    str = escape(dst);
-    eina_strbuf_append(buf, str);
-    free(str);
+    if (dst)
+      {
+        eina_strbuf_append(buf, "\ndst=");
+        str = escape(dst);
+        eina_strbuf_append(buf, str);
+        free(str);
+      }
     eina_strbuf_append(buf, "\n");
   }
   eina_strbuf_append(buf, "end\n");
@@ -1460,9 +1463,10 @@ do_handle_cmd(Cmd *c)
             }
         }
       else
-        { // walk through all files and set a file-run back rto front end
+        { // walk through all files and send a file-run back to the front-end
           // this is an option to change this but policy in the default
-          // backend is to bounce it back to the front end to handle
+          // back-end is to bounce it back to the front end to handle
+          // other back-ends could handle the file-run themselves
           Eina_Strbuf *strbuf;
           Eina_List *l;
 
@@ -1510,6 +1514,45 @@ do_handle_cmd(Cmd *c)
   else if (!strcmp(c->command, "cnp-paste"))
     { // XXX: implement
     }
+  else if (!strcmp(c->command, "file-unlink"))
+    { // this is an explicit unlink - no trashing
+      Eina_List  *files = NULL;
+      const char *s;
+
+      KEY_WALK_BEGIN
+      {
+        if (!strcmp(key, "path"))
+          {
+            files = eina_list_append(files, eina_stringshare_add(data));
+          }
+      }
+      KEY_WALK_END
+      if (files)
+        {
+          _op_run("rm", files, NULL);
+          EINA_LIST_FREE(files, s) eina_stringshare_del(s);
+        }
+    }
+  else if (!strcmp(c->command, "file-trash"))
+    { // this is nice deletion - trashcan likely used
+      Eina_List  *files = NULL;
+      const char *s;
+
+      KEY_WALK_BEGIN
+      {
+        if (!strcmp(key, "path"))
+          {
+            files = eina_list_append(files, eina_stringshare_add(data));
+          }
+      }
+      KEY_WALK_END
+      if (files)
+        {
+          // XXX: implement trash, but for now use rm
+          _op_run("rm", files, NULL);
+          EINA_LIST_FREE(files, s) eina_stringshare_del(s);
+        }
+    }
   //   cmd_dump_sterr(c);
 }
 
diff --git a/src/backends/default/rm.c b/src/backends/default/rm.c
new file mode 100644
index 0000000..b88ca85
--- /dev/null
+++ b/src/backends/default/rm.c
@@ -0,0 +1,168 @@
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_File.h>
+#include <Efreet.h>
+#include <Efreet_Mime.h>
+#include <Eet.h>
+
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "meta.h"
+#include "status.h"
+#include "fs.h"
+#include "esc.h"
+#include "sha.h"
+
+static const char *config_dir = NULL;
+
+typedef struct _File_Set
+{
+  const char *src;
+} File_Set;
+
+static void
+mem_abort(void)
+{
+  fprintf(stderr, "Out of memory!\n");
+  abort();
+}
+
+static Eina_List *
+file_set_add(Eina_List *files, const char *src)
+{
+  File_Set *fs = calloc(1, sizeof(File_Set));
+  if (!fs) mem_abort();
+  fs->src = ""
+  if (!fs->src) mem_abort();
+  files = eina_list_append(files, fs);
+  return files;
+}
+
+int
+main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
+{ // rm [src]
+  const char  *fname, *home_dir;
+  Eina_Strbuf *buf   = NULL;
+  Eina_List   *files = NULL, *l;
+  File_Set    *fs;
+  size_t       sz;
+  char        *src = ""
+  char         sbuf[PATH_MAX + 256];
+  Eina_Bool    src_can_write;
+
+  eina_init();
+  eet_init();
+  ecore_init();
+  efreet_init();
+
+  for (;;)
+    { // read stdin of key=val\n ... or end\n
+      if (!fgets(sbuf, sizeof(sbuf), stdin)) break;
+      sz = strlen(sbuf);
+      if (sz < 1) break;                             // too small
+      if (sbuf[sz - 1] == '\n') sbuf[sz - 1] = '\0'; // remove \n if there
+      if (!strncmp(sbuf, "src="" 4))
+        {
+          if (src) free(src);
+          src = "" + 4);
+          if (src) files = file_set_add(files, src);
+          if (src) free(src);
+          src = ""
+        }
+      else if (!strcmp(sbuf, "end")) break;
+    }
+  if (src) free(src);
+  src = ""
+
+  config_dir = getenv("E_HOME_DIR");
+  home_dir   = getenv("HOME");
+  if (!home_dir) return 77; // no $HOME? definitely an error!
+  if (!config_dir)
+    {
+      snprintf(sbuf, sizeof(sbuf), "%s/.e/e", home_dir);
+      config_dir = eina_stringshare_add(sbuf);
+    }
+  meta_init(config_dir);
+
+  buf = eina_strbuf_new();
+  if (!buf) goto err;
+
+  // set up status files for the op
+  status_begin();
+  status_op("rm");
+
+  // build up a list of all files to cp and scan them to find how much
+  EINA_LIST_FOREACH(files, l, fs)
+  {
+    struct stat stsrc;
+
+    if (strlen(fs->src) < 1) goto err2;
+    if (lstat(fs->src, &stsrc) != 0) break;
+    else if (!fs_scan(fs->src)) goto err2;
+  }
+
+  EINA_LIST_FOREACH(files, l, fs)
+  {
+    fname = ecore_file_file_get(fs->src);
+    if (!fname) break;
+
+    // free up previous loop stuff
+    free(src);
+    src = ""
+
+    // src and src temp dir
+    src = ""
+    if (!src) mem_abort();
+
+    // can we modify the meta files in the src? (like cp/rm them?)
+    src_can_write = meta_path_can_write(src);
+
+    // rm the src file and any meta files
+    if (fs_cp_rm(src, NULL, EINA_FALSE, EINA_FALSE, EINA_TRUE))
+      { // it worked so deal with meta/thumbs
+        char *src_meta;
+
+        // thumbnail file for the base target file
+        if (src_can_write) src_meta = meta_path_find(src, "thumb.efm");
+        else src_meta = meta_path_user_find(src, "thumb.efm");
+        if (src_meta)
+          {
+            fs_cp_rm(src_meta, NULL, EINA_FALSE, EINA_FALSE, EINA_TRUE);
+          }
+        free(src_meta);
+
+        // meta file for the base target file
+        if (src_can_write) src_meta = meta_path_find(src, "meta.efm");
+        else src_meta = meta_path_user_find(src, "meta.efm");
+        if (src_meta)
+          {
+            fs_cp_rm(src_meta, NULL, EINA_FALSE, EINA_FALSE, EINA_TRUE);
+          }
+        free(src_meta);
+      }
+  }
+err2:
+  status_end();
+  // free up leftover strings from loop
+  free(src);
+
+err:
+  if (buf) eina_strbuf_free(buf);
+  EINA_LIST_FREE(files, fs)
+  {
+    eina_stringshare_del(fs->src);
+    free(fs);
+  }
+
+  meta_shutdown();
+
+  efreet_shutdown();
+  ecore_shutdown();
+  eet_shutdown();
+  eina_shutdown();
+  return 0;
+}
diff --git a/src/efm/efm.c b/src/efm/efm.c
index ee9db25..94c9edb 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -261,10 +261,10 @@ _cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
         {
           if (_selected_icons_uri_strbuf_append(sd, strbuf))
             {
-              Eina_Strbuf *buf = cmd_strbuf_new("file-delete");
+              Eina_Strbuf *buf = cmd_strbuf_new("file-trash");
 
-              _uri_list_cmd_strbuf_append(buf, "path",
-                                          eina_strbuf_string_get(strbuf));
+              _file_list_cmd_strbuf_append(buf, "path",
+                                           eina_strbuf_string_get(strbuf));
               cmd_strbuf_exe_consume(buf, sd->exe_open);
             }
           eina_strbuf_free(strbuf);
diff --git a/src/efm/efm_popup_menu.c b/src/efm/efm_popup_menu.c
index 5e9d735..1522b05 100644
--- a/src/efm/efm_popup_menu.c
+++ b/src/efm/efm_popup_menu.c
@@ -2,6 +2,7 @@
 #include "efm_private.h"
 #include "efm_structs.h"
 #include "efm_util.h"
+#include "eina_strbuf.h"
 #include "mimeapps.h"
 
 /* have this to put a full icon for a file in the menu - unused right now
@@ -71,8 +72,9 @@ typedef struct
 } Popup_Context;
 
 static void
-_cb_menu_file_done(void *data, void *data2 EINA_UNUSED, Evas_Object *efm EINA_UNUSED,
-                   const Efm_Menu *menu EINA_UNUSED)
+_cb_menu_file_done(void *data, void *data2 EINA_UNUSED,
+                   Evas_Object *efm        EINA_UNUSED,
+                   const Efm_Menu *menu    EINA_UNUSED)
 { // clean up popuop context data when menu is done
   Popup_Context  *ctx = data;
   Efreet_Desktop *d;
@@ -84,14 +86,15 @@ _cb_menu_file_done(void *data, void *data2 EINA_UNUSED, Evas_Object *efm EINA_UN
 }
 
 static void
-_cb_menu_item_open(void *data, void *data2, Evas_Object *efm EINA_UNUSED,
+_cb_menu_item_open(void *data, void *data2,
+                   Evas_Object *efm               EINA_UNUSED,
                    const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context  *ctx = data;
   Efreet_Desktop *d   = data2;
   Eina_Strbuf    *strbuf;
 
-  printf("open\n");
+  printf("XXX: open\n");
   if (!d)
     {
       // XXX: if d == NULL then _cb_menu_item_open_all()
@@ -111,7 +114,7 @@ _cb_menu_item_open(void *data, void *data2, Evas_Object *efm EINA_UNUSED,
         }
       if (_selected_icons_uri_strbuf_append(ctx->sd, strbuf))
         {
-          _uri_list_cmd_strbuf_append(buf, "path",
+                    _uri_list_cmd_strbuf_append(buf, "path",
                                       eina_strbuf_string_get(strbuf));
         }
       cmd_strbuf_exe_consume(buf, ctx->sd->exe_open);
@@ -120,8 +123,8 @@ _cb_menu_item_open(void *data, void *data2, Evas_Object *efm EINA_UNUSED,
 }
 
 static void
-_cb_menu_item_open_all(void *data, void *data2 EINA_UNUSED,
-                       Evas_Object *efm EINA_UNUSED,
+_cb_menu_item_open_all(void *data, void *data2        EINA_UNUSED,
+                       Evas_Object *efm               EINA_UNUSED,
                        const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context *ctx = data;
@@ -129,8 +132,8 @@ _cb_menu_item_open_all(void *data, void *data2 EINA_UNUSED,
 }
 
 static void
-_cb_menu_item_rename(void *data, void *data2 EINA_UNUSED,
-                     Evas_Object *efm EINA_UNUSED,
+_cb_menu_item_rename(void *data, void *data2        EINA_UNUSED,
+                     Evas_Object *efm               EINA_UNUSED,
                      const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context *ctx = data;
@@ -163,11 +166,28 @@ _cb_menu_item_paste(void *data, void *data2, Evas_Object *efm,
 }
 
 static void
-_cb_menu_item_delete(void *data, void *data2, Evas_Object *efm,
-                     const Efm_Menu_Item *menu_item)
+_cb_menu_item_delete(void *data, void *data2        EINA_UNUSED,
+                     Evas_Object *efm               EINA_UNUSED,
+                     const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
-  Popup_Context *ctx = data;
+  Popup_Context  *ctx = data;
+  Eina_Strbuf    *strbuf;
+
   printf("XXX: delete\n");
+  // ask backed to file-unlink
+  strbuf = eina_strbuf_new();
+  if (strbuf)
+    {
+      Eina_Strbuf *buf = cmd_strbuf_new("file-trash");
+
+      if (_selected_icons_uri_strbuf_append(ctx->sd, strbuf))
+        {
+          _file_list_cmd_strbuf_append(buf, "path",
+                                       eina_strbuf_string_get(strbuf));
+        }
+      cmd_strbuf_exe_consume(buf, ctx->sd->exe_open);
+      eina_strbuf_free(strbuf);
+    }
 }
 
 static void
@@ -179,8 +199,8 @@ _cb_menu_item_props(void *data, void *data2, Evas_Object *efm,
 }
 
 static void
-_cb_menu_item_sel_all(void *data, void *data2 EINA_UNUSED,
-                      Evas_Object *efm EINA_UNUSED,
+_cb_menu_item_sel_all(void *data, void *data2        EINA_UNUSED,
+                      Evas_Object *efm               EINA_UNUSED,
                       const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context *ctx = data;
@@ -189,8 +209,8 @@ _cb_menu_item_sel_all(void *data, void *data2 EINA_UNUSED,
 }
 
 static void
-_cb_menu_item_sel_none(void *data, void *data2 EINA_UNUSED,
-                       Evas_Object *efm EINA_UNUSED,
+_cb_menu_item_sel_none(void *data, void *data2        EINA_UNUSED,
+                       Evas_Object *efm               EINA_UNUSED,
                        const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context *ctx = data;
@@ -208,7 +228,7 @@ _cb_job_refresh(void *data)
 }
 
 static void
-_cb_menu_item_refresh(void *data, void *data2 EINA_UNUSED,
+_cb_menu_item_refresh(void *data, void *data2        EINA_UNUSED,
                       Evas_Object *efm               EINA_UNUSED,
                       const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
@@ -236,7 +256,7 @@ _cb_job_close(void *data)
 }
 
 static void
-_cb_menu_item_close(void *data, void *data2 EINA_UNUSED,
+_cb_menu_item_close(void *data, void *data2        EINA_UNUSED,
                     Evas_Object *efm               EINA_UNUSED,
                     const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
@@ -410,4 +430,4 @@ _efm_popup_main_menu_add(Smart_Data *sd, Evas_Coord x, Evas_Coord y)
   //  const char  *icstr = _icon_strbuf_icon_def(ic, icbuf);
   //  _efm_menu_it_normal(m2, ic->info.label, icstr, _cb_ic_item5, ic, NULL);
   //  eina_strbuf_free(icbuf);
-}
\ No newline at end of file
+}
diff --git a/src/efm/efm_util.c b/src/efm/efm_util.c
index 6c0858b..104cd2a 100644
--- a/src/efm/efm_util.c
+++ b/src/efm/efm_util.c
@@ -827,7 +827,7 @@ void
 _uri_list_cmd_strbuf_append(Eina_Strbuf *strbuf, const char *key,
                             const char *urilist)
 {
-  char  *tmps = strdup(urilist), *se, *s2, *s;
+  char  *tmps = strdup(urilist), *se, *s2, *s, *stmp;
   size_t len;
 
   if (!tmps) return;
@@ -841,8 +841,44 @@ _uri_list_cmd_strbuf_append(Eina_Strbuf *strbuf, const char *key,
           s2  = NULL;
         }
       else s2 = se + 1;
-      *se = '\0';
-      cmd_strbuf_append(strbuf, key, s);
+      *se  = '\0';
+      stmp = _escape_parse(s);
+      if (stmp) cmd_strbuf_append(strbuf, key, stmp);
+      free(stmp);
+      if (!s2) break;
+    }
+  free(tmps);
+}
+
+void
+_file_list_cmd_strbuf_append(Eina_Strbuf *strbuf, const char *key,
+                             const char *urilist)
+{
+  char  *tmps = strdup(urilist), *se, *s2, *s, *stmp;
+  size_t len;
+
+  if (!tmps) return;
+  for (s = tmps; *s; s = s2)
+    {
+      se = strchr(s, '\n');
+      if (!se)
+        {
+          len = strlen(s);
+          se  = s + len;
+          s2  = NULL;
+        }
+      else s2 = se + 1;
+      *se  = '\0';
+      stmp = _escape_parse(s);
+      if (stmp)
+        {
+          if (!strncmp(stmp, "file://", 7))
+            cmd_strbuf_append(strbuf, key, stmp + 7);
+          else if (!strncmp(stmp, "file:/", 6))
+            cmd_strbuf_append(strbuf, key, stmp + 6);
+          else cmd_strbuf_append(strbuf, key, stmp);
+        }
+      free(stmp);
       if (!s2) break;
     }
   free(tmps);
diff --git a/src/efm/efm_util.h b/src/efm/efm_util.h
index 0caf3c7..d7b4705 100644
--- a/src/efm/efm_util.h
+++ b/src/efm/efm_util.h
@@ -30,6 +30,8 @@ void           _icon_path_cmd_strbuf_append(Eina_Strbuf *strbuf,
                                             Smart_Data *sd, Icon *icon);
 void           _uri_list_cmd_strbuf_append(Eina_Strbuf *strbuf, const char *key,
                                            const char *urilist);
+void           _file_list_cmd_strbuf_append(Eina_Strbuf *strbuf, const char *key,
+                                            const char *urilist);
 void           _icon_over_off(Icon *icon);
 void           _icon_over_on(Icon *icon);
 void           _icon_select(Icon *icon);

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

Reply via email to