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 c3c8f6a316104200c10433dfbf108e0dd8284d8f
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Thu Aug 31 10:20:57 2023 +0100

    rationalize add and mod file cmds to share code and handle size changes right
---
 src/efm/efm_back_end.c | 232 ++++++++++++++++++++++---------------------------
 src/efm/efm_structs.h  |  31 +++----
 2 files changed, 121 insertions(+), 142 deletions(-)

diff --git a/src/efm/efm_back_end.c b/src/efm/efm_back_end.c
index 5c98af2..249a323 100644
--- a/src/efm/efm_back_end.c
+++ b/src/efm/efm_back_end.c
@@ -311,6 +311,78 @@ _icon_xy_wh_get(Smart_Data *sd, Icon *icon, Cmd *c)
      }
 }
 
+static void
+_max_size_recalc(Smart_Data *sd)
+{
+   Icon *icon;
+   Eina_List *l;
+
+   sd->file_max = 0;
+   EINA_LIST_FOREACH(sd->icons, l, icon)
+     {
+        if (icon->info.size > sd->file_max) sd->file_max = icon->info.size;
+     }
+}
+
+static void
+_icon_add_mod_props_get(Icon *icon, Cmd *c, const char *label)
+{
+   const char *s;
+   unsigned long long size;
+   Eina_Bool recalc = EINA_FALSE, queue = EINA_FALSE;
+
+   eina_stringshare_replace(&(icon->info.label), label);
+   s = cmd_key_find(c, "label-clicked");
+   if (!s) s = cmd_key_find(c, "link-label-clicked");
+   eina_stringshare_replace(&(icon->info.label_clicked), s);
+   s = cmd_key_find(c, "label-selected");
+   if (!s) s = cmd_key_find(c, "link-label-selected");
+   eina_stringshare_replace(&(icon->info.label_selected), s);
+   s = cmd_key_find(c, "mime");
+   if (s) eina_stringshare_replace(&(icon->info.mime), s);
+   if (s) printf("XXXXX   mime=%s\n", icon->info.mime);
+   s = cmd_key_find(c, "desktop-icon");
+   if (!s) s = cmd_key_find(c, "link-desktop-icon");
+   if (s) eina_stringshare_replace(&(icon->info.pre_lookup_icon), s);
+   s = cmd_key_find(c, "desktop-icon.lookup");
+   if (!s) s = cmd_key_find(c, "link-desktop-icon.lookup");
+   if (!s) s = cmd_key_find(c, "icon");
+   if ((s) && (s[0] == '/')) eina_stringshare_replace(&(icon->info.icon), s);
+   s = cmd_key_find(c, "link-desktop-icon-clicked");
+   if (!s) s = cmd_key_find(c, "desktop-icon-clicked");
+   if (s) eina_stringshare_replace(&(icon->info.icon_clicked), s);
+   s = cmd_key_find(c, "link-desktop-icon-selected");
+   if (!s) s = cmd_key_find(c, "desktop-icon-selected");
+   if (s) eina_stringshare_replace(&(icon->info.icon_selected), s);
+   s = cmd_key_find(c, "mime-icon");
+   if (s) eina_stringshare_replace(&(icon->info.mime_icon), s);
+   s = cmd_key_find(c, "thumb");
+   if (s) eina_stringshare_replace(&(icon->info.thumb), s);
+   s = cmd_key_find(c, "broken-link");
+   if ((s) && (!strcmp(s, "true"))) icon->info.broken = EINA_TRUE;
+   else icon->info.broken = EINA_FALSE;
+   s = cmd_key_find(c, "size");
+   if (s)
+     {
+        size = atoll(s);
+
+        if ((icon->info.size == icon->sd->file_max) && // icon already max size
+            (size < icon->sd->file_max)) // new size is now less
+          {
+             recalc = EINA_TRUE; // need to recalc what is max
+             queue = EINA_TRUE; // we need to also update all bars
+          }
+        icon->info.size = size;
+        if (size > icon->sd->file_max)
+          { // new size is bigger than prev max size
+             icon->sd->file_max = size;
+             queue = EINA_TRUE; // queue all size bar updates
+          }
+        if (recalc) _max_size_recalc(icon->sd);
+        if (queue) _size_bars_update_queue(icon->sd);
+     }
+}
+
 static void
 _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
 { // handle data from the view thread to the UI - this will be a batch of cmds
@@ -355,6 +427,8 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
              sd->listing_done_reblock = EINA_TRUE;
              CMD_DONE;
           }
+
+        // below commands all send a path for a specific file
         file = cmd_key_find(c, "path");
         printf("XXXXX [%s] [%s]\n", c->command, file);
         if (file)
@@ -393,42 +467,18 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
              icon->cmd = c;
              icon->changed = EINA_TRUE;
              icon->info.file = eina_stringshare_add(file);
-             eina_stringshare_replace(&(icon->info.label), label);
-             s = cmd_key_find(c, "label-clicked");
-             if (!s) s = cmd_key_find(c, "link-label-clicked");
-             eina_stringshare_replace(&(icon->info.label_clicked), s);
-             s = cmd_key_find(c, "label-selected");
-             if (!s) s = cmd_key_find(c, "link-label-selected");
-             eina_stringshare_replace(&(icon->info.label_selected), s);
-             s = cmd_key_find(c, "mime");
-             if (s) eina_stringshare_replace(&(icon->info.mime), s);
-             if (s) printf("XXXXX   mime=%s\n", icon->info.mime);
-             s = cmd_key_find(c, "desktop-icon");
-             if (!s) s = cmd_key_find(c, "link-desktop-icon");
-             if (s) eina_stringshare_replace(&(icon->info.pre_lookup_icon), s);
-             s = cmd_key_find(c, "desktop-icon.lookup");
-             if (!s) s = cmd_key_find(c, "link-desktop-icon.lookup");
-             if (!s) s = cmd_key_find(c, "icon");
-             if ((s) && (s[0] == '/')) eina_stringshare_replace(&(icon->info.icon), s);
-             s = cmd_key_find(c, "link-desktop-icon-clicked");
-             if (!s) s = cmd_key_find(c, "desktop-icon-clicked");
-             if (s) eina_stringshare_replace(&(icon->info.icon_clicked), s);
-             s = cmd_key_find(c, "link-desktop-icon-selected");
-             if (!s) s = cmd_key_find(c, "desktop-icon-selected");
-             if (s) eina_stringshare_replace(&(icon->info.icon_selected), s);
-             s = cmd_key_find(c, "mime-icon");
-             if (s) eina_stringshare_replace(&(icon->info.mime_icon), s);
-             s = cmd_key_find(c, "thumb");
-             if (s) eina_stringshare_replace(&(icon->info.thumb), s);
+
+             _icon_add_mod_props_get(icon, c, label);
+
+             // handle raw "stat" type and set mime accordingly if needed
+             // this can't change on a file - it'd have to be deleted and
+             // added again to do this.
              s = cmd_key_find(c, "type");
              if (s)
                {
                   if (!strcmp(s, "link"))
                     {
                        icon->info.link = EINA_TRUE;
-                       s = cmd_key_find(c, "broken-link");
-                       if ((s) && (!strcmp(s, "true")))
-                         icon->info.broken = EINA_TRUE;
                        s = cmd_key_find(c, "link-type");
                     }
                   if (s)
@@ -465,23 +515,13 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
                          }
                     }
                }
-             s = cmd_key_find(c, "size");
-             if (s)
-               {
-                  unsigned long long size = atoll(s);
-
-                  if (size > sd->file_max)
-                    {
-                       sd->file_max = size;
-                       _size_bars_update_queue(sd);
-                    }
-               }
              if (!icon->info.mime)
                eina_stringshare_replace((&icon->info.mime),
                                         "inode/file");
 
              _icon_xy_wh_get(sd, icon, c);
 
+             // insert the icon in the right place in the list
              for ( ; il; il = il->next)
                {
                   icon2 = il->data;
@@ -501,9 +541,7 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
                             unsigned long long size = atoll(s);
 
                             if (size == sd->file_max)
-                              {
-                                 _size_bars_max_update_queue(sd);
-                              }
+                              _size_bars_max_update_queue(sd);
                          }
                        _icon_free(icon2);
                        if (il) icon2 = il->data;
@@ -517,8 +555,25 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
                     }
                }
              if (!il)
+               sd->icons = eina_list_append(sd->icons, icon);
+          }
+        else if (!strcmp(c->command, "file-mod"))
+          {
+             for ( ; il; il = il->next)
                {
-                  sd->icons = eina_list_append(sd->icons, icon);
+                  icon = il->data;
+                  if (!strcmp(file, icon->info.file))
+                    {
+                       icon->changed = EINA_TRUE;
+
+                       _icon_add_mod_props_get(icon, c, label);
+
+                       _icon_xy_wh_get(sd, icon, c);
+
+                       cmd_free(icon->cmd);
+                       icon->cmd = c;
+                       break;
+                    }
                }
           }
         else if (!strcmp(c->command, "file-del"))
@@ -536,15 +591,10 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
                          {
                             // XXX: select prev or next icon
                          }
-                       s = cmd_key_find(icon->cmd, "size");
-                       if (s)
-                         {
-                            unsigned long long size = atoll(s);
-
-                            if (size == sd->file_max)
-                              {
-                                 _size_bars_max_update_queue(sd);
-                              }
+                       if (icon->info.size == icon->sd->file_max)
+                         { // this icon is at max size in dir
+                            _max_size_recalc(icon->sd); // find new max
+                            _size_bars_update_queue(icon->sd); // redo all bars
                          }
                        _icon_free(icon);
                        break;
@@ -553,78 +603,6 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
              cmd_free(c);
              c = NULL;
           }
-        else if (!strcmp(c->command, "file-mod"))
-          {
-             for ( ; il; il = il->next)
-               {
-                  icon = il->data;
-                  if (!strcmp(file, icon->info.file))
-                    {
-                       icon->changed = EINA_TRUE;
-                       eina_stringshare_replace(&(icon->info.label), label);
-                       s = cmd_key_find(c, "label-clicked");
-                       if (!s) s = cmd_key_find(c, "link-label-clicked");
-                       eina_stringshare_replace(&(icon->info.label_clicked), s);
-                       s = cmd_key_find(c, "label-selected");
-                       if (!s) s = cmd_key_find(c, "link-label-selected");
-                       eina_stringshare_replace(&(icon->info.label_selected), s);
-                       s = cmd_key_find(c, "mime");
-                       if (s) eina_stringshare_replace(&(icon->info.mime), s);
-                       if (!icon->info.mime)
-                         eina_stringshare_replace((&icon->info.mime),
-                                                  "inode/file");
-                       s = cmd_key_find(c, "desktop-icon");
-                       if (!s) s = cmd_key_find(c, "link-desktop-icon");
-                       if (s) eina_stringshare_replace(&(icon->info.pre_lookup_icon), s);
-                       s = cmd_key_find(c, "desktop-icon.lookup");
-                       if (!s) s = cmd_key_find(c, "link-desktop-icon.lookup");
-                       if (!s) s = cmd_key_find(c, "icon");
-                       if ((s) && (s[0] == '/')) eina_stringshare_replace(&(icon->info.icon), s);
-                       s = cmd_key_find(c, "link-desktop-icon-clicked");
-                       if (!s) s = cmd_key_find(c, "desktop-icon-clicked");
-                       if (s) eina_stringshare_replace(&(icon->info.icon_clicked), s);
-                       s = cmd_key_find(c, "link-desktop-icon-selected");
-                       if (!s) s = cmd_key_find(c, "desktop-icon-selected");
-                       if (s) eina_stringshare_replace(&(icon->info.icon_selected), s);
-                       s = cmd_key_find(c, "mime-icon");
-                       if (s) eina_stringshare_replace(&(icon->info.mime_icon), s);
-                       s = cmd_key_find(c, "thumb");
-                       if (s) eina_stringshare_replace(&(icon->info.thumb), s);
-                       s = cmd_key_find(c, "broken-link");
-                       if ((s) && (!strcmp(s, "true")))
-                         icon->info.broken = EINA_TRUE;
-                       else
-                         icon->info.broken = EINA_FALSE;
-                       s = cmd_key_find(icon->cmd, "size");
-                       if (s)
-                         {
-                            unsigned long long size = atoll(s);
-
-                            if (size == sd->file_max)
-                              {
-                                 _size_bars_max_update_queue(sd);
-                              }
-                         }
-                       s = cmd_key_find(c, "size");
-                       if (s)
-                         {
-                            unsigned long long size = atoll(s);
-
-                            if (size > sd->file_max)
-                              {
-                                 sd->file_max = size;
-                                 _size_bars_update_queue(sd);
-                              }
-                         }
-
-                       _icon_xy_wh_get(sd, icon, c);
-
-                       cmd_free(icon->cmd);
-                       icon->cmd = c;
-                       break;
-                    }
-               }
-          }
         cprev = c;
      }
    eina_list_free(batch);
@@ -635,7 +613,7 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
           {
              if (block->realized_num <= 0) continue;
              EINA_LIST_FOREACH(block->icons, il, icon)
-               { // unrealize the icon - we odd/event forces this
+               { // unrealize the icon - list odd/even forces this
                   if (!icon->realized) continue;
                   icon->realized = EINA_FALSE;
                   icon->block->realized_num--;
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index 75fe215..c671fcd 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -110,21 +110,22 @@ struct _Smart_Data
 // file info gagthered
 struct _File_Info
 {
-   const char *file;
-   const char *label;
-   const char *label_selected;
-   const char *label_clicked;
-   const char *mime;
-   const char *icon;
-   const char *icon_selected;
-   const char *icon_clicked;
-   const char *mime_icon;
-   const char *pre_lookup_icon;
-   const char *thumb;
-   Eina_Bool   dir : 1;
-   Eina_Bool   link : 1;
-   Eina_Bool   broken : 1;
-   Eina_Bool   special : 1;
+   const char         *file;
+   const char         *label;
+   const char         *label_selected;
+   const char         *label_clicked;
+   const char         *mime;
+   const char         *icon;
+   const char         *icon_selected;
+   const char         *icon_clicked;
+   const char         *mime_icon;
+   const char         *pre_lookup_icon;
+   const char         *thumb;
+   unsigned long long  size;
+   Eina_Bool           dir : 1;
+   Eina_Bool           link : 1;
+   Eina_Bool           broken : 1;
+   Eina_Bool           special : 1;
 };
 
 // a block of icons as a group

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

Reply via email to