From 6beec55b74aabbaa586a50e48297e356fef25895 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 29 Mar 2021 00:43:58 +0100 Subject: [PATCH] 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 | 71 ++++++++++++++++++++++++++++++-- src/modules/mixer/meson.build | 3 ++ src/modules/mixer/sink-icons.txt | 6 +++ 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/modules/mixer/sink-icons.txt 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; + Evas_Object *ic; + char *icname = NULL; - it = elm_list_item_append(inst->list, s->name, NULL, 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; - it = elm_list_item_append(inst->list, s->name, NULL, NULL, _sink_selected_cb, s); + 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; } 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