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;
56 const E_Text_Class_Pair text_class_predefined_names[] = {
58 { "application", N_("Applications")},
59 { "title_bar", N_("Title Bar")},
60 { "menu_item", N_("Menu Item")},
61 { "menu_title", N_("Menu Title")},
62 { "tb_plain", N_("Textblock Plain")},
63 { "tb_light", N_("Textblock Light")},
64 { "tb_big", N_("Textblock Big")},
65 { "move_text", N_("Move Text")},
66 { "resize_text", N_("Resize Text")},
67 { "winlist_title", N_("Winlist Title")},
68 { "configure", N_("Settings Heading")},
69 { "about_title", N_("About Title")},
70 { "about_version", N_("About Version")},
71 { "button_text", N_("Button Text")},
72 { "desklock_title", N_("Desklock Title")},
73 { "desklock_passwd", N_("Desklock Password")},
74 { "dialog_error", N_("Dialog Error")},
75 { "exebuf_command", N_("Exebuf Command")},
76 { "init_title", N_("Splash Title")},
77 { "init_text", N_("Splash Text")},
78 { "init_version", N_("Splash Version")},
79 { "clock", N_("Digital Clock")},
81 { NULL, N_("Widgets")},
82 { "entry", N_("Entry")},
83 { "frame", N_("Frame")},
84 { "label", N_("Label")},
85 { "button", N_("Buttons")},
86 { "slider", N_("Slider")},
87 { "radio_button", N_("Radio Buttons")},
88 { "check_button", N_("Check Buttons")},
89 { "tlist", N_("Text List Item")},
90 { "ilist_item", N_("List Item")},
91 { "ilist_header", N_("List Header")},
93 { NULL, N_("Filemanager")},
94 { "fileman_typebuf", N_("Typebuf")},
95 { "fileman_icon", N_("Icon")},
96 { "desktop_icon", N_("Desktop Icon")},
98 { NULL, N_("Modules")},
99 { "module_small", N_("Small")},
100 { "module_normal", N_("Normal")},
101 { "module_large", N_("Large")},
102 { "module_small_s", N_("Small Styled")},
103 { "module_normal_s", N_("Normal Styled")},
104 { "module_large_s", N_("Large Styled")},
109 struct _E_Config_Dialog_Data
111 E_Config_Dialog *cfd;
115 Eina_List *text_classes;
118 Eina_Hash *font_hash;
119 Eina_List *font_list;
120 Eina_List *font_px_list;
121 Eina_List *font_scale_list;
124 const char *cur_font;
125 const char *cur_style;
128 CFText_Class *cur_class;
131 int cur_fallbacks_enabled;
139 Evas_Object *class_list;
140 Evas_Object *font_list;
141 Evas_Object *style_list;
142 Evas_Object *size_list;
143 Evas_Object *enabled;
144 Evas_Object *preview;
147 Evas_Object *fallback_list; /* Selecting a list entry starts edit*/
152 e_int_config_fonts(Evas_Object *parent EINA_UNUSED, const char *params __UNUSED__)
154 E_Config_Dialog *cfd;
155 E_Config_Dialog_View *v;
157 if (e_config_dialog_find("E", "appearance/fonts")) return NULL;
158 v = E_NEW(E_Config_Dialog_View, 1);
160 v->create_cfdata = _create_data;
161 v->free_cfdata = _free_data;
162 v->basic.create_widgets = _basic_create_widgets;
163 v->basic.apply_cfdata = _basic_apply_data;
164 v->advanced.create_widgets = _advanced_create_widgets;
165 v->advanced.apply_cfdata = _advanced_apply_data;
167 cfd = e_config_dialog_new(NULL, _("Font Settings"),
168 "E", "appearance/fonts",
169 "preferences-desktop-font", 0, v, NULL);
174 _fill_data(E_Config_Dialog_Data *cfdata)
176 Eina_List *font_list;
179 E_Font_Size_Data *size_data;
183 font_list = e_font_default_list();
185 /* Fill out the font list */
186 for (i = 0; text_class_predefined_names[i].class_description; i++ )
188 tc = E_NEW(CFText_Class, 1);
189 tc->class_name = text_class_predefined_names[i].class_name;
190 tc->class_description =
191 _(text_class_predefined_names[i].class_description);
196 if (text_class_predefined_names[i].class_name)
198 /* Search manually because we dont want to fallback */
199 for (next = font_list; next; next = next->next)
203 if (!strcmp(tc->class_name, efd->text_class))
207 E_Font_Properties *efp;
209 efp = e_font_fontconfig_name_parse(efd->font);
211 tc->font = eina_stringshare_add(efp->name);
213 tc->style = eina_stringshare_add(efp->styles->data);
214 e_font_properties_free(efp);
216 tc->size = efd->size;
223 /* search with default fallbacks */
224 efd = e_font_default_get(tc->class_name);
229 E_Font_Properties *efp;
231 efp = e_font_fontconfig_name_parse(efd->font);
233 tc->font = eina_stringshare_add(efp->name);
235 tc->style = eina_stringshare_add(efp->styles->data);
236 e_font_properties_free(efp);
238 tc->size = efd->size;
243 /* Append the class */
244 cfdata->text_classes = eina_list_append(cfdata->text_classes, tc);
248 cfdata->hinting = e_config->font_hinting;
250 size_data = E_NEW(E_Font_Size_Data, 1);
251 size_data->cfdata = cfdata;
252 size_data->size_str = eina_stringshare_add(_("Tiny"));
253 size_data->size = -50;
254 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
256 size_data = E_NEW(E_Font_Size_Data, 1);
257 size_data->cfdata = cfdata;
258 size_data->size_str = eina_stringshare_add(_("Small"));
259 size_data->size = -80;
260 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
262 size_data = E_NEW(E_Font_Size_Data, 1);
263 size_data->cfdata = cfdata;
264 size_data->size_str = eina_stringshare_add(_("Normal"));
265 size_data->size = -100;
266 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
268 size_data = E_NEW(E_Font_Size_Data, 1);
269 size_data->cfdata = cfdata;
270 size_data->size_str = eina_stringshare_add(_("Big"));
271 size_data->size = -150;
272 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
274 size_data = E_NEW(E_Font_Size_Data, 1);
275 size_data->cfdata = cfdata;
276 size_data->size_str = eina_stringshare_add(_("Really Big"));
277 size_data->size = -190;
278 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
280 size_data = E_NEW(E_Font_Size_Data, 1);
281 size_data->cfdata = cfdata;
282 size_data->size_str = eina_stringshare_add(_("Huge"));
283 size_data->size = -250;
284 cfdata->font_scale_list = eina_list_append(cfdata->font_scale_list, size_data);
286 for (i = 5; i < 21; i++)
291 snprintf(str, sizeof(str), P_("%d pixel", "%d pixels", i), i);
293 size_data = E_NEW(E_Font_Size_Data, 1);
294 size_data->cfdata = cfdata;
295 size_data->size_str = eina_stringshare_add(str);
297 cfdata->font_px_list = eina_list_append(cfdata->font_px_list, size_data);
302 _create_data(E_Config_Dialog *cfd)
304 E_Config_Dialog_Data *cfdata;
306 cfdata = E_NEW(E_Config_Dialog_Data, 1);
313 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
315 E_Font_Size_Data *size_data;
318 e_font_available_hash_free(cfdata->font_hash);
319 cfdata->font_list = eina_list_free(cfdata->font_list);
321 EINA_LIST_FREE(cfdata->text_classes, tc)
323 eina_stringshare_del(tc->font);
324 eina_stringshare_del(tc->style);
328 EINA_LIST_FREE(cfdata->font_scale_list, size_data)
330 eina_stringshare_del(size_data->size_str);
334 EINA_LIST_FREE(cfdata->font_px_list, size_data)
336 eina_stringshare_del(size_data->size_str);
340 eina_stringshare_del(cfdata->cur_font);
341 eina_stringshare_del(cfdata->cur_style);
346 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
352 if (cfdata->cur_enabled && !cfdata->cur_font)
355 for (i = 0; text_class_predefined_names[i].class_description; i++ )
357 if (!text_class_predefined_names[i].class_name) continue;
359 if (cfdata->cur_enabled)
361 const char *class_name;
362 const char *font_name;
364 class_name = text_class_predefined_names[i].class_name;
366 e_font_fontconfig_name_get(cfdata->cur_font, cfdata->cur_style);
367 e_font_default_set(class_name, font_name, cfdata->cur_size);
370 e_font_default_set("e_basic_font", font_name, cfdata->cur_size);
372 eina_stringshare_del(font_name);
376 e_font_default_remove(text_class_predefined_names[i].class_name);
378 e_font_default_remove("e_basic_font");
383 e_config_save_queue();
385 #ifndef HAVE_WAYLAND_ONLY
386 e_xsettings_config_update();
389 /* Apply to advanced */
390 EINA_LIST_FOREACH(cfdata->text_classes, next, tc)
392 tc->size = cfdata->cur_size;
394 eina_stringshare_del(tc->font);
395 tc->font = eina_stringshare_ref(cfdata->cur_font);
397 eina_stringshare_del(tc->style);
398 tc->style = eina_stringshare_ref(cfdata->cur_style);
399 tc->enabled = cfdata->cur_enabled;
406 _font_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
408 E_Config_Dialog_Data *cfdata;
409 E_Font_Properties *efp;
413 cfdata->font_list = eina_list_append(cfdata->font_list, efp->name);
419 _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
421 Evas_Object *ot, *ob, *of;
425 e_dialog_resizable_set(cfd->dia, 1);
426 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
428 cfdata->gui.class_list = NULL;
430 ob = e_widget_check_add(evas, _("Enable Custom Font Classes"),
431 &(cfdata->cur_enabled));
432 cfdata->gui.enabled = ob;
433 e_widget_on_change_hook_set(ob, _basic_enable_cb_change, cfdata);
434 e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 0, 1, 0);
436 of = e_widget_framelist_add(evas, _("Fonts"), 1);
437 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_font));
438 cfdata->gui.font_list = ob;
439 e_widget_on_change_hook_set(ob, _basic_font_cb_change, cfdata);
440 e_widget_ilist_go(ob);
441 e_widget_framelist_object_append(of, ob);
442 e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 1, 1, 1);
444 of = e_widget_framelist_add(evas, _("Size"), 1);
445 ob = e_widget_ilist_add(evas, 16, 16, NULL);
446 cfdata->gui.size_list = ob;
447 e_widget_ilist_go(ob);
448 e_widget_size_min_set(ob, 100, 200);
449 e_widget_framelist_object_append(of, ob);
450 e_widget_table_object_append(ot, of, 1, 1, 1, 1, 1, 1, 1, 1);
451 ob = e_widget_font_preview_add
452 (evas, _("English 012 #!? 日本語 にほんご ソフト 中文 華語 한국"));
453 cfdata->gui.preview = ob;
454 e_widget_table_object_append(ot, ob, 0, 2, 2, 1, 1, 0, 1, 0);
456 _basic_init_data_fill(cfdata);
458 e_widget_disabled_set(cfdata->gui.font_list, !cfdata->cur_enabled);
459 e_widget_disabled_set(cfdata->gui.size_list, !cfdata->cur_enabled);
465 _basic_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
467 E_Config_Dialog_Data *cfdata;
471 _font_preview_update(cfdata);
475 _basic_enable_cb_change(void *data, Evas_Object *obj __UNUSED__)
477 E_Config_Dialog_Data *cfdata;
482 e_widget_disabled_set(cfdata->gui.font_list, !cfdata->cur_enabled);
483 e_widget_disabled_set(cfdata->gui.size_list, !cfdata->cur_enabled);
485 if (!cfdata->cur_enabled)
487 e_widget_ilist_unselect(cfdata->gui.font_list);
488 e_widget_ilist_unselect(cfdata->gui.size_list);
492 /* fill the basic dialog with initial data and select it */
494 _basic_init_data_fill(E_Config_Dialog_Data *cfdata)
498 const char *init_font;
499 Evas_Font_Size init_size;
504 /* Get initial basic basic */
505 efd = e_font_default_get("e_basic_font");
510 E_Font_Properties *efp;
512 efp = e_font_fontconfig_name_parse(efd->font);
513 init_font = eina_stringshare_add(efp->name);
514 e_font_properties_free(efp);
516 init_size = efd->size;
519 /* Check based on efd */
520 ob = cfdata->gui.enabled;
522 e_widget_check_checked_set(ob, 0);
523 else if (!strcmp(efd->text_class, "default"))
524 e_widget_check_checked_set(ob, 0);
527 e_widget_check_checked_set(ob, 1);
528 cfdata->cur_enabled = 1;
531 /* Populate font list (Select current font) */
532 _font_list_load(cfdata, init_font);
534 /* Populate size list (Select current font) */
535 _size_list_load(cfdata, cfdata->font_scale_list, init_size, 1);
536 _size_list_load(cfdata, cfdata->font_px_list, init_size, 0);
540 _advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
547 /* Save current data */
548 if (cfdata->cur_class)
550 tc = cfdata->cur_class;
551 tc->size = cfdata->cur_size;
552 if (cfdata->cur_font)
553 eina_stringshare_replace(&tc->font, cfdata->cur_font);
554 if (cfdata->cur_style)
555 eina_stringshare_replace(&tc->style, cfdata->cur_style);
558 EINA_LIST_FOREACH(cfdata->text_classes, l, tc)
560 if (!tc->class_name) continue;
561 if (tc->enabled && tc->font)
565 name = e_font_fontconfig_name_get(tc->font, tc->style);
566 e_font_default_set(tc->class_name, name, tc->size);
567 eina_stringshare_del(name);
570 e_font_default_remove(tc->class_name);
573 EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.class_list), l, ili)
576 tc = e_widget_ilist_item_data_get(ili);
584 ic = e_icon_add(cfdata->evas);
585 e_util_icon_theme_set(ic, "dialog-ok-apply");
586 e_widget_ilist_nth_icon_set(cfdata->gui.class_list, i, ic);
589 e_widget_ilist_nth_icon_set(cfdata->gui.class_list, i, NULL);
593 /* Fallbacks configure */
594 e_font_fallback_clear();
596 if (cfdata->cur_fallbacks_enabled)
598 for (i = 0; i < e_widget_config_list_count(cfdata->gui.fallback_list); i++)
600 const char *fallback;
603 e_widget_config_list_nth_get(cfdata->gui.fallback_list, i);
604 if ((fallback) && (fallback[0]))
605 e_font_fallback_append(fallback);
611 e_config->font_hinting = cfdata->hinting;
612 e_config_save_queue();
613 /* e font hinting is different */
614 if (e_config->font_hinting == 0)
615 elm_config_font_hint_type_set(EVAS_FONT_HINTING_BYTECODE);
616 else if (e_config->font_hinting == 1)
617 elm_config_font_hint_type_set(EVAS_FONT_HINTING_AUTO);
618 else if (e_config->font_hinting == 2)
619 elm_config_font_hint_type_set(EVAS_FONT_HINTING_NONE);
621 #ifndef HAVE_WAYLAND_ONLY
622 e_xsettings_config_update();
629 _advanced_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
631 Evas_Object *ot, *ob, *of, *otb;
633 Eina_List *next = NULL;
635 E_Font_Fallback *eff;
639 otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
641 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
642 of = e_widget_frametable_add(evas, _("Font Classes"), 0);
643 ob = e_widget_ilist_add(evas, 16, 16, NULL);
644 cfdata->gui.class_list = ob;
645 _class_list_load(cfdata);
646 e_widget_size_min_set(ob, 110, 220);
647 e_widget_on_change_hook_set(ob, _adv_class_cb_change, cfdata);
648 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
649 ob = e_widget_check_add(evas, _("Enable Font Class"), NULL);
650 cfdata->gui.enabled = ob;
651 e_widget_on_change_hook_set(ob, _adv_enabled_font_cb_change, cfdata);
652 e_widget_disabled_set(ob, 1);
653 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0);
654 e_widget_table_object_append(ot, of, 0, 0, 1, 2, 1, 1, 1, 1);
656 of = e_widget_framelist_add(evas, _("Font"), 1);
657 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_font));
658 cfdata->gui.font_list = ob;
659 e_widget_on_change_hook_set(ob, _adv_font_cb_change, cfdata);
660 _font_list_load(cfdata, NULL);
661 e_widget_size_min_set(ob, 110, 220);
662 e_widget_framelist_object_append(of, ob);
663 e_widget_table_object_append(ot, of, 1, 0, 1, 2, 1, 1, 1, 1);
665 of = e_widget_framelist_add(evas, _("Style"), 1);
666 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_style));
667 cfdata->gui.style_list = ob;
668 e_widget_on_change_hook_set(ob, _adv_style_cb_change, cfdata);
669 e_widget_ilist_go(ob);
670 e_widget_size_min_set(ob, 110, 50);
671 e_widget_framelist_object_append(of, ob);
672 e_widget_table_object_append(ot, of, 2, 0, 1, 1, 1, 1, 1, 1);
674 of = e_widget_framelist_add(evas, _("Size"), 1);
675 ob = e_widget_ilist_add(evas, 16, 16, NULL);
676 cfdata->gui.size_list = ob;
677 e_widget_ilist_go(ob);
678 e_widget_size_min_set(ob, 110, 50);
679 e_widget_framelist_object_append(of, ob);
680 e_widget_table_object_append(ot, of, 2, 1, 1, 1, 1, 1, 1, 1);
682 ob = e_widget_font_preview_add
683 (evas, _("English 012 #!? 日本語 にほんご ソフト 中文 華語 한국"));
685 cfdata->gui.preview = ob;
686 e_widget_table_object_append(ot, ob, 0, 2, 3, 1, 1, 0, 1, 0);
688 e_widget_toolbook_page_append(otb, NULL, _("General Settings"),
689 ot, 1, 1, 1, 1, 0.5, 0.0);
691 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
692 of = e_widget_frametable_add(evas, _("Hinting"), 0);
693 rg = e_widget_radio_group_new(&(cfdata->hinting));
694 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_BYTECODE);
695 ob = e_widget_radio_add(evas, _("Bytecode"), 0, rg);
696 e_widget_disabled_set(ob, !option_enable);
697 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
698 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_AUTO);
699 ob = e_widget_radio_add(evas, _("Automatic"), 1, rg);
700 e_widget_disabled_set(ob, !option_enable);
701 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0);
702 option_enable = evas_font_hinting_can_hint(evas, EVAS_FONT_HINTING_NONE);
703 ob = e_widget_radio_add(evas, _("None"), 2, rg);
704 e_widget_disabled_set(ob, !option_enable);
705 e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 0, 1, 0);
706 e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 0);
708 of = e_widget_framelist_add(evas, _("Font Fallbacks"), 0);
709 ob = e_widget_config_list_add(evas, e_widget_entry_add, _("Fallback Name"), 2);
710 cfdata->gui.fallback_list = ob;
712 EINA_LIST_FOREACH(e_font_fallback_list(), next, eff)
714 e_widget_config_list_append(ob, eff->name);
717 ob = e_widget_check_add(evas, _("Enable Fallbacks"), &(cfdata->cur_fallbacks_enabled));
718 e_widget_config_list_object_append(cfdata->gui.fallback_list, ob,
719 0, 0, 2, 1, 1, 0, 1, 0);
720 e_widget_on_change_hook_set(ob, _adv_enabled_fallback_cb_change, cfdata);
721 e_widget_check_checked_set(ob, option_enable);
723 e_widget_framelist_object_append(of, cfdata->gui.fallback_list);
724 e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 0);
726 e_widget_toolbook_page_append(otb, NULL, _("Hinting / Fallbacks"),
727 ot, 1, 0, 1, 0, 0.5, 0.0);
729 e_widget_toolbook_page_show(otb, 0);
733 /* Private Font Class Functions */
735 _class_list_load(E_Config_Dialog_Data *cfdata)
740 if (!cfdata->gui.class_list) return;
741 evas = evas_object_evas_get(cfdata->gui.class_list);
742 evas_event_freeze(evas);
744 e_widget_ilist_freeze(cfdata->gui.class_list);
745 e_widget_ilist_clear(cfdata->gui.class_list);
747 /* Fill in Class Ilist */
748 for (next = cfdata->text_classes; next; next = next->next)
760 ic = e_icon_add(evas);
761 e_util_icon_theme_set(ic, "dialog-ok-apply");
765 e_widget_ilist_append(cfdata->gui.class_list, ic, tc->class_description, NULL, tc, NULL);
768 e_widget_ilist_header_append(cfdata->gui.class_list, NULL, tc->class_description);
771 e_widget_ilist_go(cfdata->gui.class_list);
772 e_widget_ilist_thaw(cfdata->gui.class_list);
774 evas_event_thaw(evas);
777 /* Called whenever class list selection changes */
779 _adv_class_cb_change(void *data, Evas_Object *obj __UNUSED__)
782 E_Config_Dialog_Data *cfdata;
785 if (!(cfdata = data)) return;
788 if (cfdata->cur_class)
790 tc = cfdata->cur_class;
791 tc->size = cfdata->cur_size;
793 eina_stringshare_replace(&tc->font, cfdata->cur_font);
794 eina_stringshare_replace(&tc->style, cfdata->cur_style);
796 if (cfdata->gui.style_list)
797 e_widget_ilist_unselect(cfdata->gui.style_list);
798 if (cfdata->gui.size_list)
799 e_widget_ilist_unselect(cfdata->gui.size_list);
800 if (cfdata->gui.font_list)
801 e_widget_ilist_unselect(cfdata->gui.font_list);
804 /* If no class is selected unselect all and return */
805 indx = e_widget_ilist_selected_get(cfdata->gui.class_list);
808 e_widget_disabled_set(cfdata->gui.enabled, 1);
809 e_widget_disabled_set(cfdata->gui.font_list, 1);
810 e_widget_disabled_set(cfdata->gui.size_list, 1);
811 e_widget_check_checked_set(cfdata->gui.enabled, 0);
812 if (cfdata->gui.font_list)
813 e_widget_ilist_unselect(cfdata->gui.font_list);
816 tc = e_widget_ilist_selected_data_get(cfdata->gui.class_list);
818 e_widget_check_valptr_set(cfdata->gui.enabled, (int*)&tc->enabled);
820 cfdata->cur_class = tc;
822 e_widget_disabled_set(cfdata->gui.enabled, 0);
823 e_widget_disabled_set(cfdata->gui.font_list, !tc->enabled);
824 e_widget_disabled_set(cfdata->gui.size_list, !tc->enabled);
825 if (!tc->enabled) return;
826 if (!cfdata->gui.font_list) return;
831 unsigned int sel = 0;
833 /* Select the configured font */
834 EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.font_list), l, ili)
839 if (tc->font && !strcasecmp(f, tc->font))
841 e_widget_ilist_selected_set(cfdata->gui.font_list, sel);
850 _adv_enabled_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
852 E_Config_Dialog_Data *cfdata;
855 if (!(cfdata = data)) return;
856 tc = e_widget_ilist_selected_data_get(cfdata->gui.class_list);
857 if ((!tc) || (!tc->enabled))
859 e_widget_disabled_set(cfdata->gui.font_list, 1);
860 e_widget_ilist_unselect(cfdata->gui.font_list);
861 e_widget_disabled_set(cfdata->gui.style_list, 1);
862 e_widget_ilist_unselect(cfdata->gui.font_list);
863 e_widget_disabled_set(cfdata->gui.size_list, 1);
864 e_widget_ilist_unselect(cfdata->gui.font_list);
866 e_widget_ilist_nth_icon_set(cfdata->gui.class_list, e_widget_ilist_selected_get(cfdata->gui.class_list), NULL);
870 e_widget_disabled_set(cfdata->gui.font_list, 0);
871 e_widget_disabled_set(cfdata->gui.style_list, 0);
872 e_widget_disabled_set(cfdata->gui.size_list, 0);
873 /* Search class list fot selected and enable Icon */
875 Evas_Object *icon = NULL;
877 tc->size = cfdata->cur_size;
878 eina_stringshare_replace(&tc->font, cfdata->cur_font);
881 icon = e_icon_add(cfdata->evas);
882 e_util_icon_theme_set(icon, "enlightenment");
885 e_widget_ilist_nth_icon_set(cfdata->gui.class_list, e_widget_ilist_selected_get(cfdata->gui.class_list), icon);
890 _size_cb_change(void *data)
892 E_Config_Dialog_Data *cfdata;
893 E_Font_Size_Data *size_data;
898 if (!(cfdata = size_data->cfdata)) return;
900 cfdata->cur_size = size_data->size;
902 _font_preview_update(cfdata);
904 if (!cfdata->gui.class_list) return;
906 for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
911 if (!(i = l->data)) continue;
912 if (!i->selected) continue;
914 tc = eina_list_nth(cfdata->text_classes, n);
915 tc->size = cfdata->cur_size;
920 _adv_font_cb_change(void *data, Evas_Object *obj __UNUSED__)
922 E_Config_Dialog_Data *cfdata;
926 if (!(cfdata = data)) return;
928 /* Set up the new font name for each selected class */
929 tc = e_widget_ilist_selected_data_get(cfdata->gui.class_list);
931 eina_stringshare_replace(&tc->font, cfdata->cur_font);
933 /* Load the style list */
934 if (cfdata->cur_font)
936 E_Font_Properties *efp;
939 efp = eina_hash_find(cfdata->font_hash, cfdata->cur_font);
940 evas_event_freeze(evas_object_evas_get(cfdata->gui.style_list));
942 e_widget_ilist_freeze(cfdata->gui.style_list);
943 e_widget_ilist_clear(cfdata->gui.style_list);
945 for (next = efp->styles; next; next = next->next)
950 e_widget_ilist_append(cfdata->gui.style_list, NULL, style,
954 e_widget_ilist_go(cfdata->gui.style_list);
955 e_widget_ilist_thaw(cfdata->gui.style_list);
957 evas_event_thaw(evas_object_evas_get(cfdata->gui.style_list));
960 /* select configured style from list */
961 if ((tc) && (tc->style))
963 for (n = 0; n < e_widget_ilist_count(cfdata->gui.style_list); n++)
967 f = e_widget_ilist_nth_label_get(cfdata->gui.style_list, n);
968 if ((!f) || (!tc->style)) continue;
969 if (!strcasecmp(f, tc->style))
971 e_widget_ilist_selected_set(cfdata->gui.style_list, n);
977 /* load and select size list */
980 cfdata->cur_size = tc->size;
981 _size_list_load(cfdata, cfdata->font_scale_list, tc->size, 1);
982 _size_list_load(cfdata, cfdata->font_px_list, tc->size, 0);
985 _font_preview_update(cfdata);
989 _size_list_load(E_Config_Dialog_Data *cfdata, Eina_List *size_list, Evas_Font_Size cur_size, int clear)
996 ob = cfdata->gui.size_list;
997 evas = evas_object_evas_get(ob);
999 evas_event_freeze(evas);
1001 e_widget_ilist_freeze(ob);
1002 if (clear) e_widget_ilist_clear(ob);
1004 for (next = size_list; next; next = next->next)
1006 E_Font_Size_Data *size_data;
1008 size_data = next->data;
1009 e_widget_ilist_append(ob, NULL, size_data->size_str, _size_cb_change,
1013 e_widget_ilist_go(ob);
1014 e_widget_ilist_thaw(ob);
1016 evas_event_thaw(evas);
1018 for (n = 0; n < e_widget_ilist_count(ob); n++)
1020 E_Font_Size_Data *size_data;
1022 if (!(size_data = e_widget_ilist_nth_data_get(ob, n))) continue;
1023 if (cur_size == size_data->size)
1025 e_widget_ilist_selected_set(ob, n);
1032 _font_list_load(E_Config_Dialog_Data *cfdata, const char *cur_font)
1041 ob = cfdata->gui.font_list;
1042 evas = evas_object_evas_get(ob);
1044 evas_event_freeze(evas);
1046 e_widget_ilist_freeze(ob);
1048 /* Load Hash a single time */
1049 if (!cfdata->font_hash)
1053 fonts = evas_font_available_list(evas);
1054 cfdata->font_hash = e_font_available_list_parse(fonts);
1055 eina_hash_foreach(cfdata->font_hash, _font_hash_cb, cfdata);
1056 if (cfdata->font_list)
1059 eina_list_sort(cfdata->font_list,
1060 eina_list_count(cfdata->font_list),
1063 evas_font_available_list_free(evas, fonts);
1067 if (cfdata->font_list)
1069 EINA_LIST_FOREACH(cfdata->font_list, next, f)
1071 e_widget_ilist_append(ob, NULL, f, NULL, NULL, f);
1075 e_widget_ilist_go(ob);
1076 e_widget_size_min_get(ob, &w, NULL);
1077 e_widget_size_min_set(ob, w, 250);
1078 e_widget_ilist_thaw(ob);
1080 evas_event_thaw(evas);
1082 if (!cur_font) return;
1084 /* Select Current Font */
1086 EINA_LIST_FOREACH(cfdata->font_list, next, f)
1088 if (!strcasecmp(f, cur_font))
1090 e_widget_ilist_selected_set(ob, n);
1098 _adv_style_cb_change(void *data, Evas_Object *obj __UNUSED__)
1100 E_Config_Dialog_Data *cfdata;
1105 if (!(cfdata = data)) return;
1107 /* Setup the new style name */
1108 EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.class_list), l, i)
1113 if (!i->selected) continue;
1115 tc = eina_list_nth(cfdata->text_classes, n);
1116 tmp = eina_stringshare_ref(cfdata->cur_style);
1117 eina_stringshare_del(tc->style);
1122 _font_preview_update(cfdata);
1125 /* Private Font Fallback Functions */
1127 _adv_enabled_fallback_cb_change(void *data, Evas_Object *obj __UNUSED__)
1129 E_Config_Dialog_Data *cfdata;
1131 if (!(cfdata = data)) return;
1132 e_widget_disabled_set(cfdata->gui.fallback_list,
1133 !cfdata->cur_fallbacks_enabled);
1137 _sort_fonts(const void *data1, const void *data2)
1139 if (!data1) return 1;
1140 if (!data2) return -1;
1141 return e_util_strcmp(data1, data2);
1145 _font_preview_update(E_Config_Dialog_Data *cfdata)
1147 /* update preview */
1148 if (cfdata->cur_font)
1152 name = e_font_fontconfig_name_get(cfdata->cur_font, cfdata->cur_style);
1153 e_widget_font_preview_font_set(cfdata->gui.preview, name,
1155 eina_stringshare_del(name);