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.

Reply via email to