3 typedef struct _E_Font_Size_Data E_Font_Size_Data;
4 typedef struct _E_Text_Class_Pair E_Text_Class_Pair;
5 typedef struct _CFText_Class CFText_Class;
7 static void *_create_data(E_Config_Dialog *cfd);
8 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
10 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11 static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
12 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
14 static void _basic_font_cb_change(void *data, Evas_Object *obj);
15 static void _basic_enable_cb_change(void *data, Evas_Object *obj);
16 static void _basic_init_data_fill(E_Config_Dialog_Data *cfdata);
18 static void _adv_class_cb_change(void *data, Evas_Object *obj);
19 static void _adv_enabled_font_cb_change(void *data, Evas_Object *obj);
20 static void _adv_enabled_fallback_cb_change(void *data, Evas_Object *obj);
21 static void _adv_font_cb_change(void *data, Evas_Object *obj);
22 static void _adv_style_cb_change(void *data, Evas_Object *obj);
23 static void _size_cb_change(void *data);
25 static int _sort_fonts(const void *data1, const void *data2);
26 static void _font_list_load(E_Config_Dialog_Data *cfdata, const char *cur_font);
27 static void _size_list_load(E_Config_Dialog_Data *cfdata, Eina_List *size_list, Evas_Font_Size cur_size, int clear);
28 static void _class_list_load(E_Config_Dialog_Data *cfdata);
29 static void _font_preview_update(E_Config_Dialog_Data *cfdata);
31 static Eina_Bool _font_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata);
33 struct _E_Font_Size_Data
35 E_Config_Dialog_Data *cfdata;
40 struct _E_Text_Class_Pair
42 const char *class_name;
43 const char *class_description;
48 const char *class_name;
49 const char *class_description;
53 unsigned char enabled : 1;
56 const E_Text_Class_Pair text_class_predefined_names[ ] = {
58 { "title_bar", N_("Title Bar")},
59 { "menu_item", N_("Menu Item")},
60 { "menu_title", N_("Menu Title")},
61 { "tb_plain", N_("Textblock Plain")},
62 { "tb_light", N_("Textblock Light")},
63 { "tb_big", N_("Textblock Big")},
64 { "move_text", N_("Move Text")},
65 { "resize_text", N_("Resize Text")},
66 { "winlist_title", N_("Winlist Title")},
67 { "configure", N_("Settings Heading")},
68 { "about_title", N_("About Title")},
69 { "about_version", N_("About Version")},
70 { "button_text", N_("About Text")},
71 { "desklock_title", N_("Desklock Title")},
72 { "desklock_passwd", N_("Desklock Password")},
73 { "dialog_error", N_("Dialog Error")},
74 { "exebuf_command", N_("Exebuf Command")},
75 { "init_title", N_("Splash Title")},
76 { "init_text", N_("Splash Text")},
77 { "init_version", N_("Splash Version")},
79 { NULL, N_("Widgets")},
80 { "entry", N_("Entry")},
81 { "frame", N_("Frame")},
82 { "label", N_("Label")},
83 { "button", N_("Buttons")},
84 { "slider", N_("Slider")},
85 { "radio_button", N_("Radio Buttons")},
86 { "check_button", N_("Check Buttons")},
87 { "tlist", N_("Text List Item")},
88 { "ilist_item", N_("List Item")},
89 { "ilist_header", N_("List Header")},
91 { NULL, N_("Filemanager")},
92 { "fileman_typebuf", N_("Typebuf")},
93 { "fileman_icon", N_("Icon")},
94 { "desktop_icon", N_("Desktop Icon")},
96 { NULL, N_("Modules")},
97 { "module_small", N_("Small")},
98 { "module_normal", N_("Normal")},
99 { "module_large", N_("Large")},
100 { "module_small_s", N_("Small Styled")},
101 { "module_normal_s", N_("Normal Styled")},
102 { "module_large_s", N_("Large Styled")},
107 struct _E_Config_Dialog_Data
109 E_Config_Dialog *cfd;
113 Eina_List *text_classes;
116 Eina_Hash *font_hash;
117 Eina_List *font_list;
118 Eina_List *font_px_list;
119 Eina_List *font_scale_list;
122 const char *cur_font;
123 const char *cur_style;
129 int cur_fallbacks_enabled;
137 Evas_Object *class_list;
138 Evas_Object *font_list;
139 Evas_Object *style_list;
140 Evas_Object *size_list;
141 Evas_Object *enabled;
142 Evas_Object *preview;
145 Evas_Object *fallback_list; /* Selecting a list entry starts edit*/
150 e_int_config_fonts(E_Container *con, const char *params __UNUSED__)
152 E_Config_Dialog *cfd;
153 E_Config_Dialog_View *v;
155 if (e_config_dialog_find("E", "appearance/fonts")) return NULL;
156 v = E_NEW(E_Config_Dialog_View, 1);
158 v->create_cfdata = _create_data;
159 v->free_cfdata = _free_data;
160 v->basic.create_widgets = _basic_create_widgets;
161 v->basic.apply_cfdata = _basic_apply_data;
162 v->advanced.create_widgets = _advanced_create_widgets;
163 v->advanced.apply_cfdata = _advanced_apply_data;
165 cfd = e_config_dialog_new(con, _("Font Settings"),
166 "E", "appearance/fonts",
167 "preferences-desktop-font", 0, v, NULL);
172 _fill_data(E_Config_Dialog_Data *cfdata)
174 Eina_List *font_list;
177 E_Font_Size_Data *size_data;
181 font_list = e_font_default_list();
183 /* Fill out the font list */
184 for (i = 0; text_class_predefined_names[i].class_description; i++ )
186 tc = E_NEW(CFText_Class, 1);
187 tc->class_name = text_class_predefined_names[i].class_name;
188 tc->class_description =
189 _(text_class_predefined_names[i].class_description);
194 if (text_class_predefined_names[i].class_name)
196 /* Search manually because we dont want to fallback */
197 for (next = font_list; next ; next = next->next)
201 if (!strcmp(tc->class_name, efd->text_class))
205 E_Font_Properties *efp;
207 efp = e_font_fontconfig_name_parse(efd->font);
209 tc->font = eina_stringshare_add(efp->name);
211 tc->style = eina_stringshare_add(efp->styles->data);
212 e_font_properties_free(efp);
214 tc->size = efd->size;
221 /* search with default fallbacks */
222 efd = e_font_default_get(tc->class_name);
227 E_Font_Properties *efp;
229 efp = e_font_fontconfig_name_parse(efd->font);
231 tc->font = eina_stringshare_add(efp->name);
233 tc->style = eina_stringshare_add(efp->styles->data);
234 e_font_properties_free(efp);
236 tc->size = efd->size;
241 /* Append the class */
242 cfdata->text_classes = eina_list_append(cfdata->text_classes, tc);
246 cfdata->hinting = e_config->font_hinting;
248 size_data = E_NEW(E_Font_Size_Data, 1);
249 size_data->cfdata = cfdata;
250 size_data->size_str = eina_stringshare_add(_("Tiny"));
251 size_data->size = -50;
252 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
254 size_data = E_NEW(E_Font_Size_Data, 1);
255 size_data->cfdata = cfdata;
256 size_data->size_str = eina_stringshare_add(_("Small"));
257 size_data->size = -80;
258 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
260 size_data = E_NEW(E_Font_Size_Data, 1);
261 size_data->cfdata = cfdata;
262 size_data->size_str = eina_stringshare_add(_("Normal"));
263 size_data->size = -100;
264 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
266 size_data = E_NEW(E_Font_Size_Data, 1);
267 size_data->cfdata = cfdata;
268 size_data->size_str = eina_stringshare_add(_("Big"));
269 size_data->size = -150;
270 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
272 size_data = E_NEW(E_Font_Size_Data, 1);
273 size_data->cfdata = cfdata;
274 size_data->size_str = eina_stringshare_add(_("Really Big"));
275 size_data->size = -190;
276 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
278 size_data = E_NEW(E_Font_Size_Data, 1);
279 size_data->cfdata = cfdata;
280 size_data->size_str = eina_stringshare_add(_("Huge"));
281 size_data->size = -250;
282 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
284 for (i = 5; i < 21; i++)
289 snprintf(str, sizeof(str), _("%d pixels"), i);
291 size_data = E_NEW(E_Font_Size_Data, 1);
292 size_data->cfdata = cfdata;
293 size_data->size_str = eina_stringshare_add(str);
295 cfdata->font_px_list = eina_list_append(cfdata->font_px_list, size_data);
300 _create_data(E_Config_Dialog *cfd)
302 E_Config_Dialog_Data *cfdata;
304 cfdata = E_NEW(E_Config_Dialog_Data, 1);
311 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
313 E_Font_Size_Data *size_data;
316 e_font_available_hash_free(cfdata->font_hash);
317 cfdata->font_list =eina_list_free(cfdata->font_list);
319 EINA_LIST_FREE(cfdata->text_classes, tc)
321 eina_stringshare_del(tc->font);
322 eina_stringshare_del(tc->style);
326 EINA_LIST_FREE(cfdata->font_scale_list, size_data)
328 eina_stringshare_del(size_data->size_str);
332 EINA_LIST_FREE(cfdata->font_px_list, size_data)
334 eina_stringshare_del(size_data->size_str);
338 eina_stringshare_del(cfdata->cur_font);
339 eina_stringshare_del(cfdata->cur_style);
344 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
350 if (cfdata->cur_enabled && !cfdata->cur_font)
353 for (i = 0; text_class_predefined_names[i].class_description; i++ )
355 if (!text_class_predefined_names[i].class_name) continue;
357 if (cfdata->cur_enabled)
359 const char *class_name;
360 const char *font_name;
362 class_name = text_class_predefined_names[i].class_name;
364 e_font_fontconfig_name_get(cfdata->cur_font, cfdata->cur_style);
365 e_font_default_set(class_name, font_name, cfdata->cur_size);
368 e_font_default_set("e_basic_font", font_name, cfdata->cur_size);
370 eina_stringshare_del(font_name);
374 e_font_default_remove(text_class_predefined_names[i].class_name);
376 e_font_default_remove("e_basic_font");
381 e_config_save_queue();
383 /* Apply to advanced */
384 EINA_LIST_FOREACH(cfdata->text_classes, next, tc)
386 tc->size = cfdata->cur_size;
388 eina_stringshare_del(tc->font);
389 tc->font = eina_stringshare_ref(cfdata->cur_font);
391 eina_stringshare_del(tc->style);
392 tc->style = eina_stringshare_ref(cfdata->cur_style);
393 tc->enabled = cfdata->cur_enabled;
400 _font_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
402 E_Config_Dialog_Data *cfdata;
403 E_Font_Properties *efp;
407 cfdata->font_list = eina_list_append(cfdata->font_list, efp->name);
413 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
415 Evas_Object *ot, *ob, *of;
417 cfdata->cur_index = -1;
420 ot = e_widget_table_add(evas, 0);
422 cfdata->gui.class_list = NULL;
424 ob = e_widget_check_add(evas, _("Enable Custom Font Classes"),
425 &(cfdata->cur_enabled));
426 cfdata->gui.enabled = ob;
427 e_widget_on_change_hook_set(ob, _basic_enable_cb_change, cfdata);
428 e_widget_disabled_set(ob, 0);
429 e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 0, 1, 0);
431 of = e_widget_framelist_add(evas, _("Fonts"), 1);
432 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_font));
433 cfdata->gui.font_list = ob;
434 e_widget_on_change_hook_set(ob, _basic_font_cb_change, cfdata);
435 e_widget_ilist_go(ob);
436 e_widget_framelist_object_append(of, ob);
437 e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 1, 1, 1);
439 of = e_widget_framelist_add(evas, _("Size"), 1);
440 ob = e_widget_ilist_add(evas, 16, 16, NULL);
441 cfdata->gui.size_list = ob;
442 e_widget_ilist_go(ob);
443 e_widget_size_min_set(ob, 100, 200);
444 e_widget_framelist_object_append(of, ob);
445 e_widget_table_object_append(ot, of, 1, 1, 1, 1, 1, 1, 1, 1);
448 e_widget_font_preview_add(evas, _("Basic preview text: 123: 我的天空!"));
449 cfdata->gui.preview = ob;
450 e_widget_table_object_append(ot, ob, 0, 2, 2, 1, 1, 0, 1, 0);
452 _basic_init_data_fill(cfdata);
454 e_dialog_resizable_set(cfd->dia, 1);
459 _basic_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
461 E_Config_Dialog_Data *cfdata;
465 _font_preview_update(cfdata);
469 _basic_enable_cb_change(void *data, Evas_Object *obj __UNUSED__)
471 E_Config_Dialog_Data *cfdata;
476 e_widget_disabled_set(cfdata->gui.font_list, !cfdata->cur_enabled);
477 e_widget_disabled_set(cfdata->gui.size_list, !cfdata->cur_enabled);
479 if (!cfdata->cur_enabled)
481 e_widget_ilist_unselect(cfdata->gui.font_list);
482 e_widget_ilist_unselect(cfdata->gui.size_list);
486 /* fill the basic dialog with initial data and select it */
488 _basic_init_data_fill(E_Config_Dialog_Data *cfdata)
492 const char *init_font;
493 Evas_Font_Size init_size;
498 /* Get initial basic basic */
499 efd = e_font_default_get("e_basic_font");
504 E_Font_Properties *efp;
506 efp = e_font_fontconfig_name_parse(efd->font);
507 init_font = eina_stringshare_add(efp->name);
508 e_font_properties_free(efp);
510 init_size = efd->size;
513 /* Check based on efd */
514 ob = cfdata->gui.enabled;
516 e_widget_check_checked_set(ob, 0);
517 else if (!strcmp(efd->text_class, "default"))
518 e_widget_check_checked_set(ob, 0);
520 e_widget_check_checked_set(ob, 1);
522 /* Populate font list (Select current font) */
523 _font_list_load(cfdata, init_font);
525 /* Populate size list (Select current font) */
526 _size_list_load(cfdata, cfdata->font_scale_list, init_size, 1);
530 _advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
536 /* Save current data */
537 if (cfdata->cur_index >= 0)
539 tc = eina_list_nth(cfdata->text_classes, cfdata->cur_index);
540 tc->enabled = cfdata->cur_enabled;
541 tc->size = cfdata->cur_size;
542 if (cfdata->cur_font)
543 tc->font = eina_stringshare_ref(cfdata->cur_font);
544 if (cfdata->cur_style)
545 tc->style = eina_stringshare_ref(cfdata->cur_style);
548 EINA_LIST_FOREACH(cfdata->text_classes, next, tc)
550 if (!tc->class_name) continue;
551 if (tc->enabled && tc->font)
555 name = e_font_fontconfig_name_get(tc->font, tc->style);
556 e_font_default_set(tc->class_name, name, tc->size);
557 eina_stringshare_del(name);
560 e_font_default_remove(tc->class_name);
563 /* Fallbacks configure */
564 e_font_fallback_clear();
566 if (cfdata->cur_fallbacks_enabled)
568 for (i = 0; i < e_widget_config_list_count(cfdata->gui.fallback_list); i++)
570 const char *fallback;
573 e_widget_config_list_nth_get(cfdata->gui.fallback_list, i);
574 if ((fallback) && (fallback[0]))
575 e_font_fallback_append(fallback);
581 e_config->font_hinting = cfdata->hinting;
582 e_config_save_queue();
588 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
590 Evas_Object *ot, *ob, *of, *otb;
592 Eina_List *next = NULL;
595 cfdata->cur_index = -1;
598 otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
600 ot = e_widget_table_add(evas, 0);
601 of = e_widget_frametable_add(evas, _("Font Classes"), 0);
602 ob = e_widget_ilist_add(evas, 16, 16, NULL);
603 cfdata->gui.class_list = ob;
604 _class_list_load(cfdata);
605 e_widget_ilist_multi_select_set(ob, 1);
606 e_widget_size_min_set(ob, 110, 220);
607 e_widget_on_change_hook_set(ob, _adv_class_cb_change, cfdata);
608 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
609 ob = e_widget_check_add(evas, _("Enable Font Class"), &(cfdata->cur_enabled));
610 cfdata->gui.enabled = ob;
611 e_widget_on_change_hook_set(ob, _adv_enabled_font_cb_change, cfdata);
612 e_widget_disabled_set(ob, 1);
613 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0);
614 e_widget_table_object_append(ot, of, 0, 0, 1, 2, 1, 1, 1, 1);
616 of = e_widget_framelist_add(evas, _("Font"), 1);
617 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_font));
618 cfdata->gui.font_list = ob;
619 e_widget_on_change_hook_set(ob, _adv_font_cb_change, cfdata);
620 _font_list_load(cfdata, NULL);
621 e_widget_size_min_set(ob, 110, 220);
622 e_widget_framelist_object_append(of, ob);
623 e_widget_table_object_append(ot, of, 1, 0, 1, 2, 1, 1, 1, 1);
625 of = e_widget_framelist_add(evas, _("Style"), 1);
626 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_style));
627 cfdata->gui.style_list = ob;
628 e_widget_on_change_hook_set(ob, _adv_style_cb_change, cfdata);
629 e_widget_ilist_go(ob);
630 e_widget_size_min_set(ob, 110, 50);
631 e_widget_framelist_object_append(of, ob);
632 e_widget_table_object_append(ot, of, 2, 0, 1, 1, 1, 1, 1, 1);
634 of = e_widget_framelist_add(evas, _("Size"), 1);
635 ob = e_widget_ilist_add(evas, 16, 16, NULL);
636 cfdata->gui.size_list = ob;
637 e_widget_ilist_go(ob);
638 e_widget_size_min_set(ob, 110, 50);
639 e_widget_framelist_object_append(of, ob);
640 e_widget_table_object_append(ot, of, 2, 1, 1, 1, 1, 1, 1, 1);
642 ob = e_widget_font_preview_add(evas, _("Advanced Preview Text.. 我真的会写中文"));
643 cfdata->gui.preview = ob;
644 e_widget_table_object_append(ot, ob, 0, 2, 3, 1, 1, 0, 1, 0);
646 e_widget_toolbook_page_append(otb, NULL, _("General Settings"),
647 ot, 1, 1, 1, 1, 0.5, 0.0);
649 ot = e_widget_table_add(evas, 0);
650 of = e_widget_frametable_add(evas, _("Hinting"), 0);
651 rg = e_widget_radio_group_new(&(cfdata->hinting));
652 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_BYTECODE);
653 ob = e_widget_radio_add(evas, _("Bytecode"), 0, rg);
654 e_widget_disabled_set(ob, !option_enable);
655 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
656 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_AUTO);
657 ob = e_widget_radio_add(evas, _("Automatic"), 1, rg);
658 e_widget_disabled_set(ob, !option_enable);
659 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0);
660 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_NONE);
661 ob = e_widget_radio_add(evas, _("None"), 2, rg);
662 e_widget_disabled_set(ob, !option_enable);
663 e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 0, 1, 0);
664 e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 0);
666 of = e_widget_framelist_add(evas, _("Font Fallbacks"), 0);
667 ob = e_widget_config_list_add(evas, e_widget_entry_add, _("Fallback Name"), 2);
668 cfdata->gui.fallback_list = ob;
670 for (next = e_font_fallback_list(); next; next = next->next)
672 E_Font_Fallback *eff;
675 e_widget_config_list_append(ob, eff->name);
678 if (next) eina_list_free(next);
679 ob = e_widget_check_add(evas, _("Enable Fallbacks"), &(cfdata->cur_fallbacks_enabled));
680 e_widget_config_list_object_append(cfdata->gui.fallback_list, ob,
681 0, 0, 2, 1, 1, 0, 1, 0);
682 e_widget_on_change_hook_set(ob, _adv_enabled_fallback_cb_change, cfdata);
683 e_widget_check_checked_set(ob, option_enable);
685 e_widget_framelist_object_append(of, cfdata->gui.fallback_list);
686 e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 0);
688 e_widget_toolbook_page_append(otb, NULL, _("Hinting / Fallbacks"),
689 ot, 1, 0, 1, 0, 0.5, 0.0);
691 e_widget_toolbook_page_show(otb, 0);
692 e_dialog_resizable_set(cfd->dia, 1);
696 /* Private Font Class Functions */
698 _class_list_load(E_Config_Dialog_Data *cfdata)
703 if (!cfdata->gui.class_list) return;
704 evas = evas_object_evas_get(cfdata->gui.class_list);
705 evas_event_freeze(evas);
707 e_widget_ilist_freeze(cfdata->gui.class_list);
708 e_widget_ilist_clear(cfdata->gui.class_list);
710 /* Fill in Class Ilist */
711 for (next = cfdata->text_classes; next; next = next->next)
723 ic = e_icon_add(evas);
724 e_util_icon_theme_set(ic, "dialog-ok-apply");
728 e_widget_ilist_append(cfdata->gui.class_list, ic, tc->class_description, NULL, NULL, NULL);
731 e_widget_ilist_header_append(cfdata->gui.class_list, NULL, tc->class_description);
734 e_widget_ilist_go(cfdata->gui.class_list);
735 e_widget_ilist_thaw(cfdata->gui.class_list);
737 evas_event_thaw(evas);
740 /* Called whenever class list selection changes */
742 _adv_class_cb_change(void *data, Evas_Object *obj __UNUSED__)
745 E_Config_Dialog_Data *cfdata;
748 if (!(cfdata = data)) return;
751 if (cfdata->cur_index >= 0)
753 tc = eina_list_nth(cfdata->text_classes, cfdata->cur_index);
754 tc->enabled = cfdata->cur_enabled;
755 tc->size = cfdata->cur_size;
757 eina_stringshare_del(tc->font);
758 tc->font = eina_stringshare_ref(cfdata->cur_font);
760 eina_stringshare_del(tc->style);
761 tc->style = eina_stringshare_ref(cfdata->cur_style);
763 if (cfdata->gui.style_list)
764 e_widget_ilist_unselect(cfdata->gui.style_list);
765 if (cfdata->gui.size_list)
766 e_widget_ilist_unselect(cfdata->gui.size_list);
769 /* If no class is selected unselect all and return */
770 indx = e_widget_ilist_selected_get(cfdata->gui.class_list);
773 e_widget_disabled_set(cfdata->gui.enabled, 1);
774 e_widget_disabled_set(cfdata->gui.font_list, 1);
775 e_widget_disabled_set(cfdata->gui.size_list, 1);
776 e_widget_check_checked_set(cfdata->gui.enabled, 0);
777 if (cfdata->gui.font_list)
778 e_widget_ilist_unselect(cfdata->gui.font_list);
782 tc = eina_list_nth(cfdata->text_classes, indx);
783 cfdata->cur_index = indx;
785 e_widget_disabled_set(cfdata->gui.enabled, 0);
786 e_widget_disabled_set(cfdata->gui.font_list, !tc->enabled);
787 e_widget_disabled_set(cfdata->gui.size_list, !tc->enabled);
788 e_widget_check_checked_set(cfdata->gui.enabled, tc->enabled);
790 if (cfdata->gui.font_list)
792 /* Select the configured font */
793 for (indx = 0; indx < e_widget_ilist_count(cfdata->gui.font_list); indx++)
797 f = e_widget_ilist_nth_label_get(cfdata->gui.font_list, indx);
798 if (tc->font && !strcasecmp(f, tc->font))
800 e_widget_ilist_selected_set(cfdata->gui.font_list, indx);
808 _adv_enabled_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
810 E_Config_Dialog_Data *cfdata;
814 if (!(cfdata = data)) return;
815 e_widget_disabled_set(cfdata->gui.font_list, !cfdata->cur_enabled);
816 e_widget_disabled_set(cfdata->gui.style_list, !cfdata->cur_enabled);
817 e_widget_disabled_set(cfdata->gui.size_list, !cfdata->cur_enabled);
819 /* Search class list fot selected and enable Icon */
820 for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
823 Evas_Object *icon = NULL;
826 if (!(i = l->data)) continue;
827 if (!i->selected) continue;
829 tc = eina_list_nth(cfdata->text_classes, n);
830 tc->enabled = cfdata->cur_enabled;
831 tc->size = cfdata->cur_size;
832 eina_stringshare_del(tc->font);
833 if (cfdata->cur_font)
834 tc->font = eina_stringshare_ref(cfdata->cur_font);
835 if (cfdata->cur_enabled)
837 icon = e_icon_add(cfdata->evas);
838 e_util_icon_theme_set(icon, "enlightenment");
840 e_widget_ilist_nth_icon_set(cfdata->gui.class_list, n, icon);
845 _size_cb_change(void *data)
847 E_Config_Dialog_Data *cfdata;
848 E_Font_Size_Data *size_data;
853 if (!(cfdata = size_data->cfdata)) return;
855 cfdata->cur_size = size_data->size;
857 _font_preview_update(cfdata);
859 if (!cfdata->gui.class_list) return;
861 for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
866 if (!(i = l->data)) continue;
867 if (!i->selected) continue;
869 tc = eina_list_nth(cfdata->text_classes, n);
870 tc->size = cfdata->cur_size;
875 _adv_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
877 E_Config_Dialog_Data *cfdata;
883 if (!(cfdata = data)) return;
885 /* Set up the new font name for each selected class */
886 for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
890 if (!(i = l->data)) continue;
891 if (!i->selected) continue;
893 tc = eina_list_nth(cfdata->text_classes, n);
894 if (tc->font) eina_stringshare_del(tc->font);
895 if (cfdata->cur_font)
896 tc->font = eina_stringshare_ref(cfdata->cur_font);
899 /* Load the style list */
900 if (cfdata->cur_font)
902 E_Font_Properties *efp;
905 efp = eina_hash_find(cfdata->font_hash, cfdata->cur_font);
906 evas_event_freeze(evas_object_evas_get(cfdata->gui.style_list));
908 e_widget_ilist_freeze(cfdata->gui.style_list);
909 e_widget_ilist_clear(cfdata->gui.style_list);
911 for (next = efp->styles; next; next = next->next)
916 e_widget_ilist_append(cfdata->gui.style_list, NULL, style,
920 e_widget_ilist_go(cfdata->gui.style_list);
921 e_widget_ilist_thaw(cfdata->gui.style_list);
923 evas_event_thaw(evas_object_evas_get(cfdata->gui.style_list));
926 /* select configured style from list */
927 if ((tc) && (tc->style))
929 for (n = 0; n < e_widget_ilist_count(cfdata->gui.style_list); n++)
933 f = e_widget_ilist_nth_label_get(cfdata->gui.style_list, n);
934 if ((!f) || (!tc->style)) continue;
935 if (!strcasecmp(f, tc->style))
937 e_widget_ilist_selected_set(cfdata->gui.style_list, n);
943 /* load and select size list */
946 cfdata->cur_size = tc->size;
947 _size_list_load(cfdata, cfdata->font_scale_list, tc->size, 1);
948 _size_list_load(cfdata, cfdata->font_px_list, tc->size, 0);
951 _font_preview_update(cfdata);
955 _size_list_load(E_Config_Dialog_Data *cfdata, Eina_List *size_list, Evas_Font_Size cur_size, int clear)
962 ob = cfdata->gui.size_list;
963 evas = evas_object_evas_get(ob);
965 evas_event_freeze(evas);
967 e_widget_ilist_freeze(ob);
968 if (clear) e_widget_ilist_clear(ob);
970 for (next = size_list; next; next = next->next)
972 E_Font_Size_Data *size_data;
974 size_data = next->data;
975 e_widget_ilist_append(ob, NULL, size_data->size_str, _size_cb_change,
979 e_widget_ilist_go(ob);
980 e_widget_ilist_thaw(ob);
982 evas_event_thaw(evas);
984 for (n = 0; n < e_widget_ilist_count(ob); n++)
986 E_Font_Size_Data *size_data;
988 if (!(size_data = e_widget_ilist_nth_data_get(ob, n))) continue;
989 if (cur_size == size_data->size)
991 e_widget_ilist_selected_set(ob, n);
998 _font_list_load(E_Config_Dialog_Data *cfdata, const char *cur_font)
1006 ob = cfdata->gui.font_list;
1007 evas = evas_object_evas_get(ob);
1009 evas_event_freeze(evas);
1011 e_widget_ilist_freeze(ob);
1013 /* Load Hash a single time */
1014 if (!cfdata->font_hash)
1018 fonts = evas_font_available_list(evas);
1019 cfdata->font_hash = e_font_available_list_parse(fonts);
1020 eina_hash_foreach(cfdata->font_hash, _font_hash_cb, cfdata);
1021 if (cfdata->font_list)
1024 eina_list_sort(cfdata->font_list,
1025 eina_list_count(cfdata->font_list),
1028 evas_font_available_list_free(evas, fonts);
1032 if (cfdata->font_list)
1036 for (next = cfdata->font_list; next; next = next->next)
1041 e_widget_ilist_append(ob, NULL, f, NULL, NULL, f);
1045 e_widget_ilist_go(ob);
1046 e_widget_size_min_get(ob, &w, NULL);
1047 e_widget_size_min_set(ob, w, 250);
1048 e_widget_ilist_thaw(ob);
1050 evas_event_thaw(evas);
1052 if (!cur_font) return;
1054 /* Select Current Font */
1056 for (next = cfdata->font_list; next; next = next->next)
1061 if (!strcasecmp(f, cur_font))
1063 e_widget_ilist_selected_set(ob, n);
1071 _adv_style_cb_change(void *data, Evas_Object *obj __UNUSED__)
1073 E_Config_Dialog_Data *cfdata;
1077 if (!(cfdata = data)) return;
1079 /* Setup the new style name */
1080 for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
1085 if (!(i = l->data)) continue;
1086 if (!i->selected) continue;
1088 tc = eina_list_nth(cfdata->text_classes, n);
1089 eina_stringshare_del(tc->style);
1090 tc->style = eina_stringshare_ref(cfdata->cur_style);
1093 _font_preview_update(cfdata);
1096 /* Private Font Fallback Functions */
1098 _adv_enabled_fallback_cb_change(void *data, Evas_Object *obj __UNUSED__)
1100 E_Config_Dialog_Data *cfdata;
1102 if (!(cfdata = data)) return;
1103 e_widget_disabled_set(cfdata->gui.fallback_list,
1104 !cfdata->cur_fallbacks_enabled);
1108 _sort_fonts(const void *data1, const void *data2)
1110 if (!data1) return 1;
1111 if (!data2) return -1;
1112 return e_util_strcmp(data1, data2);
1116 _font_preview_update(E_Config_Dialog_Data *cfdata)
1118 /* update preview */
1119 if (cfdata->cur_font)
1123 name = e_font_fontconfig_name_get(cfdata->cur_font, cfdata->cur_style);
1124 e_widget_font_preview_font_set(cfdata->gui.preview, name,
1126 eina_stringshare_del(name);