raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=6beec55b74aabbaa586a50e48297e356fef25895

commit 6beec55b74aabbaa586a50e48297e356fef25895
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Mar 29 00:43:58 2021 +0100

    mixer - add icon database for sink icons for mixer popup
    
    this will allow us to have specific icon for different sinks - eg a
    screeen for hdmi sinks etc. - need to build a "database" in
    sink-icons.txt over time. format is:
    
    glob|icons-name
    glob2|icon-name2
    ...
    
    where glob/glob2 are file globs to match the strng of a sink name and
    icon-name/icon-name2 are the naime of the icon in the elm icon theme
    for xdg/fdo standard icons or extended icon names we added in the elm
    theme. add more lines as needed. first match "wins" so put most
    specific matches at the front and least specific at the end.
---
 src/modules/mixer/e_mod_main.c   | 73 +++++++++++++++++++++++++++++++++++++---
 src/modules/mixer/meson.build    |  3 ++
 src/modules/mixer/sink-icons.txt |  6 ++++
 3 files changed, 78 insertions(+), 4 deletions(-)

diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c
index 24692c6e7..bdb2f44a9 100644
--- a/src/modules/mixer/e_mod_main.c
+++ b/src/modules/mixer/e_mod_main.c
@@ -64,6 +64,55 @@ struct _Instance
 static Context *mixer_context = NULL;
 static Eina_List *_handlers = NULL;
 
+static char *
+_sink_icon_find(const char *name)
+{
+   const char *dir;
+   char buf[PATH_MAX], *res = NULL, **strs, *glob, *icon;
+   FILE *f;
+   int i;
+   size_t len;
+
+   dir = e_module_dir_get(mixer_context->module);
+   if (!dir) return NULL;
+   snprintf(buf, sizeof(buf), "%s/sink-icons.txt", dir);
+   f = fopen(buf, "r");
+   if (!f) return NULL;
+   while (fgets(buf, sizeof(buf), f))
+     {
+        buf[sizeof(buf) - 1] = 0;
+        len = strlen(buf);
+        if (len > 0)
+          {
+             buf[len - 1] = 0;
+             strs = eina_str_split(buf, "|", 0);
+             if (strs)
+               {
+                  i = 0;
+                  for (glob = strs[i]; glob; i += 2)
+                    {
+                       icon = strs[i + 1];
+                       if (icon)
+                         {
+                            if (e_util_glob_case_match(name, glob))
+                              {
+                                 res = strdup(icon);
+                                 break;
+                              }
+                         }
+                       else break;
+                    }
+                  free(strs[0]);
+                  free(strs);
+               }
+             if (res) break;
+          }
+        else break;
+     }
+   fclose(f);
+   return res;
+}
+
 static void
 _mixer_popup_update(Instance *inst, int mute, int vol)
 {
@@ -196,8 +245,16 @@ _mixer_sinks_changed(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event E
              EINA_LIST_FOREACH((Eina_List *)emix_sinks_get(), ll, s)
                {
                   Elm_Object_Item *it;
-
-                  it = elm_list_item_append(inst->list, s->name, NULL, NULL,
+                  Evas_Object *ic;
+                  char *icname = NULL;
+
+                  if (s->name) icname = _sink_icon_find(s->name);
+                  if (!icname) icname = strdup("audio-volume");
+                  ic = elm_icon_add(e_comp->elm);
+                  evas_object_size_hint_min_set(ic, 20 * e_scale, 20 * 
e_scale);
+                  elm_icon_standard_set(ic, icname);
+                  free(icname);
+                  it = elm_list_item_append(inst->list, s->name, ic, NULL,
                                             _sink_selected_cb, s);
                   if (backend_sink_default_get() == s)
                     default_it = it;
@@ -214,7 +271,7 @@ _mixer_sinks_changed(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event E
 static void
 _popup_new(Instance *inst)
 {
-   Evas_Object *button, *list, *slider, *bx;
+   Evas_Object *button, *list, *slider, *bx, *ic;
    Emix_Sink *s;
    Eina_List *l;
    Elm_Object_Item *default_it = NULL;
@@ -230,8 +287,16 @@ _popup_new(Instance *inst)
    EINA_LIST_FOREACH((Eina_List *)emix_sinks_get(), l, s)
      {
         Elm_Object_Item *it;
+        char *icname = NULL;
+
+        if (s->name) icname = _sink_icon_find(s->name);
+        if (!icname) icname = strdup("audio-volume");
+        ic = elm_icon_add(e_comp->elm);
+        evas_object_size_hint_min_set(ic, 20 * e_scale, 20 * e_scale);
+        elm_icon_standard_set(ic, icname);
+        free(icname);
 
-        it = elm_list_item_append(inst->list, s->name, NULL, NULL, 
_sink_selected_cb, s);
+        it = elm_list_item_append(inst->list, s->name, ic, NULL, 
_sink_selected_cb, s);
         if (backend_sink_default_get() == s)
           default_it = it;
      }
diff --git a/src/modules/mixer/meson.build b/src/modules/mixer/meson.build
index 7a9fb2b6b..0c25546f6 100644
--- a/src/modules/mixer/meson.build
+++ b/src/modules/mixer/meson.build
@@ -55,4 +55,7 @@ if get_option(m) == true
              install_dir        : dir_bin,
              install            : true
             )
+  install_data(['sink-icons.txt'],
+                install_dir: _dir)
+
 endif
diff --git a/src/modules/mixer/sink-icons.txt b/src/modules/mixer/sink-icons.txt
new file mode 100644
index 000000000..028552044
--- /dev/null
+++ b/src/modules/mixer/sink-icons.txt
@@ -0,0 +1,6 @@
+Built-in Analog*|speaker-box
+Starship/Matisse HD Audio*|speaker-box
+Sound Blaster Play*|headphones
+*HD Audio*|speaker-box
+*HDMI*|video-display
+*|audio-volume

-- 


Reply via email to