3 typedef struct _Config_Glob Config_Glob;
4 typedef struct _Config_Mime Config_Mime;
17 struct _E_Config_Dialog_Data
21 Evas_Object *deflist, *mimelist, *entry;
34 const char *browser_desktop;
35 const char *mailto_desktop;
36 const char *file_desktop;
37 const char *trash_desktop;
38 const char *terminal_desktop;
40 Ecore_Event_Handler *desk_change_handler;
44 /* local function prototypes */
45 static void *_create_data(E_Config_Dialog *cfd);
46 static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
47 static Evas_Object *_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
48 static int _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
50 static Eina_Bool _desks_update(void *data, int ev_type __UNUSED__, void *ev __UNUSED__);
51 static void _load_mimes(E_Config_Dialog_Data *cfdata, char *file);
52 static void _load_globs(E_Config_Dialog_Data *cfdata, char *file);
53 static int _sort_mimes(const void *data1, const void *data2);
54 static Config_Mime *_find_mime(E_Config_Dialog_Data *cfdata, char *mime);
55 static Config_Glob *_find_glob(Config_Mime *mime, char *glob);
56 static int _cb_desks_sort(const void *data1, const void *data2);
57 static void _fill_apps_list(E_Config_Dialog_Data *cfdata, Evas_Object *il, const char **desktop, int general);
60 e_int_config_defapps(E_Container *con, const char *params __UNUSED__)
63 E_Config_Dialog_View *v;
65 if (e_config_dialog_find("E", "applications/default_applications"))
68 v = E_NEW(E_Config_Dialog_View, 1);
69 v->create_cfdata = _create_data;
70 v->free_cfdata = _free_data;
71 v->basic.create_widgets = _basic_create;
72 v->basic.apply_cfdata = _basic_apply;
74 cfd = e_config_dialog_new(con, _("Default Applications"),
75 "E", "applications/default_applications",
76 "preferences-desktop-default-applications", 0, v, NULL);
81 _create_data(E_Config_Dialog *cfd __UNUSED__)
83 E_Config_Dialog_Data *cfdata;
84 Efreet_Ini *ini, *myini;
87 const char *key, *s, *homedir;
89 E_Config_Env_Var *evr;
91 cfdata = E_NEW(E_Config_Dialog_Data, 1);
92 if (!cfdata) return NULL;
94 cfdata->desk_change_handler = ecore_event_handler_add
95 (EFREET_EVENT_DESKTOP_CACHE_UPDATE, _desks_update, cfdata);
97 snprintf(buf, sizeof(buf), "%s/applications/defaults.list",
98 efreet_data_home_get());
99 myini = efreet_ini_new(buf);
103 if (!efreet_ini_section_set(myini, "Default Applications"))
105 efreet_ini_section_add(myini, "Default Applications");
106 efreet_ini_section_set(myini, "Default Applications");
108 EINA_LIST_FOREACH(efreet_data_dirs_get(), l, s)
110 snprintf(buf, sizeof(buf), "%s/applications/defaults.list", s);
111 ini = efreet_ini_new(buf);
113 (efreet_ini_section_set(ini, "Default Applications")) &&
115 (it = eina_hash_iterator_key_new(ini->section)))
117 EINA_ITERATOR_FOREACH(it, key)
119 if (!efreet_ini_string_get(myini, key))
121 s = efreet_ini_string_get(ini, key);
122 if (s) efreet_ini_string_set(myini, key, s);
125 eina_iterator_free(it);
127 if (ini) efreet_ini_free(ini);
129 s = efreet_ini_string_get(myini, "x-scheme-handler/http");
130 if (!s) s = efreet_ini_string_get(myini, "x-scheme-handler/https");
131 if (s) cfdata->browser_desktop = eina_stringshare_add(s);
132 s = efreet_ini_string_get(myini, "x-scheme-handler/mailto");
133 if (s) cfdata->mailto_desktop = eina_stringshare_add(s);
134 s = efreet_ini_string_get(myini, "x-scheme-handler/file");
135 if (s) cfdata->file_desktop = eina_stringshare_add(s);
136 s = efreet_ini_string_get(myini, "x-scheme-handler/trash");
137 if (s) cfdata->trash_desktop = eina_stringshare_add(s);
138 s = efreet_ini_string_get(myini, "x-scheme-handler/terminal");
139 if (s) cfdata->terminal_desktop = eina_stringshare_add(s);
142 EINA_LIST_FOREACH(e_config->env_vars, l, evr)
144 if (!strcmp(evr->var, "BROWSER"))
146 if ((evr->val) && (!evr->unset))
147 cfdata->browser_custom = strdup(evr->val);
152 homedir = e_user_homedir_get();
154 snprintf(buf, sizeof(buf), "/usr/local/etc/mime.types");
155 if (ecore_file_exists(buf)) _load_mimes(cfdata, buf);
156 snprintf(buf, sizeof(buf), "/etc/mime.types");
157 if (ecore_file_exists(buf)) _load_mimes(cfdata, buf);
159 EINA_LIST_FOREACH(efreet_config_dirs_get(), l, s)
161 snprintf(buf, sizeof(buf), "%s/mime/globs", s);
162 if (ecore_file_exists(buf)) _load_globs(cfdata, buf);
165 snprintf(buf, sizeof(buf), "%s/.mime.types", homedir);
166 if (ecore_file_exists(buf)) _load_mimes(cfdata, buf);
168 snprintf(buf, sizeof(buf), "%s/mime/globs", efreet_data_home_get());
169 if (ecore_file_exists(buf)) _load_globs(cfdata, buf);
171 cfdata->mimes = eina_list_sort(cfdata->mimes, 0, _sort_mimes);
176 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
179 Efreet_Desktop *desk;
181 if (cfdata->selmime) eina_stringshare_del(cfdata->selmime);
182 if (cfdata->selapp) eina_stringshare_del(cfdata->selapp);
183 free(cfdata->browser_custom);
184 if (cfdata->browser_desktop) eina_stringshare_del(cfdata->browser_desktop);
185 if (cfdata->mailto_desktop) eina_stringshare_del(cfdata->mailto_desktop);
186 if (cfdata->file_desktop) eina_stringshare_del(cfdata->file_desktop);
187 if (cfdata->trash_desktop) eina_stringshare_del(cfdata->trash_desktop);
188 if (cfdata->terminal_desktop) eina_stringshare_del(cfdata->terminal_desktop);
189 EINA_LIST_FREE(cfdata->mimes, m)
194 EINA_LIST_FREE(m->globs, g)
197 eina_stringshare_del(g->name);
200 eina_stringshare_del(m->mime);
203 if (cfdata->ini) efreet_ini_free(cfdata->ini);
204 EINA_LIST_FREE(cfdata->desks, desk)
205 efreet_desktop_free(desk);
206 if (cfdata->desk_change_handler)
207 ecore_event_handler_del(cfdata->desk_change_handler);
212 _desks_update(void *data, int ev_type __UNUSED__, void *ev __UNUSED__)
214 E_Config_Dialog_Data *cfdata = data;
215 Efreet_Desktop *desk;
216 EINA_LIST_FREE(cfdata->desks, desk)
217 efreet_desktop_free(desk);
219 _fill_apps_list(cfdata, cfdata->obj.deflist, &(cfdata->selapp), 1);
221 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
222 return ECORE_CALLBACK_PASS_ON;
226 _def_browser_cb(void *data)
228 E_Config_Dialog_Data *cfdata = data;
229 cfdata->seldest = &(cfdata->browser_desktop);
230 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
235 _def_mailto_cb(void *data)
237 E_Config_Dialog_Data *cfdata = data;
238 cfdata->seldest = &(cfdata->mailto_desktop);
239 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
244 _def_file_cb(void *data)
246 E_Config_Dialog_Data *cfdata = data;
247 cfdata->seldest = &(cfdata->file_desktop);
248 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
253 _def_trash_cb(void *data)
255 E_Config_Dialog_Data *cfdata = data;
256 cfdata->seldest = &(cfdata->trash_desktop);
257 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
262 _def_terminal_cb(void *data)
264 E_Config_Dialog_Data *cfdata = data;
265 cfdata->seldest = &(cfdata->terminal_desktop);
266 _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
271 _sel_mime_cb(void *data)
273 E_Config_Dialog_Data *cfdata = data;
274 if (cfdata->selapp) eina_stringshare_del(cfdata->selapp);
275 cfdata->selapp = NULL;
278 const char *s = efreet_ini_string_get(cfdata->ini, cfdata->selmime);
279 if (s) cfdata->selapp = eina_stringshare_add(s);
281 _fill_apps_list(cfdata, cfdata->obj.mimelist, &(cfdata->selapp), 1);
286 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
288 Evas_Object *otb, *ot, *ob, *of, *il;
292 otb = e_widget_toolbook_add(evas, 24, 24);
294 ot = e_widget_table_add(evas, EINA_FALSE);
296 ob = e_widget_label_add(evas, _("Custom Browser Command"));
297 e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 1, 0, 0);
299 ob = e_widget_entry_add(evas, &(cfdata->browser_custom), NULL, NULL, NULL);
300 cfdata->obj.entry = ob;
301 e_widget_table_object_append(ot, ob, 1, 0, 1, 1, 1, 1, 1, 0);
303 of = e_widget_framelist_add(evas, _("Default Applications"), 0);
304 il = e_widget_ilist_add(evas, 24, 24, NULL);
305 evas_event_freeze(evas);
307 e_widget_ilist_freeze(il);
308 e_widget_ilist_selector_set(il, 1);
309 e_widget_ilist_append(il, NULL, _("Browser"), _def_browser_cb, cfdata, NULL);
310 e_widget_ilist_append(il, NULL, _("E-Mail"), _def_mailto_cb, cfdata, NULL);
311 e_widget_ilist_append(il, NULL, _("File"), _def_file_cb, cfdata, NULL);
312 e_widget_ilist_append(il, NULL, _("Trash"), _def_trash_cb, cfdata, NULL);
313 e_widget_ilist_append(il, NULL, _("Terminal"), _def_terminal_cb, cfdata, NULL);
314 e_widget_ilist_go(il);
315 e_widget_ilist_thaw(il);
317 evas_event_thaw(evas);
318 e_widget_framelist_object_append_full(of, il, 1, 1, 1, 1, 0.5, 0.5, 120, 200, 9999, 9999);
319 e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 1, 0, 1);
321 of = e_widget_framelist_add(evas, _("Selected Application"), 0);
322 il = e_widget_ilist_add(evas, 24, 24, &(cfdata->selapp));
323 cfdata->obj.deflist = il;
324 e_widget_ilist_selector_set(il, 1);
325 e_widget_ilist_go(il);
326 e_widget_framelist_object_append_full(of, il, 1, 1, 1, 1, 0.5, 0.5, 120, 200, 9999, 9999);
327 e_widget_table_object_append(ot, of, 1, 1, 1, 1, 1, 1, 1, 1);
329 e_widget_toolbook_page_append(otb, NULL, _("Core"), ot,
330 1, 1, 1, 1, 0.5, 0.0);
332 ot = e_widget_table_add(evas, EINA_FALSE);
334 of = e_widget_framelist_add(evas, _("Types"), 0);
335 il = e_widget_ilist_add(evas, 24, 24, &(cfdata->selmime));
336 evas_event_freeze(evas);
338 e_widget_ilist_freeze(il);
339 e_widget_ilist_selector_set(il, 1);
340 EINA_LIST_FOREACH(cfdata->mimes, l, m)
341 e_widget_ilist_append(il, NULL, m->mime, _sel_mime_cb, cfdata, m->mime);
342 e_widget_ilist_go(il);
343 e_widget_ilist_thaw(il);
345 evas_event_thaw(evas);
346 e_widget_framelist_object_append_full(of, il, 1, 1, 1, 1, 0.5, 0.5, 120, 200, 9999, 9999);
347 e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1);
349 of = e_widget_framelist_add(evas, _("Selected Application"), 0);
350 il = e_widget_ilist_add(evas, 24, 24, &(cfdata->selapp));
351 cfdata->obj.mimelist = il;
352 e_widget_ilist_selector_set(il, 1);
353 e_widget_ilist_go(il);
354 e_widget_framelist_object_append_full(of, il, 1, 1, 1, 1, 0.5, 0.5, 120, 200, 9999, 9999);
355 e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 1);
357 e_widget_toolbook_page_append(otb, NULL, _("General"), ot,
358 1, 1, 1, 1, 0.5, 0.0);
360 e_widget_toolbook_page_show(otb, 0);
362 e_dialog_resizable_set(cfd->dia, 1);
363 e_win_centered_set(cfd->dia->win, 1);
368 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
371 E_Config_Env_Var *evr = NULL;
377 if ((cfdata->browser_desktop) && (cfdata->browser_desktop[0]))
379 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/http",
380 cfdata->browser_desktop);
381 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/https",
382 cfdata->browser_desktop);
384 if ((cfdata->mailto_desktop) && (cfdata->mailto_desktop[0]))
385 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/mailto",
386 cfdata->mailto_desktop);
387 if ((cfdata->file_desktop) && (cfdata->file_desktop[0]))
388 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/file",
389 cfdata->file_desktop);
390 if ((cfdata->trash_desktop) && (cfdata->trash_desktop[0]))
391 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/trash",
392 cfdata->trash_desktop);
393 if ((cfdata->terminal_desktop) && (cfdata->terminal_desktop[0]))
394 efreet_ini_string_set(cfdata->ini, "x-scheme-handler/terminal",
395 cfdata->terminal_desktop);
396 snprintf(buf, sizeof(buf), "%s/applications/defaults.list",
397 efreet_data_home_get());
398 efreet_ini_save(cfdata->ini, buf);
400 if ((cfdata->browser_custom) && (cfdata->browser_custom[0]))
402 EINA_LIST_FOREACH(e_config->env_vars, l, evr)
404 if (!strcmp(evr->var, "BROWSER")) break;
410 if (evr->val) eina_stringshare_del(evr->val);
414 evr = E_NEW(E_Config_Env_Var, 1);
417 evr->var = eina_stringshare_add("BROWSER");
419 e_config->env_vars = eina_list_append(e_config->env_vars, evr);
424 evr->val = eina_stringshare_add(cfdata->browser_custom);
425 e_env_set(evr->var, evr->val);
430 EINA_LIST_FOREACH(e_config->env_vars, l, evr)
432 if ((evr->var) && !(strcmp(evr->var, "BROWSER")))
434 e_config->env_vars = eina_list_remove_list(e_config->env_vars, l);
435 if (evr->val) eina_stringshare_del(evr->val);
436 if (evr->var) eina_stringshare_del(evr->var);
441 e_env_unset("BROWSER");
443 e_config_save_queue();
448 _load_mimes(E_Config_Dialog_Data *cfdata, char *file)
451 char buf[4096], mimetype[4096], ext[4096];
453 Config_Mime *config_mime;
454 Config_Glob *config_glob;
458 f = fopen(file, "rb");
460 while (fgets(buf, sizeof(buf), f))
463 while (isblank(*p) && (*p != 0) && (*p != '\n'))
465 if (*p == '#') continue;
466 if ((*p == '\n') || (*p == 0)) continue;
468 while (!isblank(*p) && (*p != 0) && (*p != '\n'))
470 if ((*p == '\n') || (*p == 0)) continue;
471 strncpy(mimetype, pp, (p - pp));
472 mimetype[p - pp] = 0;
475 while (isblank(*p) && (*p != 0) && (*p != '\n'))
477 if ((*p == '\n') || (*p == 0)) continue;
479 while (!isblank(*p) && (*p != 0) && (*p != '\n'))
481 strncpy(ext, pp, (p - pp));
483 config_mime = _find_mime(cfdata, mimetype);
486 config_mime = E_NEW(Config_Mime, 1);
489 config_mime->mime = eina_stringshare_add(mimetype);
490 if (!config_mime->mime)
494 config_glob = E_NEW(Config_Glob, 1);
495 config_glob->name = eina_stringshare_add(ext);
496 config_mime->globs = eina_list_append(config_mime->globs, config_glob);
497 cfdata->mimes = eina_list_append(cfdata->mimes, config_mime);
503 config_glob = _find_glob(config_mime, ext);
506 config_glob = E_NEW(Config_Glob, 1);
507 config_glob->name = eina_stringshare_add(ext);
508 config_mime->globs = eina_list_append(config_mime->globs, config_glob);
512 while ((*p != '\n') && (*p != 0));
518 _load_globs(E_Config_Dialog_Data *cfdata, char *file)
521 char buf[4096], mimetype[4096], ext[4096];
523 Config_Mime *config_mime;
524 Config_Glob *config_glob;
528 f = fopen(file, "rb");
530 while (fgets(buf, sizeof(buf), f))
533 while (isblank(*p) && (*p != 0) && (*p != '\n'))
535 if (*p == '#') continue;
536 if ((*p == '\n') || (*p == 0)) continue;
538 while ((*p != ':') && (*p != 0) && (*p != '\n'))
540 if ((*p == '\n') || (*p == 0)) continue;
541 strncpy(mimetype, pp, (p - pp));
542 mimetype[p - pp] = 0;
545 while ((*p != 0) && (*p != '\n'))
552 config_mime = _find_mime(cfdata, mimetype);
555 config_mime = E_NEW(Config_Mime, 1);
558 config_mime->mime = eina_stringshare_add(mimetype);
559 if (!config_mime->mime)
563 config_glob = E_NEW(Config_Glob, 1);
564 config_glob->name = eina_stringshare_add(ext);
565 config_mime->globs = eina_list_append(config_mime->globs, config_glob);
566 cfdata->mimes = eina_list_append(cfdata->mimes, config_mime);
572 config_glob = _find_glob(config_mime, ext);
575 config_glob = E_NEW(Config_Glob, 1);
576 config_glob->name = eina_stringshare_add(ext);
577 config_mime->globs = eina_list_append(config_mime->globs, config_glob);
585 _sort_mimes(const void *data1, const void *data2)
587 const Config_Mime *m1 = data1, *m2 = data2;
590 return strcmp(m1->mime, m2->mime);
594 _find_mime(E_Config_Dialog_Data *cfdata, char *mime)
599 if (!cfdata) return NULL;
600 EINA_LIST_FOREACH(cfdata->mimes, l, cm)
603 if (!strcmp(cm->mime, mime)) return cm;
609 _find_glob(Config_Mime *mime, char *globbing)
614 if (!mime) return NULL;
615 EINA_LIST_FOREACH(mime->globs, l, g)
618 if (strcmp(g->name, globbing)) continue;
625 _cb_desks_sort(const void *data1, const void *data2)
627 const Efreet_Desktop *d1, *d2;
629 if (!(d1 = data1)) return 1;
630 if (!d1->name) return 1;
631 if (!(d2 = data2)) return -1;
632 if (!d2->name) return -1;
633 return strcmp(d1->name, d2->name);
637 _sel_desk_gen_cb(void *data)
639 E_Config_Dialog_Data *cfdata = data;
640 const char *s = e_widget_ilist_selected_value_get(cfdata->obj.mimelist);
641 if ((s) && (cfdata->selmime))
644 efreet_ini_string_set(cfdata->ini, cfdata->selmime, s);
649 _sel_desk_cb(void *data)
651 E_Config_Dialog_Data *cfdata = data;
654 const char *s = e_widget_ilist_selected_value_get(cfdata->obj.deflist);
655 if (*(cfdata->seldest)) eina_stringshare_del(*(cfdata->seldest));
656 *(cfdata->seldest) = NULL;
657 if (s) *(cfdata->seldest) = eina_stringshare_add(s);
658 if ((*(cfdata->seldest)) &&
659 (cfdata->seldest == &(cfdata->browser_desktop)))
662 Efreet_Desktop *desk;
664 EINA_LIST_FOREACH(cfdata->desks, l, desk)
666 if ((!strcmp(desk->orig_path, *(cfdata->seldest))) ||
667 (!strcmp(ecore_file_file_get(desk->orig_path), *(cfdata->seldest))))
673 free(cfdata->browser_custom);
674 cfdata->browser_custom = strdup(desk->exec);
675 for (p = cfdata->browser_custom; *p; p++)
677 if (p > cfdata->browser_custom)
687 p = strdup(cfdata->browser_custom);
690 e_widget_entry_text_set(cfdata->obj.entry, p);
702 _fill_apps_list(E_Config_Dialog_Data *cfdata, Evas_Object *il, const char **desktop, int general)
704 Eina_List *desks = NULL, *l;
705 Efreet_Desktop *desk = NULL;
711 desks = efreet_util_desktop_name_glob_list("*");
712 EINA_LIST_FREE(desks, desk)
716 if (desk->no_display)
718 efreet_desktop_free(desk);
721 ll = eina_list_search_unsorted_list(cfdata->desks, _cb_desks_sort, desk);
726 old = eina_list_data_get(ll);
728 * This fixes when we have several .desktop with the same name,
729 * and the only difference is that some of them are for specific
732 if ((old->only_show_in) && (!desk->only_show_in))
734 efreet_desktop_free(old);
735 eina_list_data_set(ll, desk);
738 efreet_desktop_free(desk);
741 cfdata->desks = eina_list_append(cfdata->desks, desk);
743 cfdata->desks = eina_list_sort(cfdata->desks, -1, _cb_desks_sort);
746 evas = evas_object_evas_get(il);
747 evas_event_freeze(evas);
749 e_widget_ilist_freeze(il);
750 e_widget_ilist_clear(il);
754 EINA_LIST_FOREACH(cfdata->desks, l, desk)
756 Evas_Object *icon = NULL;
758 if ((desktop) && (*desktop))
760 if ((!strcmp(desk->orig_path, *desktop)) ||
761 (!strcmp(ecore_file_file_get(desk->orig_path), *desktop)))
765 icon = e_util_desktop_icon_add(desk, 24, evas);
767 e_widget_ilist_append(il, icon, desk->name,
768 _sel_desk_gen_cb, cfdata,
769 ecore_file_file_get(desk->orig_path));
771 e_widget_ilist_append(il, icon, desk->name,
772 _sel_desk_cb, cfdata,
773 ecore_file_file_get(desk->orig_path));
777 e_widget_ilist_go(il);
778 e_widget_ilist_thaw(il);
780 evas_event_thaw(evas);
783 e_widget_ilist_selected_set(il, sel);
784 e_widget_ilist_nth_show(il, sel, 0);