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 3de3fbbb2237916945422352d2f676b5a70d32e8
Author: Carsten Haitzler (Rasterman) <[email protected]>
AuthorDate: Tue Feb 17 13:15:05 2026 +0000

    implement custom meta fields for icons to override
---
 TODO.md                     |  1 -
 src/backends/default/open.c | 30 +++++++++++++++++++++++++++++-
 src/efm/efm_back_end.c      | 19 +++++++++++++++++++
 3 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/TODO.md b/TODO.md
index 1ab843c..c29596e 100644
--- a/TODO.md
+++ b/TODO.md
@@ -22,7 +22,6 @@
 * Filesystem info (df like with total available)
 * Remember scroll pos, view size/pos
 * Set window icon correctly for dir
-* Set custom icon per file
 * Special icons for special filenames/paths (~/Desktop, ~/Videos etc.)
 * Single click/select mode
 * Favorites view move (manual .order changes, cb's for selecting single click)
diff --git a/src/backends/default/open.c b/src/backends/default/open.c
index 33190d5..38b7097 100644
--- a/src/backends/default/open.c
+++ b/src/backends/default/open.c
@@ -729,6 +729,25 @@ _file_add_mod_meta_append(const char *path, const char *meta, const char *key,
   eina_stringshare_del(s);
 }
 
+static void
+_file_add_mod_meta_icon_append(const char *path, const char *meta,
+                               const char *key, struct stat *st,
+                               Eina_Strbuf *strbuf)
+{
+  Eina_Stringshare *s = meta_get(path, meta);
+  char             *resolved = NULL;
+
+  if (!s) return;
+  if ((s[0]) && (s[0] != '/')
+      && (resolved = _icon_resolve(path, s, st)))
+    {
+      cmd_strbuf_append(strbuf, key, resolved);
+      free(resolved);
+    }
+  else cmd_strbuf_append(strbuf, key, s);
+  eina_stringshare_del(s);
+}
+
 static void
 _cmd_typebuf_icon_send(const char *icon)
 {
@@ -1067,6 +1086,15 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
   // add extra meta keys that might be used for immediate icon/file display
   _file_add_mod_meta_append(path, "xy", "meta.xy", strbuf);
   _file_add_mod_meta_append(path, "wh", "meta.wh", strbuf);
+  _file_add_mod_meta_icon_append(path, "icon", "meta.icon", &st, strbuf);
+  _file_add_mod_meta_icon_append(path, "icon-selected", "meta.icon-selected",
+                                 &st, strbuf);
+  _file_add_mod_meta_icon_append(path, "icon-clicked", "meta.icon-clicked",
+                                 &st, strbuf);
+  _file_add_mod_meta_icon_append(path, "icon-over", "meta.icon-over", &st,
+                                 strbuf);
+  _file_add_mod_meta_icon_append(path, "icon-badge", "meta.icon-badge", &st,
+                                 strbuf);
   // get order index number if any
   order = _order_index_get(file);
   if (order > 0)
@@ -1948,4 +1976,4 @@ do_shutdown(void)
   efreet_shutdown();
   ecore_file_shutdown();
 }
-;
\ No newline at end of file
+;
diff --git a/src/efm/efm_back_end.c b/src/efm/efm_back_end.c
index bfd4e93..f28c02b 100644
--- a/src/efm/efm_back_end.c
+++ b/src/efm/efm_back_end.c
@@ -322,6 +322,15 @@ _icon_xy_wh_get(Smart_Data *sd, Icon *icon, Cmd *c)
     }
 }
 
+static void
+_icon_meta_override(Icon *icon, const char *value)
+{
+  if ((!value) || (!value[0])) return;
+  eina_stringshare_replace(&(icon->info.pre_lookup_icon), value);
+  if (value[0] == '/')
+    eina_stringshare_replace(&(icon->info.icon), value);
+}
+
 static void
 _max_size_recalc(Smart_Data *sd)
 {
@@ -375,6 +384,16 @@ _icon_add_mod_props_get(Icon *icon, Cmd *c, const char *label)
   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, "meta.icon");
+  if (s) _icon_meta_override(icon, s);
+  s = cmd_key_find(c, "meta.icon-clicked");
+  if (s) eina_stringshare_replace(&(icon->info.icon_clicked), s);
+  s = cmd_key_find(c, "meta.icon-selected");
+  if (s) eina_stringshare_replace(&(icon->info.icon_selected), s);
+  s = cmd_key_find(c, "meta.icon-over");
+  if (s) eina_stringshare_replace(&(icon->info.icon_over), s);
+  s = cmd_key_find(c, "meta.icon-badge");
+  if (s) eina_stringshare_replace(&(icon->info.icon_badge), s);
   s = cmd_key_find(c, "broken-link");
   if ((s) && (!strcmp(s, "true"))) icon->info.broken = EINA_TRUE;
   else icon->info.broken = EINA_FALSE;

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

Reply via email to