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.