#include "private.h" #include #include "config.h" #include "termio.h" #include "options.h" #include "options_theme.h" #include "options_themepv.h" #include "utils.h" #include "main.h" static Evas_Object *op_themelist; static Eina_List *themes = NULL; typedef struct _Theme Theme; struct _Theme { Elm_Object_Item *item; const char *name; Evas_Object *term; }; static char * _cb_op_theme_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { Theme *t = data; char buf[4096], *p; eina_strlcpy(buf, t->name, sizeof(buf)); p = strrchr(buf, '.'); if (p) *p = 0; return strdup(buf); } static Evas_Object * _cb_op_theme_content_get(void *data, Evas_Object *obj, const char *part) { Theme *t = data; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *o; char buf[4096]; Config *config = termio_config_get(t->term); if (config) { snprintf(buf, sizeof(buf), "%s/themes/%s", elm_app_data_dir_get(), t->name); o = options_theme_preview_add(obj, config, buf, 128 * elm_config_scale_get(), 64 * elm_config_scale_get()); return o; } } return NULL; } static void _cb_op_theme_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { Theme *t = data; Config *config = termio_config_get(t->term); if ((config->theme) && (!strcmp(t->name, config->theme))) return; eina_stringshare_replace(&(config->theme), t->name); config_save(config, NULL); change_theme(termio_win_get(t->term), config); } static int _cb_op_theme_sort(const void *d1, const void *d2) { return strcasecmp(d1, d2); } void options_theme(Evas_Object *opbox, Evas_Object *term) { Evas_Object *o, *box, *fr; Elm_Genlist_Item_Class *it_class; Eina_List *files; char buf[4096], *file; Theme *t; Config *config = termio_config_get(term); options_theme_clear(); fr = o = elm_frame_add(opbox); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_text_set(o, "Theme"); elm_box_pack_end(opbox, o); evas_object_show(o); box = o = elm_box_add(opbox); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_horizontal_set(o, EINA_TRUE); elm_object_content_set(fr, o); evas_object_show(o); it_class = elm_genlist_item_class_new(); it_class->item_style = "end_icon"; it_class->func.text_get = _cb_op_theme_text_get; it_class->func.content_get = _cb_op_theme_content_get; op_themelist = o = elm_genlist_add(opbox); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_genlist_mode_set(o, ELM_LIST_COMPRESS); elm_genlist_homogeneous_set(o, EINA_TRUE); snprintf(buf, sizeof(buf), "%s/themes", elm_app_data_dir_get()); files = ecore_file_ls(buf); if (files) files = eina_list_sort(files, eina_list_count(files), _cb_op_theme_sort); EINA_LIST_FREE(files, file) { const char *ext = strchr(file, '.'); if ((config) && (file[0] != '.') && ((ext) && (!strcasecmp(".edj", ext)))) { t = calloc(1, sizeof(Theme)); t->name = eina_stringshare_add(file); t->term = term; t->item = elm_genlist_item_append(o, it_class, t, NULL, ELM_GENLIST_ITEM_NONE, _cb_op_theme_sel, t); if (t->item) { themes = eina_list_append(themes, t); if ((config->theme) && (!strcmp(config->theme, t->name))) elm_genlist_item_selected_set(t->item, EINA_TRUE); } else { eina_stringshare_del(t->name); free(t); } } free(file); } elm_genlist_item_class_free(it_class); elm_box_pack_end(box, o); evas_object_size_hint_weight_set(opbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(opbox, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(o); } void options_theme_clear(void) { Theme *t; op_themelist = NULL; EINA_LIST_FREE(themes, t) { eina_stringshare_del(t->name); free(t); } }