diff --git a/src/bin/e_int_config_mime.c b/src/bin/e_int_config_mime.c index 013c9d9d3..2923f41e0 100644 --- a/src/bin/e_int_config_mime.c +++ b/src/bin/e_int_config_mime.c @@ -1,29 +1,47 @@ #include "e.h" -static void *_create_data (E_Config_Dialog *cfd); -static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); -static void _fill_list (E_Config_Dialog_Data *cfdata); -static void _cb_add (void *data, void *data2); -static void _cb_del (void *data, void *data2); -static void _cb_config (void *data, void *data2); -static void _list_cb_sel (void *data); - -static void _cb_confirm_yes (void *data); -static void _cb_confirm_destroy (void *data); -static void _cb_entry_ok (char *text, void *data); - +typedef struct _Config_Glob Config_Glob; +typedef struct _Config_Mime Config_Mime; +typedef struct _Config_Type Config_Type; +struct _Config_Glob +{ + const char *name; +}; +struct _Config_Mime +{ + const char *mime; + Evas_List *globs; +}; +struct _Config_Type +{ + const char *name; + const char *type; +}; struct _E_Config_Dialog_Data { Evas_List *mimes; - const char *sel_mt; + char *cur_type; struct { - Evas_Object *list; - Evas_Object *add, *del, *config; + Evas_Object *tlist, *list; } gui; }; +static void *_create_data (E_Config_Dialog *cfd); +static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void _fill_list (E_Config_Dialog_Data *cfdata, char *mtype); +static void _fill_tlist (E_Config_Dialog_Data *cfdata); +static void _load_mimes (E_Config_Dialog_Data *cfdata, char *file); +static void _fill_types (E_Config_Dialog_Data *cfdata); +static void _tlist_cb_change (void *data); +static int _sort_mimes (void *data1, void *data2); +static Config_Mime *_find_mime (E_Config_Dialog_Data *cfdata, char *mime); +static Config_Glob *_find_glob (Config_Mime *mime, char *glob); +static void _cb_config (void *data, void *data2); + +Evas_List *types = NULL; + EAPI E_Config_Dialog * e_int_config_mime(E_Container *con) { @@ -45,34 +63,29 @@ e_int_config_mime(E_Container *con) static void _fill_data(E_Config_Dialog_Data *cfdata) { - Evas_List *l; + const char *homedir; + char buf[4096]; - while (cfdata->mimes) - { - E_Config_Mime_Icon *mi; - - mi = cfdata->mimes->data; - if (!mi) continue; - if (mi->mime) - evas_stringshare_del(mi->mime); - if (mi->icon) - evas_stringshare_del(mi->icon); - E_FREE(mi); - - cfdata->mimes = evas_list_remove_list(cfdata->mimes, cfdata->mimes); - } + if (!cfdata) return; + homedir = e_user_homedir_get(); + + snprintf(buf, sizeof(buf), "/usr/local/share/mime/globs"); + if (ecore_file_exists(buf)) + _load_mimes(cfdata, buf); + + snprintf(buf, sizeof(buf), "/usr/share/mime/globs"); + if (ecore_file_exists(buf)) + _load_mimes(cfdata, buf); + + snprintf(buf, sizeof(buf), "%s/.local/share/mime/globs", homedir); + if (ecore_file_exists(buf)) + _load_mimes(cfdata, buf); + + if (cfdata->mimes) + cfdata->mimes = evas_list_sort(cfdata->mimes, + evas_list_count(cfdata->mimes), _sort_mimes); - for (l = e_config->mime_icons; l; l = l->next) - { - E_Config_Mime_Icon *mi, *mi2; - - mi = l->data; - if (!mi) continue; - mi2 = E_NEW(E_Config_Mime_Icon, 1); - mi2->mime = evas_stringshare_add(mi->mime); - mi2->icon = evas_stringshare_add(mi->icon); - cfdata->mimes = evas_list_append(cfdata->mimes, mi2); - } + _fill_types(cfdata); } static void * @@ -88,19 +101,42 @@ _create_data(E_Config_Dialog *cfd) static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + while (types) + { + Config_Type *t; + + t = types->data; + if (!t) continue; + if (t->name) + evas_stringshare_del(t->name); + if (t->type) + evas_stringshare_del(t->type); + types = evas_list_remove_list(types, types); + E_FREE(t); + } + while (cfdata->mimes) { - E_Config_Mime_Icon *mi; + Config_Mime *m; - mi = cfdata->mimes->data; - if (!mi) continue; - if (mi->mime) - evas_stringshare_del(mi->mime); - if (mi->icon) - evas_stringshare_del(mi->icon); - E_FREE(mi); + m = cfdata->mimes->data; + if (!m) continue; + while (m->globs) + { + Config_Glob *g; + + g = m->globs->data; + if (!g) continue; + if (g->name) + evas_stringshare_del(g->name); + m->globs = evas_list_remove_list(m->globs, m->globs); + E_FREE(g); + } + if (m->mime) + evas_stringshare_del(m->mime); cfdata->mimes = evas_list_remove_list(cfdata->mimes, cfdata->mimes); + E_FREE(m); } E_FREE(cfdata); @@ -113,69 +149,63 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) Evas_Object *ot, *ob; o = e_widget_list_add(evas, 0, 1); - of = e_widget_framelist_add(evas, _("Mime Types"), 0); - ol = e_widget_ilist_add(evas, 16, 16, NULL); - cfdata->gui.list = ol; - _fill_list(cfdata); + of = e_widget_framelist_add(evas, _("Categories"), 0); + ol = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_type)); + cfdata->gui.tlist = ol; + _fill_tlist(cfdata); e_widget_framelist_object_append(of, ol); e_widget_list_object_append(o, of, 1, 1, 0.5); - - ot = e_widget_table_add(evas, 0); - ob = e_widget_button_add(evas, _("Add"), "widget/add", _cb_add, cfdata, NULL); - cfdata->gui.add = ob; - e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 1, 1, 0); - ob = e_widget_button_add(evas, _("Delete"), "widget/del", _cb_del, cfdata, NULL); - cfdata->gui.del = ob; - e_widget_table_object_append(ot, ob, 0, 1, 1, 1, 1, 1, 1, 0); + + of = e_widget_frametable_add(evas, _("Mime Types"), 0); + ol = e_widget_ilist_add(evas, 16, 16, NULL); + cfdata->gui.list = ol; + e_widget_ilist_go(ol); + e_widget_min_size_set(cfdata->gui.list, 250, 200); + e_widget_frametable_object_append(of, ol, 0, 0, 3, 1, 1, 1, 1, 0); + ob = e_widget_button_add(evas, _("Configure"), "widget/config", _cb_config, cfdata, NULL); - cfdata->gui.config = ob; - e_widget_table_object_append(ot, ob, 0, 2, 1, 1, 1, 1, 1, 0); - - e_widget_disabled_set(cfdata->gui.del, 1); - e_widget_disabled_set(cfdata->gui.config, 1); - - e_widget_list_object_append(o, ot, 1, 1, 0.0); + e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 0); + e_widget_list_object_append(o, of, 1, 1, 0.5); + return o; } static void -_fill_list(E_Config_Dialog_Data *cfdata) +_fill_list(E_Config_Dialog_Data *cfdata, char *mtype) { Evas_List *l; Evas_Coord w, h; - char buf[4096]; - + e_widget_ilist_clear(cfdata->gui.list); for (l = cfdata->mimes; l; l = l->next) { - E_Config_Mime_Icon *mi; + Config_Mime *m; Evas_Object *icon; const char *tmp; - int is_edj = 0; + char buf[4096]; + int edj = 0; + + m = l->data; + if (!m) return; + if (!strcasestr(m->mime, mtype)) continue; - mi = l->data; - if (!mi) continue; - if (mi->icon) - if (!strcmp(mi->icon, "DESKTOP")) continue; - icon = edje_object_add(evas_object_evas_get(cfdata->gui.list)); - - tmp = e_fm_mime_icon_get(mi->mime); + tmp = e_fm_mime_icon_get(m->mime); if (!tmp) snprintf(buf, sizeof(buf), "e/icons/fileman/file"); - else if (!strcmp(tmp, "THUMB")) - snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", mi->mime); - else if (!strncmp(tmp, "e/icons/fileman/mime/", 21)) - snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", mi->mime); + else if (!strcmp(tmp, "THUMB")) + snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", m->mime); + else if (!strncmp(tmp, "e/icons/fileman/mime/", 21)) + snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", m->mime); else { char *p; p = strrchr(tmp, '.'); - if ((p) && (!strcmp(p, ".edj"))) - is_edj = 1; + if ((p) && (!strcmp(p, ".edj"))) + edj = 1; } - if (is_edj) + if (edj) { if (!e_theme_edje_object_set(icon, tmp, "icon")) e_theme_edje_object_set(icon, "base/theme/fileman", "e/icons/fileman/file"); @@ -185,144 +215,247 @@ _fill_list(E_Config_Dialog_Data *cfdata) if (!e_theme_edje_object_set(icon, "base/theme/fileman", buf)) e_theme_edje_object_set(icon, "base/theme/fileman", "e/icons/fileman/file"); } - e_widget_ilist_append(cfdata->gui.list, icon, mi->mime, _list_cb_sel, cfdata, NULL); + e_widget_ilist_append(cfdata->gui.list, icon, m->mime, NULL, NULL, NULL); } e_widget_ilist_go(cfdata->gui.list); e_widget_min_size_get(cfdata->gui.list, &w, &h); - e_widget_min_size_set(cfdata->gui.list, w, 250); + e_widget_min_size_set(cfdata->gui.list, w, 200); } -static void -_cb_add(void *data, void *data2) +static void +_fill_tlist(E_Config_Dialog_Data *cfdata) { - E_Config_Dialog_Data *cfdata; + Evas_List *l; + Evas_Coord w, h; + + e_widget_ilist_clear(cfdata->gui.tlist); + for (l = types; l; l = l->next) + { + Config_Type *tmp; + Evas_Object *icon; + char buf[4096]; + char *t; + + tmp = l->data; + if (!tmp) continue; + t = strdup(tmp->name); + t[0] = tolower(t[0]); + icon = edje_object_add(evas_object_evas_get(cfdata->gui.tlist)); + snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", t); + if (!e_theme_edje_object_set(icon, "base/theme/fileman", buf)) + e_theme_edje_object_set(icon, "base/theme/fileman", "e/icons/fileman/file"); + e_widget_ilist_append(cfdata->gui.tlist, icon, tmp->name, _tlist_cb_change, cfdata, tmp->type); + } - cfdata = data; + e_widget_ilist_go(cfdata->gui.tlist); + e_widget_min_size_get(cfdata->gui.tlist, &w, &h); + e_widget_min_size_set(cfdata->gui.tlist, w, 225); +} + +static void +_load_mimes(E_Config_Dialog_Data *cfdata, char *file) +{ + FILE *f; + char buf[4096], mimetype[4096], ext[4096]; + char *p, *pp; + Config_Mime *mime; + Config_Glob *glob; + if (!cfdata) return; - e_entry_dialog_show(_("Create new mime type"), "enlightenment/e", - _("Enter a name for this new mime type"), "", - NULL, NULL, _cb_entry_ok, NULL, cfdata); + f = fopen(file, "rb"); + if (!f) return; + while (fgets(buf, sizeof(buf), f)) + { + p = buf; + while (isblank(*p) && (*p != 0) && (*p != '\n')) p++; + if (*p == '#') continue; + if ((*p == '\n') || (*p == 0)) continue; + pp = p; + while ((*p != ':') && (*p != 0) && (*p != '\n')) p++; + if ((*p == '\n') || (*p == 0)) continue; + strncpy(mimetype, pp, (p - pp)); + mimetype[p - pp] = 0; + p++; + pp = ext; + while ((*p != 0) && (*p != '\n')) + { + *pp = *p; + pp++; + p++; + } + *pp = 0; + mime = _find_mime(cfdata, mimetype); + if (!mime) + { + mime = E_NEW(Config_Mime, 1); + if (mime) + { + mime->mime = evas_stringshare_add(mimetype); + if (!mime->mime) + free(mime); + else + { + glob = E_NEW(Config_Glob, 1); + glob->name = evas_stringshare_add(ext); + mime->globs = evas_list_append(mime->globs, glob); + cfdata->mimes = evas_list_append(cfdata->mimes, mime); + } + } + } + else + { + glob = _find_glob(mime, ext); + if (!glob) + { + glob = E_NEW(Config_Glob, 1); + glob->name = evas_stringshare_add(ext); + mime->globs = evas_list_append(mime->globs, glob); + } + } + } + fclose(f); } static void -_cb_del(void *data, void *data2) +_fill_types(E_Config_Dialog_Data *cfdata) +{ + Evas_List *l, *ll; + + for (l = cfdata->mimes; l; l = l->next) + { + Config_Type *tmp; + Config_Mime *m; + char *tok; + int found = 0; + + m = l->data; + if (!m) continue; + tok = strtok(strdup(m->mime), "/"); + if (!tok) continue; + for (ll = types; ll; ll = ll->next) + { + tmp = ll->data; + if (!tmp) continue; + + if (strcmp(tmp->type, tok) >= 0) + { + found = 1; + break; + } + } + if (!found) + { + tmp = E_NEW(Config_Type, 1); + tmp->type = evas_stringshare_add(tok); + tok[0] = toupper(tok[0]); + tmp->name = evas_stringshare_add(tok); + + types = evas_list_append(types, tmp); + } + } +} + +static void +_tlist_cb_change(void *data) { E_Config_Dialog_Data *cfdata; - char buf[4096]; - + Evas_List *l; + cfdata = data; if (!cfdata) return; - - snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".

" - "Are you sure you want to delete this mime type?"), cfdata->sel_mt); - e_confirm_dialog_show(_("Are you sure you want to delete this mime type?"), - "enlightenment/exit", buf, NULL, NULL, _cb_confirm_yes, - NULL, cfdata, NULL, _cb_confirm_destroy, NULL); + for (l = types; l; l = l->next) + { + Config_Type *t; + + t = l->data; + if (!t) continue; + if (strcasecmp(t->name, cfdata->cur_type)) continue; + _fill_list(cfdata, (char *)t->type); + break; + } } -static void +static int +_sort_mimes(void *data1, void *data2) +{ + Config_Mime *m1, *m2; + + if (!data1) return 1; + if (!data2) return -1; + + m1 = data1; + m2 = data2; + + return (strcmp((const char *)m1->mime, (const char *)m2->mime)); +} + +static Config_Mime * +_find_mime(E_Config_Dialog_Data *cfdata, char *mime) +{ + Evas_List *l; + + if (!cfdata) return NULL; + for (l = cfdata->mimes; l; l = l->next) + { + Config_Mime *cm; + + cm = l->data; + if (!cm) continue; + if (strcmp(cm->mime, mime)) continue; + return cm; + } + return NULL; +} + +static Config_Glob * +_find_glob(Config_Mime *mime, char *glob) +{ + Evas_List *l; + + if (!mime) return NULL; + for (l = mime->globs; l; l = l->next) + { + Config_Glob *g; + + g = l->data; + if (!g) continue; + if (strcmp(g->name, glob)) continue; + return g; + } + return NULL; +} + +static void _cb_config(void *data, void *data2) { - E_Config_Dialog_Data *cfdata; - E_Config_Mime_Icon *mi; Evas_List *l; + E_Config_Dialog_Data *cfdata; + E_Config_Mime_Icon *mi = NULL; + const char *m; int found = 0; cfdata = data; if (!cfdata) return; - if (!cfdata->sel_mt) return; - - for (l = cfdata->mimes; l; l = l->next) + m = e_widget_ilist_selected_label_get(cfdata->gui.list); + if (!m) return; + for (l = e_config->mime_icons; l; l = l->next) { mi = l->data; if (!mi) continue; - if (strcmp(mi->mime, cfdata->sel_mt)) continue; + if (strcmp(mi->mime, m)) continue; found = 1; break; } - if (!found) return; - e_int_config_mime_edit(mi); -} - -static void -_list_cb_sel(void *data) -{ - E_Config_Dialog_Data *cfdata; - - cfdata = data; - if (!cfdata) return; - - cfdata->sel_mt = e_widget_ilist_selected_label_get(cfdata->gui.list); - if (!cfdata->sel_mt) return; - - e_widget_disabled_set(cfdata->gui.del, 0); - e_widget_disabled_set(cfdata->gui.config, 0); -} - -static void -_cb_confirm_yes(void *data) -{ - E_Config_Dialog_Data *cfdata; - Evas_List *l; - - cfdata = data; - if (!cfdata) return; - if (!cfdata->sel_mt) return; - - for (l = e_config->mime_icons; l; l = l->next) + if (found) + e_int_config_mime_edit(mi); + else { - E_Config_Mime_Icon *mi; - - mi = l->data; - if (!mi) continue; - if (strcmp(mi->mime, cfdata->sel_mt)) continue; - if (mi->mime) evas_stringshare_del(mi->mime); - if (mi->icon) evas_stringshare_del(mi->icon); - e_config->mime_icons = evas_list_remove_list(e_config->mime_icons, l); - break; + mi = E_NEW(E_Config_Mime_Icon, 1); + mi->mime = evas_stringshare_add(m); + mi->icon = evas_stringshare_add("THUMB"); + e_config->mime_icons = evas_list_append(e_config->mime_icons, mi); + e_config_save_queue(); + e_int_config_mime_edit(mi); } - e_config_save_queue(); - e_fm_mime_icon_cache_flush(); - e_fm2_all_icons_update(); - - _fill_data(cfdata); - _fill_list(cfdata); -} - -static void -_cb_confirm_destroy(void *data) -{ - E_Config_Dialog_Data *cfdata; - - cfdata = data; - if (!cfdata) return; - _fill_list(cfdata); -} - -static void -_cb_entry_ok(char *text, void *data) -{ - E_Config_Dialog_Data *cfdata; - E_Config_Mime_Icon *mime; - char buf[4096]; - - cfdata = data; - if (!cfdata) return; - if (!text) return; - if (!strstr(text, "/")) return; - - snprintf(buf, sizeof(buf), "%s", text); - mime = E_NEW(E_Config_Mime_Icon, 1); - mime->mime = evas_stringshare_add(buf); -// snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", text); - mime->icon = evas_stringshare_add("THUMB"); - - e_config->mime_icons = evas_list_append(e_config->mime_icons, mime); - e_config_save_queue(); - e_fm_mime_icon_cache_flush(); - e_fm2_all_icons_update(); - - _fill_data(cfdata); - _fill_list(cfdata); } diff --git a/src/bin/e_int_config_mime_edit.c b/src/bin/e_int_config_mime_edit.c index 2b183b0cf..ead2f5d87 100644 --- a/src/bin/e_int_config_mime_edit.c +++ b/src/bin/e_int_config_mime_edit.c @@ -18,7 +18,8 @@ enum _Icon_Type { THUMB, THEME, - EDJ + EDJ, + DEFAULT }; struct _E_Config_Dialog_Data @@ -139,8 +140,10 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) e_widget_frametable_object_append(of, ob, 0, 1, 3, 1, 1, 1, 1, 1); ob = e_widget_radio_add(evas, _("Use Edje File"), 2, rg); evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); - e_widget_frametable_object_append(of, ob, 0, 2, 3, 1, 1, 1, 1, 1); - e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(of, ob, 0, 2, 3, 1, 1, 1, 1, 1); + ob = e_widget_radio_add(evas, _("Use Default"), 3, rg); + evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); + e_widget_frametable_object_append(of, ob, 0, 3, 3, 1, 1, 1, 1, 1); oi = e_widget_button_add(evas, "", NULL, _cb_icon_sel, cfdata, cfd); cfdata->gui.icon = oi; @@ -152,7 +155,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) } e_widget_min_size_set(oi, 48, 48); - e_widget_frametable_object_append(of, oi, 1, 3, 1, 1, 1, 1, 1, 1); + e_widget_frametable_object_append(of, oi, 1, 4, 1, 1, 1, 1, 1, 1); e_widget_list_object_append(o, of, 1, 1, 0.5); return o; @@ -186,6 +189,11 @@ _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) break; case EDJ: break; + case DEFAULT: + e_config->mime_icons = evas_list_remove(e_config->mime_icons, mime); + break; + default: + break; } break; } @@ -332,6 +340,7 @@ static void _cb_file_change(void *data) { E_Config_Dialog_Data *cfdata; + Evas_Object *icon; cfdata = data; if (!cfdata) return; @@ -340,7 +349,6 @@ _cb_file_change(void *data) { case EDJ: if (!strstr(cfdata->file, ".edj")) return; -// if (!edje_file_group_exists(cfdata->file, "")) return; default: return; break;