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