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 355e27cdbc76b8b6b704c33264d4e6af6b79f6ed
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Thu Jul 13 21:01:36 2023 +0100
dnd - load metadata x,y .. on dnd in custom mode save
---
src/backends/default/meta.c | 69 +++++++++++++++++++++------------------------
src/backends/default/open.c | 7 +++++
src/efm/efm.c | 10 +++++--
src/efm/efm_back_end.c | 14 +++++++++
src/efm/efm_dnd.c | 42 +++++++++++++++++++++++++--
src/efm/efm_structs.h | 6 +++-
src/efm/efm_util.c | 44 ++++++++++++++++++++++++++++-
7 files changed, 149 insertions(+), 43 deletions(-)
diff --git a/src/backends/default/meta.c b/src/backends/default/meta.c
index bb2fcb1..dece8f4 100644
--- a/src/backends/default/meta.c
+++ b/src/backends/default/meta.c
@@ -127,9 +127,9 @@ _meta_file_write(Meta_File *mf)
f = fopen(meta_path, "w");
if (!f) goto err;
}
- fprintf(f, "[Desktop Entry]\n");
+ fprintf(f, "[Efm Meta]\n");
EINA_LIST_FOREACH(mf->list, l, m)
- fprintf(f, "X-Efm-%s=%s\n", m->meta, m->data);
+ fprintf(f, "%s=%s\n", m->meta, m->data);
fclose(f);
}
else // no meta keys - delete it
@@ -182,15 +182,12 @@ _cb_meta_desktop_x_foreach(const Eina_Hash *hash EINA_UNUSED, const void *key, v
Meta_File *mf = fdata;
Meta *m;
- if (!strncmp(key, "X-Efm-", 6))
- { // only care about X-Efm-something entries
- m = calloc(1, sizeof(Meta));
- if (m)
- {
- m->meta = eina_stringshare_add(key + 6);
- m->data = ""
- mf->list = eina_list_append(mf->list, m);
- }
+ m = calloc(1, sizeof(Meta));
+ if (m)
+ {
+ m->meta = eina_stringshare_add(key/* + 6*/);
+ m->data = ""
+ mf->list = eina_list_append(mf->list, m);
}
return EINA_TRUE;
}
@@ -202,25 +199,22 @@ _cb_meta_desktop_x_foreach_over(const Eina_Hash *hash EINA_UNUSED, const void *k
Meta *m;
Eina_List *l;
- if (!strncmp(key, "X-Efm-", 6))
- { // only care about X-Efm-something entries
- EINA_LIST_FOREACH(mf->list, l, m)
- { // find existing meta key and replace
- if (!strcmp(m->meta, key + 6))
- {
- eina_stringshare_replace(&(m->data), data);
- goto done;
- }
- }
- // not found - append meta
- m = calloc(1, sizeof(Meta));
- if (m)
+ EINA_LIST_FOREACH(mf->list, l, m)
+ { // find existing meta key and replace
+ if (!strcmp(m->meta, key/* + 6*/))
{
- m->meta = eina_stringshare_add(key + 6);
- m->data = ""
- mf->list = eina_list_append(mf->list, m);
+ eina_stringshare_replace(&(m->data), data);
+ goto done;
}
}
+ // not found - append meta
+ m = calloc(1, sizeof(Meta));
+ if (m)
+ {
+ m->meta = eina_stringshare_add(key/* + 6*/);
+ m->data = ""
+ mf->list = eina_list_append(mf->list, m);
+ }
done:
return EINA_TRUE;
}
@@ -229,7 +223,7 @@ static Meta_File *
_meta_file_find(const char *path)
{
Meta_File *mf;
- Efreet_Desktop *desktop;
+ Efreet_Ini *ini;
char *meta_path;
// find existing in memory meta file data and return that
@@ -246,11 +240,12 @@ _meta_file_find(const char *path)
meta_path = _meta_file_get(mf);
if (!meta_path) goto err;
- desktop = efreet_desktop_get(meta_path);
- if (desktop)
+ ini = efreet_ini_new(meta_path);
+ if (ini)
{
- eina_hash_foreach(desktop->x, _cb_meta_desktop_x_foreach, mf);
- efreet_desktop_free(desktop);
+ if ((ini->data) && (efreet_ini_section_set(ini, "Efm Meta")))
+ eina_hash_foreach(ini->section, _cb_meta_desktop_x_foreach, mf);
+ efreet_ini_free(ini);
}
free(meta_path);
@@ -258,15 +253,15 @@ _meta_file_find(const char *path)
meta_path = _meta_personal_overlay_file_get(mf);
if (meta_path)
{
- desktop = efreet_desktop_get(meta_path);
- if (desktop)
+ ini = efreet_ini_new(meta_path);
+ if (ini)
{
- eina_hash_foreach(desktop->x, _cb_meta_desktop_x_foreach_over, mf);
- efreet_desktop_free(desktop);
+ if ((ini->data) && (efreet_ini_section_set(ini, "Efm Meta")))
+ eina_hash_foreach(ini->section, _cb_meta_desktop_x_foreach_over, mf);
+ efreet_ini_free(ini);
}
free(meta_path);
}
-
// add to our hash db of meta files
eina_hash_add(_meta_hash, mf->path, mf);
diff --git a/src/backends/default/open.c b/src/backends/default/open.c
index 09c8e70..298cf2c 100644
--- a/src/backends/default/open.c
+++ b/src/backends/default/open.c
@@ -378,6 +378,7 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
const char *mime, *ext, *icon;
Efreet_Desktop *desktop;
Eina_Bool have_label = EINA_FALSE;
+ Eina_Stringshare *s;
// XXX: x & y pos @ wxh view
if (lstat(path, &st) != 0) return EINA_FALSE;
@@ -676,6 +677,12 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
cmd_strbuf_append(strbuf, "mtime", buf);
snprintf(buf, sizeof(buf), "%llu", (unsigned long long)st.st_ctime);
cmd_strbuf_append(strbuf, "ctime", buf);
+ s = meta_get(path, "xy");
+ if (s)
+ {
+ cmd_strbuf_append(strbuf, "xy", s);
+ eina_stringshare_del(s);
+ }
return EINA_TRUE;
}
diff --git a/src/efm/efm.c b/src/efm/efm.c
index 1a68cb6..cdbf8ad 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -23,6 +23,7 @@
int _log_dom = -1;
static Eina_List *_pending_exe_dels = NULL;
+static Eina_List *_efm_list = NULL;
static Evas_Smart *_smart = NULL;
static Evas_Smart_Class _sc = EVAS_SMART_CLASS_INIT_NULL;
static Evas_Smart_Class _sc_parent = EVAS_SMART_CLASS_INIT_NULL;
@@ -715,6 +716,7 @@ _smart_add(Evas_Object *obj)
(sd->o_clip, EVAS_CALLBACK_KEY_DOWN, -100, _cb_key_down, sd);
evas_object_event_callback_add
(sd->o_clip, EVAS_CALLBACK_FOCUS_OUT, _cb_focus_out, sd);
+ _efm_list = eina_list_prepend(_efm_list, obj);
}
static void
@@ -726,6 +728,7 @@ _smart_del(Evas_Object *obj)
int i;
ENTRY;
+ _efm_list = eina_list_remove(_efm_list, obj);
e = evas_object_evas_get(obj);
evas_event_callback_del_full(e, EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE,
_cb_canvas_resize, sd);
@@ -995,8 +998,11 @@ _relayout_icons_custom(Smart_Data *sd)
{
EINA_LIST_FOREACH(block->icons, il, icon)
{ // icon is at urrent x,y
- icon->geom.x = rand() % 1000;
- icon->geom.y = rand() % 1000;
+ if (icon->geom.x == -9999)
+ {
+ icon->geom.x = rand() % 1000;
+ icon->geom.y = rand() % 1000;
+ }
icon->geom.w = sd->icon_min_w;
icon->geom.h = sd->icon_min_h;
x += icon->geom.w;
diff --git a/src/efm/efm_back_end.c b/src/efm/efm_back_end.c
index 5c281ee..992350c 100644
--- a/src/efm/efm_back_end.c
+++ b/src/efm/efm_back_end.c
@@ -340,6 +340,9 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
if (!icon) abort();
file_adds++;
+ // initial "invalid" xy for custom location - meta overrides
+ icon->geom.x = -9999;
+ icon->geom.y = -9999;
icon->sd = sd;
icon->cmd = c;
icon->changed = EINA_TRUE;
@@ -431,6 +434,17 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
eina_stringshare_replace((&icon->info.mime),
"inode/file");
+ s = cmd_key_find(c, "xy");
+ if (s)
+ {
+ int x, y;
+
+ if (sscanf(s, "%i,%i", &x, &y) == 2)
+ {
+ icon->geom.x = x;
+ icon->geom.y = y;
+ }
+ }
for ( ; il; il = il->next)
{
icon2 = il->data;
diff --git a/src/efm/efm_dnd.c b/src/efm/efm_dnd.c
index 18f343d..a251689 100644
--- a/src/efm/efm_dnd.c
+++ b/src/efm/efm_dnd.c
@@ -109,6 +109,8 @@ _cb_drop_pos(void *data, Evas_Object *o EINA_UNUSED, Evas_Coord x, Evas_Coord y,
sd->dnd_action = action;
evas_object_geometry_get(sd->o_smart, &fmx, &fmy, &fmw, &fmh);
evas_object_geometry_get(sd->o_scroller, &sx, &sy, &sw, &sh);
+ sd->dnd_x = x - fmx;
+ sd->dnd_y = y - fmy;
_dnd_scroll_handle(sd, x - sx, y - sy);
if (((x - sx) > 0) && ((y - sy) > 0) &&
((x - sx) < sw) && ((y - sy) < sh))
@@ -124,6 +126,8 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
{
Smart_Data *sd = data;
char **plist, **p, *esc, *tmp;
+ Eina_List *dropicons;
+ Icon *icon;
if (sd->drop_over) printf("XXX: DND DROP OVER [%s]\n", sd->drop_over->info.file);
else printf("XXX: DND DROP ...\n");
@@ -139,8 +143,41 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
esc = _escape_parse(*p);
if (!esc) continue;
printf("XXX: DROP FILE: [%s]\n", esc);
+ if (sd->config.view_mode == EFM_VIEW_MODE_ICONS_CUSTOM)
+ {
+ dropicons = _icons_path_find(esc);
+ EINA_LIST_FREE(dropicons, icon)
+ {
+ if (icon->selected)
+ {
+ if ((icon->sd == sd) && (icon->drag))
+ {
+ Eina_Strbuf *buf;
+ char str[PATH_MAX];
+
+ printf(" offset: [%i] - %i %i\n", icon->drag, icon->down_rel_x, icon->down_rel_y);
+ // XXX: fix position of all icons correctly based on dnd_x/y
+ icon->geom.x = icon->sd->dnd_x - icon->down_rel_x;
+ icon->geom.y = icon->sd->dnd_y - icon->down_rel_y;
+ buf = cmd_strbuf_new("meta-set");
+ // XXX: use strbuf for str
+ snprintf(str, sizeof(str), "%s/%s", icon->sd->path, icon->info.file);
+ cmd_strbuf_append(buf, "path", str);
+ snprintf(str, sizeof(str), "%i,%i", icon->geom.x, icon->geom.y);
+ cmd_strbuf_append(buf, "xy", str);
+ cmd_strbuf_exe_consume(buf, icon->sd->exe_open);
+ }
+ else
+ {
+ icon->geom.x = icon->sd->dnd_x;
+ icon->geom.y = icon->sd->dnd_y;
+ }
+ }
+ }
+ }
}
}
+ evas_object_smart_calculate(sd->o_smart);
free(*plist);
free(plist);
free(tmp);
@@ -199,8 +236,9 @@ found:
_icon_object_add(icon, icon->sd, e, theme_edj_file, EINA_FALSE, num);
o = icon->o_base;
evas_object_resize(o, icon->geom.w, icon->geom.h);
- if (xoff) *xoff = (icon->geom.x + icon->sd->geom.x);
- if (yoff) *yoff = (icon->geom.y + icon->sd->geom.y);
+ printf("DDD: %i , %i .... %i , %i\n", icon->down_x, icon->last_x, icon->down_y, icon->last_y);
+ if (xoff) *xoff = (icon->geom.x + icon->sd->geom.x) + (icon->last_x - icon->down_x);
+ if (yoff) *yoff = (icon->geom.y + icon->sd->geom.y) + (icon->last_y - icon->down_y);
if (xoff && yoff)
printf("DND: drag begin %p %p off: %i %i\n", obj, o, *xoff, *yoff);
else
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index 294bf38..2b8ab97 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -79,6 +79,8 @@ struct _Smart_Data
Ecore_Timer *dnd_scroll_timer;
Ecore_Timer *dnd_over_open_timer;
Elm_Xdnd_Action dnd_action;
+ Evas_Coord dnd_x;
+ Evas_Coord dnd_y;
unsigned long long file_max;
@@ -148,7 +150,8 @@ struct _Icon
Eina_List *block_list;
Ecore_Timer *longpress_timer;
File_Info info;
- Evas_Coord down_x, down_y;
+ Evas_Coord down_x, down_y, down_rel_x, down_rel_y;
+ Evas_Coord last_x, last_y;
Eina_Bool realized : 1;
Eina_Bool selected : 1;
Eina_Bool down : 1;
@@ -156,6 +159,7 @@ struct _Icon
Eina_Bool changed : 1;
Eina_Bool edje : 1;
Eina_Bool renaming : 1;
+ Eina_Bool drag : 1;
};
typedef struct _Pending_Exe_Del Pending_Exe_Del;
diff --git a/src/efm/efm_util.c b/src/efm/efm_util.c
index f746e40..5eda7ba 100644
--- a/src/efm/efm_util.c
+++ b/src/efm/efm_util.c
@@ -81,6 +81,38 @@ _scale_get(Smart_Data *sd)
return s1 * s2;
}
+static Eina_List *
+_icons_path_find(const char *path)
+{
+ Eina_List *l, *bl, *il;
+ Block *block;
+ Evas_Object *obj;
+ Eina_Strbuf *strbuf;
+ Icon *icon = NULL;
+ Eina_List *icons = NULL;
+
+ strbuf = eina_strbuf_new();
+ EINA_LIST_FOREACH(_efm_list, l, obj)
+ {
+ ENTRY icons;
+
+ EINA_LIST_FOREACH(sd->blocks, bl, block)
+ {
+ EINA_LIST_FOREACH(block->icons, il, icon)
+ {
+ eina_strbuf_reset(strbuf);
+ eina_strbuf_append(strbuf, sd->path);
+ eina_strbuf_append_char(strbuf, '/');
+ eina_strbuf_append(strbuf, icon->info.file);
+ if (!strcmp(path, eina_strbuf_string_get(strbuf)))
+ icons = eina_list_append(icons, icon);
+ }
+ }
+ }
+ eina_strbuf_free(strbuf);
+ return icons;
+}
+
static Eina_Bool
_selected_icons_uri_strbuf_append(Smart_Data *sd, Eina_Strbuf *strbuf)
{
@@ -654,6 +686,7 @@ _cb_icon_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE
{
Evas_Event_Mouse_Down *ev = event_info;
Icon *icon = data;
+ Evas_Coord x, y;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if ((icon->sd->rename_icon) && (icon->sd->rename_icon != icon))
@@ -675,6 +708,9 @@ _cb_icon_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE
{ // a click - not double-clicked. regular click
icon->down_x = ev->canvas.x;
icon->down_y = ev->canvas.y;
+ evas_object_geometry_get(icon->o_base, &x, &y, NULL, NULL);
+ icon->down_rel_x = icon->down_x - x;
+ icon->down_rel_y = icon->down_y - y;
if (!icon->info.thumb)
{
if (icon->edje)
@@ -900,6 +936,7 @@ _cb_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
}
else _icon_select_update(icon);
icon->sd->last_focused = icon;
+ icon->drag = EINA_FALSE;
}
else if (ev->button == 3)
{ // right mouse click
@@ -926,6 +963,8 @@ _icon_dup(Icon *icon)
icon2->down = icon->down;
icon2->edje = icon->edje;
icon2->info = icon->info;
+ icon2->last_x = icon->last_x;
+ icon2->last_y = icon->last_y;
#define DUPSTRSHARE(X) if (icon->info.X) icon2->info.X = eina_stringshare_add(icon->info.X)
DUPSTRSHARE(file);
DUPSTRSHARE(label);
@@ -952,7 +991,6 @@ _cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE
Eina_Bool dragged = EINA_FALSE;
if (!icon->down) return;
- // XXX: kill longpress timer
dx = ev->cur.canvas.x - icon->down_x;
dy = ev->cur.canvas.y - icon->down_y;
if (((dx * dx) + (dy * dy)) > (5 * 5)) dragged = EINA_TRUE;
@@ -974,6 +1012,10 @@ _cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE
icon->down = EINA_FALSE;
_icon_select_update(icon);
if (icon->renaming) return;
+ printf("DDD: drag!!!!\n");
+ icon->last_x = ev->cur.canvas.x;
+ icon->last_y = ev->cur.canvas.y;
+ icon->drag = EINA_TRUE;
_drag_start(icon);
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.