Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / conf_applications / e_int_config_defapps.c
1 #include "e.h"
2
3 typedef struct _Config_Glob Config_Glob;
4 typedef struct _Config_Mime Config_Mime;
5
6 struct _Config_Glob
7 {
8    const char *name;
9 };
10
11 struct _Config_Mime
12 {
13    const char *mime;
14    Eina_List  *globs;
15 };
16
17 struct _E_Config_Dialog_Data
18 {
19    struct
20    {
21       Evas_Object *deflist, *mimelist, *entry;
22    } obj;
23    Efreet_Ini          *ini;
24    Eina_List           *mimes;
25    Eina_List           *desks;
26
27    const char          *selmime;
28    const char          *selapp;
29
30    const char         **seldest;
31
32    char                *browser_custom;
33
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;
39
40    Ecore_Event_Handler *desk_change_handler;
41    int                  gen;
42 };
43
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);
49
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);
58
59 E_Config_Dialog *
60 e_int_config_defapps(E_Container *con, const char *params __UNUSED__)
61 {
62    E_Config_Dialog *cfd;
63    E_Config_Dialog_View *v;
64
65    if (e_config_dialog_find("E", "applications/default_applications"))
66      return NULL;
67
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;
73
74    cfd = e_config_dialog_new(con, _("Default Applications"),
75                              "E", "applications/default_applications",
76                              "preferences-desktop-default-applications", 0, v, NULL);
77    return cfd;
78 }
79
80 static void *
81 _create_data(E_Config_Dialog *cfd __UNUSED__)
82 {
83    E_Config_Dialog_Data *cfdata;
84    Efreet_Ini *ini, *myini;
85    Eina_Iterator *it;
86    char buf[PATH_MAX];
87    const char *key, *s, *homedir;
88    Eina_List *l;
89    E_Config_Env_Var *evr;
90
91    cfdata = E_NEW(E_Config_Dialog_Data, 1);
92    if (!cfdata) return NULL;
93
94    cfdata->desk_change_handler = ecore_event_handler_add
95        (EFREET_EVENT_DESKTOP_CACHE_UPDATE, _desks_update, cfdata);
96
97    snprintf(buf, sizeof(buf), "%s/applications/defaults.list",
98             efreet_data_home_get());
99    myini = efreet_ini_new(buf);
100    if (myini)
101      {
102         cfdata->ini = myini;
103         if (!efreet_ini_section_set(myini, "Default Applications"))
104           {
105              efreet_ini_section_add(myini, "Default Applications");
106              efreet_ini_section_set(myini, "Default Applications");
107           }
108         EINA_LIST_FOREACH(efreet_data_dirs_get(), l, s)
109           {
110              snprintf(buf, sizeof(buf), "%s/applications/defaults.list", s);
111              ini = efreet_ini_new(buf);
112              if ((ini) &&
113                  (efreet_ini_section_set(ini, "Default Applications")) &&
114                  (ini->section) &&
115                  (it = eina_hash_iterator_key_new(ini->section)))
116                {
117                   EINA_ITERATOR_FOREACH(it, key)
118                     {
119                        if (!efreet_ini_string_get(myini, key))
120                          {
121                             s = efreet_ini_string_get(ini, key);
122                             if (s) efreet_ini_string_set(myini, key, s);
123                          }
124                     }
125                   eina_iterator_free(it);
126                }
127              if (ini) efreet_ini_free(ini);
128           }
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);
140      }
141
142    EINA_LIST_FOREACH(e_config->env_vars, l, evr)
143      {
144         if (!strcmp(evr->var, "BROWSER"))
145           {
146              if ((evr->val) && (!evr->unset))
147                cfdata->browser_custom = strdup(evr->val);
148              break;
149           }
150      }
151
152    homedir = e_user_homedir_get();
153
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);
158
159    EINA_LIST_FOREACH(efreet_config_dirs_get(), l, s)
160      {
161         snprintf(buf, sizeof(buf), "%s/mime/globs", s);
162         if (ecore_file_exists(buf)) _load_globs(cfdata, buf);
163      }
164
165    snprintf(buf, sizeof(buf), "%s/.mime.types", homedir);
166    if (ecore_file_exists(buf)) _load_mimes(cfdata, buf);
167
168    snprintf(buf, sizeof(buf), "%s/mime/globs", efreet_data_home_get());
169    if (ecore_file_exists(buf)) _load_globs(cfdata, buf);
170
171    cfdata->mimes = eina_list_sort(cfdata->mimes, 0, _sort_mimes);
172    return cfdata;
173 }
174
175 static void
176 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
177 {
178    Config_Mime *m;
179    Efreet_Desktop *desk;
180
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)
190      {
191         Config_Glob *g;
192
193         if (!m) continue;
194         EINA_LIST_FREE(m->globs, g)
195           {
196              if (!g) continue;
197              eina_stringshare_del(g->name);
198              E_FREE(g);
199           }
200         eina_stringshare_del(m->mime);
201         E_FREE(m);
202      }
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);
208    E_FREE(cfdata);
209 }
210
211 static Eina_Bool
212 _desks_update(void *data, int ev_type __UNUSED__, void *ev __UNUSED__)
213 {
214    E_Config_Dialog_Data *cfdata = data;
215    Efreet_Desktop *desk;
216    EINA_LIST_FREE(cfdata->desks, desk)
217      efreet_desktop_free(desk);
218    if (cfdata->gen)
219      _fill_apps_list(cfdata, cfdata->obj.deflist, &(cfdata->selapp), 1);
220    else
221      _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
222    return ECORE_CALLBACK_PASS_ON;
223 }
224
225 static void
226 _def_browser_cb(void *data)
227 {
228    E_Config_Dialog_Data *cfdata = data;
229    cfdata->seldest = &(cfdata->browser_desktop);
230    _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
231    cfdata->gen = 0;
232 }
233
234 static void
235 _def_mailto_cb(void *data)
236 {
237    E_Config_Dialog_Data *cfdata = data;
238    cfdata->seldest = &(cfdata->mailto_desktop);
239    _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
240    cfdata->gen = 0;
241 }
242
243 static void
244 _def_file_cb(void *data)
245 {
246    E_Config_Dialog_Data *cfdata = data;
247    cfdata->seldest = &(cfdata->file_desktop);
248    _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
249    cfdata->gen = 0;
250 }
251
252 static void
253 _def_trash_cb(void *data)
254 {
255    E_Config_Dialog_Data *cfdata = data;
256    cfdata->seldest = &(cfdata->trash_desktop);
257    _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
258    cfdata->gen = 0;
259 }
260
261 static void
262 _def_terminal_cb(void *data)
263 {
264    E_Config_Dialog_Data *cfdata = data;
265    cfdata->seldest = &(cfdata->terminal_desktop);
266    _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0);
267    cfdata->gen = 0;
268 }
269
270 static void
271 _sel_mime_cb(void *data)
272 {
273    E_Config_Dialog_Data *cfdata = data;
274    if (cfdata->selapp) eina_stringshare_del(cfdata->selapp);
275    cfdata->selapp = NULL;
276    if (cfdata->selmime)
277      {
278         const char *s = efreet_ini_string_get(cfdata->ini, cfdata->selmime);
279         if (s) cfdata->selapp = eina_stringshare_add(s);
280      }
281    _fill_apps_list(cfdata, cfdata->obj.mimelist, &(cfdata->selapp), 1);
282    cfdata->gen = 1;
283 }
284
285 static Evas_Object *
286 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
287 {
288    Evas_Object *otb, *ot, *ob, *of, *il;
289    Eina_List *l;
290    Config_Mime *m;
291
292    otb = e_widget_toolbook_add(evas, 24, 24);
293
294    ot = e_widget_table_add(evas, EINA_FALSE);
295
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);
298
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);
302
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);
306    edje_freeze();
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);
316    edje_thaw();
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);
320
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);
328
329    e_widget_toolbook_page_append(otb, NULL, _("Core"), ot,
330                                  1, 1, 1, 1, 0.5, 0.0);
331
332    ot = e_widget_table_add(evas, EINA_FALSE);
333
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);
337    edje_freeze();
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);
344    edje_thaw();
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);
348
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);
356
357    e_widget_toolbook_page_append(otb, NULL, _("General"), ot,
358                                  1, 1, 1, 1, 0.5, 0.0);
359
360    e_widget_toolbook_page_show(otb, 0);
361
362    e_dialog_resizable_set(cfd->dia, 1);
363    e_win_centered_set(cfd->dia->win, 1);
364    return otb;
365 }
366
367 static int
368 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
369 {
370    Eina_List *l;
371    E_Config_Env_Var *evr = NULL;
372
373    if (cfdata->ini)
374      {
375         char buf[PATH_MAX];
376
377         if ((cfdata->browser_desktop) && (cfdata->browser_desktop[0]))
378           {
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);
383           }
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);
399      }
400    if ((cfdata->browser_custom) && (cfdata->browser_custom[0]))
401      {
402         EINA_LIST_FOREACH(e_config->env_vars, l, evr)
403           {
404              if (!strcmp(evr->var, "BROWSER")) break;
405              evr = NULL;
406           }
407         if (evr)
408           {
409              evr->unset = 0;
410              if (evr->val) eina_stringshare_del(evr->val);
411           }
412         else
413           {
414              evr = E_NEW(E_Config_Env_Var, 1);
415              if (evr)
416                {
417                   evr->var = eina_stringshare_add("BROWSER");
418                   evr->unset = 0;
419                   e_config->env_vars = eina_list_append(e_config->env_vars, evr);
420                }
421           }
422         if (evr)
423           {
424              evr->val = eina_stringshare_add(cfdata->browser_custom);
425              e_env_set(evr->var, evr->val);
426           }
427      }
428    else
429      {
430         EINA_LIST_FOREACH(e_config->env_vars, l, evr)
431           {
432              if ((evr->var) && !(strcmp(evr->var, "BROWSER")))
433                {
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);
437                   free(evr);
438                   break;
439                }
440           }
441         e_env_unset("BROWSER");
442      }
443    e_config_save_queue();
444    return 1;
445 }
446
447 static void
448 _load_mimes(E_Config_Dialog_Data *cfdata, char *file)
449 {
450    FILE *f;
451    char buf[4096], mimetype[4096], ext[4096];
452    char *p, *pp;
453    Config_Mime *config_mime;
454    Config_Glob *config_glob;
455
456    if (!cfdata) return;
457
458    f = fopen(file, "rb");
459    if (!f) return;
460    while (fgets(buf, sizeof(buf), f))
461      {
462         p = buf;
463         while (isblank(*p) && (*p != 0) && (*p != '\n'))
464           p++;
465         if (*p == '#') continue;
466         if ((*p == '\n') || (*p == 0)) continue;
467         pp = p;
468         while (!isblank(*p) && (*p != 0) && (*p != '\n'))
469           p++;
470         if ((*p == '\n') || (*p == 0)) continue;
471         strncpy(mimetype, pp, (p - pp));
472         mimetype[p - pp] = 0;
473         do
474           {
475              while (isblank(*p) && (*p != 0) && (*p != '\n'))
476                p++;
477              if ((*p == '\n') || (*p == 0)) continue;
478              pp = p;
479              while (!isblank(*p) && (*p != 0) && (*p != '\n'))
480                p++;
481              strncpy(ext, pp, (p - pp));
482              ext[p - pp] = 0;
483              config_mime = _find_mime(cfdata, mimetype);
484              if (!config_mime)
485                {
486                   config_mime = E_NEW(Config_Mime, 1);
487                   if (config_mime)
488                     {
489                        config_mime->mime = eina_stringshare_add(mimetype);
490                        if (!config_mime->mime)
491                          free(config_mime);
492                        else
493                          {
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);
498                          }
499                     }
500                }
501              else
502                {
503                   config_glob = _find_glob(config_mime, ext);
504                   if (!config_glob)
505                     {
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);
509                     }
510                }
511           }
512         while ((*p != '\n') && (*p != 0));
513      }
514    fclose(f);
515 }
516
517 static void
518 _load_globs(E_Config_Dialog_Data *cfdata, char *file)
519 {
520    FILE *f;
521    char buf[4096], mimetype[4096], ext[4096];
522    char *p, *pp;
523    Config_Mime *config_mime;
524    Config_Glob *config_glob;
525
526    if (!cfdata) return;
527
528    f = fopen(file, "rb");
529    if (!f) return;
530    while (fgets(buf, sizeof(buf), f))
531      {
532         p = buf;
533         while (isblank(*p) && (*p != 0) && (*p != '\n'))
534           p++;
535         if (*p == '#') continue;
536         if ((*p == '\n') || (*p == 0)) continue;
537         pp = p;
538         while ((*p != ':') && (*p != 0) && (*p != '\n'))
539           p++;
540         if ((*p == '\n') || (*p == 0)) continue;
541         strncpy(mimetype, pp, (p - pp));
542         mimetype[p - pp] = 0;
543         p++;
544         pp = ext;
545         while ((*p != 0) && (*p != '\n'))
546           {
547              *pp = *p;
548              pp++;
549              p++;
550           }
551         *pp = 0;
552         config_mime = _find_mime(cfdata, mimetype);
553         if (!config_mime)
554           {
555              config_mime = E_NEW(Config_Mime, 1);
556              if (config_mime)
557                {
558                   config_mime->mime = eina_stringshare_add(mimetype);
559                   if (!config_mime->mime)
560                     free(config_mime);
561                   else
562                     {
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);
567                     }
568                }
569           }
570         else
571           {
572              config_glob = _find_glob(config_mime, ext);
573              if (!config_glob)
574                {
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);
578                }
579           }
580      }
581    fclose(f);
582 }
583
584 static int
585 _sort_mimes(const void *data1, const void *data2)
586 {
587    const Config_Mime *m1 = data1, *m2 = data2;
588    if (!m1) return 1;
589    if (!m2) return -1;
590    return strcmp(m1->mime, m2->mime);
591 }
592
593 static Config_Mime *
594 _find_mime(E_Config_Dialog_Data *cfdata, char *mime)
595 {
596    Config_Mime *cm;
597    Eina_List *l;
598
599    if (!cfdata) return NULL;
600    EINA_LIST_FOREACH(cfdata->mimes, l, cm)
601      {
602         if (!cm) continue;
603         if (!strcmp(cm->mime, mime)) return cm;
604      }
605    return NULL;
606 }
607
608 static Config_Glob *
609 _find_glob(Config_Mime *mime, char *globbing)
610 {
611    Config_Glob *g;
612    Eina_List *l;
613
614    if (!mime) return NULL;
615    EINA_LIST_FOREACH(mime->globs, l, g)
616      {
617         if (!g) continue;
618         if (strcmp(g->name, globbing)) continue;
619         return g;
620      }
621    return NULL;
622 }
623
624 static int
625 _cb_desks_sort(const void *data1, const void *data2)
626 {
627    const Efreet_Desktop *d1, *d2;
628
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);
634 }
635
636 static void
637 _sel_desk_gen_cb(void *data)
638 {
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))
642      {
643         if (cfdata->ini)
644           efreet_ini_string_set(cfdata->ini, cfdata->selmime, s);
645      }
646 }
647
648 static void
649 _sel_desk_cb(void *data)
650 {
651    E_Config_Dialog_Data *cfdata = data;
652    if (cfdata->seldest)
653      {
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)))
660           {
661              Eina_List *l;
662              Efreet_Desktop *desk;
663
664              EINA_LIST_FOREACH(cfdata->desks, l, desk)
665                {
666                   if ((!strcmp(desk->orig_path, *(cfdata->seldest))) ||
667                       (!strcmp(ecore_file_file_get(desk->orig_path), *(cfdata->seldest))))
668                     {
669                        if (desk->exec)
670                          {
671                             char *p;
672
673                             free(cfdata->browser_custom);
674                             cfdata->browser_custom = strdup(desk->exec);
675                             for (p = cfdata->browser_custom; *p; p++)
676                               {
677                                  if (p > cfdata->browser_custom)
678                                    {
679                                       if ((isspace(*p)) &&
680                                           (p[-1] != '\\'))
681                                         {
682                                            *p = 0;
683                                            break;
684                                         }
685                                    }
686                               }
687                             p = strdup(cfdata->browser_custom);
688                             if (p)
689                               {
690                                  e_widget_entry_text_set(cfdata->obj.entry, p);
691                                  free(p);
692                               }
693                          }
694                        break;
695                     }
696                }
697           }
698      }
699 }
700
701 static void
702 _fill_apps_list(E_Config_Dialog_Data *cfdata, Evas_Object *il, const char **desktop, int general)
703 {
704    Eina_List *desks = NULL, *l;
705    Efreet_Desktop *desk = NULL;
706    Evas *evas;
707    int sel, i;
708
709    if (!cfdata->desks)
710      {
711         desks = efreet_util_desktop_name_glob_list("*");
712         EINA_LIST_FREE(desks, desk)
713           {
714              Eina_List *ll;
715
716              if (desk->no_display)
717                {
718                   efreet_desktop_free(desk);
719                   continue;
720                }
721              ll = eina_list_search_unsorted_list(cfdata->desks, _cb_desks_sort, desk);
722              if (ll)
723                {
724                   Efreet_Desktop *old;
725
726                   old = eina_list_data_get(ll);
727                   /*
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
730                    * desktops.
731                    */
732                   if ((old->only_show_in) && (!desk->only_show_in))
733                     {
734                        efreet_desktop_free(old);
735                        eina_list_data_set(ll, desk);
736                     }
737                   else
738                     efreet_desktop_free(desk);
739                }
740              else
741                cfdata->desks = eina_list_append(cfdata->desks, desk);
742           }
743         cfdata->desks = eina_list_sort(cfdata->desks, -1, _cb_desks_sort);
744      }
745
746    evas = evas_object_evas_get(il);
747    evas_event_freeze(evas);
748    edje_freeze();
749    e_widget_ilist_freeze(il);
750    e_widget_ilist_clear(il);
751
752    sel = -1;
753    i = 0;
754    EINA_LIST_FOREACH(cfdata->desks, l, desk)
755      {
756         Evas_Object *icon = NULL;
757
758         if ((desktop) && (*desktop))
759           {
760              if ((!strcmp(desk->orig_path, *desktop)) ||
761                  (!strcmp(ecore_file_file_get(desk->orig_path), *desktop)))
762                sel = i;
763           }
764
765         icon = e_util_desktop_icon_add(desk, 24, evas);
766         if (general)
767           e_widget_ilist_append(il, icon, desk->name,
768                                 _sel_desk_gen_cb, cfdata,
769                                 ecore_file_file_get(desk->orig_path));
770         else
771           e_widget_ilist_append(il, icon, desk->name,
772                                 _sel_desk_cb, cfdata,
773                                 ecore_file_file_get(desk->orig_path));
774         i++;
775      }
776
777    e_widget_ilist_go(il);
778    e_widget_ilist_thaw(il);
779    edje_thaw();
780    evas_event_thaw(evas);
781    if (sel >= 0)
782      {
783         e_widget_ilist_selected_set(il, sel);
784         e_widget_ilist_nth_show(il, sel, 0);
785      }
786 }
787