Hi All, This is another attempt at the fixme in e_main.c. It adds a configuration API for Font Fallback and Default Fonts for different text classes as requested by the rasterman.
The API is currently exported using IPC through enlightenment_remote. This can easily be extended to libe. However it seemed like a good idea to stop here to get some feedback. Note: This seems uncover a bug in edje which can cause SEGV's when changing text classes. I am not sure where this is coming from. I have done some investigation but quickly get lost in edje. Also, to be able to save any changes you will need to nuke your ~/.e/e/config/e.cfg file as this adds two new entries to the configuration structure. Stafford
Index: src/bin/Makefile.am =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/Makefile.am,v retrieving revision 1.19 diff -u -r1.19 Makefile.am --- src/bin/Makefile.am 15 Mar 2005 10:25:47 -0000 1.19 +++ src/bin/Makefile.am 31 Mar 2005 05:24:16 -0000 @@ -43,8 +43,8 @@ e_xinerama.h \ e_table.h \ e_layout.h \ -e_test.h - +e_test.h \ +e_font.h enlightenment_SOURCES = \ e_main.c \ @@ -81,6 +81,7 @@ e_table.c \ e_layout.c \ e_test.c \ +e_font.c \ $(ENLIGHTENMENTHEADERS) enlightenment_LDFLAGS = -export-dynamic @e_libs@ @dlopen_libs@ Index: src/bin/e_config.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.c,v retrieving revision 1.26 diff -u -r1.26 e_config.c --- src/bin/e_config.c 24 Mar 2005 08:30:44 -0000 1.26 +++ src/bin/e_config.c 31 Mar 2005 05:24:17 -0000 @@ -26,6 +26,8 @@ static E_Config_DD *_e_config_edd = NULL; static E_Config_DD *_e_config_module_edd = NULL; static E_Config_DD *_e_config_binding_edd = NULL; +static E_Config_DD *_e_config_font_fallback_edd = NULL; +static E_Config_DD *_e_config_font_default_edd = NULL; /* externally accessible functions */ int @@ -49,6 +51,24 @@ E_CONFIG_VAL(D, T, modifiers, INT); E_CONFIG_VAL(D, T, action, INT); + _e_config_font_default_edd = E_CONFIG_DD_NEW("E_Font_Default", + E_Font_Default); +#undef T +#undef D +#define T E_Font_Default +#define D _e_config_font_default_edd + E_CONFIG_VAL(D, T, text_class, STR); + E_CONFIG_VAL(D, T, font, STR); + E_CONFIG_VAL(D, T, size, INT); + + _e_config_font_fallback_edd = E_CONFIG_DD_NEW("E_Font_Fallback", + E_Font_Fallback); +#undef T +#undef D +#define T E_Font_Fallback +#define D _e_config_font_fallback_edd + E_CONFIG_VAL(D, T, name, STR); + _e_config_edd = E_CONFIG_DD_NEW("E_Config", E_Config); #undef T #undef D @@ -68,6 +88,8 @@ E_CONFIG_VAL(D, T, zone_desks_y_count, INT); E_CONFIG_LIST(D, T, modules, _e_config_module_edd); E_CONFIG_LIST(D, T, bindings, _e_config_binding_edd); + E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd); + E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd); e_config = e_config_domain_load("e", _e_config_edd); if (!e_config) @@ -143,6 +165,30 @@ eb->action = E_BINDING_ACTION_MENU; e_config->bindings = evas_list_append(e_config->bindings, eb); } + { + E_Font_Fallback* eff; + + eff = E_NEW(E_Font_Fallback, 1); + eff->name = strdup("Kochi-Gothic"); + e_config->font_fallbacks = evas_list_append(e_config->font_fallbacks, + eff); + + eff = E_NEW(E_Font_Fallback, 1); + eff->name = strdup("Baekmuk-Dotum"); + e_config->font_fallbacks = evas_list_append(e_config->font_fallbacks, + eff); + + } + { + E_Font_Default* efd; + + efd = E_NEW(E_Font_Fallback, 1); + efd->text_class = strdup("title_bar"); + efd->font = strdup("Vera"); + efd->size = 10; + e_config->font_defaults = evas_list_append(e_config->font_defaults, efd); + + } e_config_save_queue(); } @@ -180,12 +226,34 @@ e_config->bindings = evas_list_remove_list(e_config->bindings, e_config->bindings); E_FREE(eb); } + while (e_config->font_fallbacks) + { + E_Font_Fallback *eff; + + eff = e_config->font_fallbacks->data; + e_config->font_fallbacks = evas_list_remove_list(e_config->font_fallbacks, e_config->font_fallbacks); + E_FREE(eff->name); + E_FREE(eff); + } + while (e_config->font_defaults) + { + E_Font_Default *efd; + + efd = e_config->font_defaults->data; + e_config->font_defaults = evas_list_remove_list(e_config->font_defaults, e_config->font_defaults); + E_FREE(efd->text_class); + E_FREE(efd->font); + E_FREE(efd); + } + E_FREE(e_config->desktop_default_background); E_FREE(e_config); } E_CONFIG_DD_FREE(_e_config_edd); E_CONFIG_DD_FREE(_e_config_module_edd); E_CONFIG_DD_FREE(_e_config_binding_edd); + E_CONFIG_DD_FREE(_e_config_font_default_edd); + E_CONFIG_DD_FREE(_e_config_font_fallback_edd); return 1; } Index: src/bin/e_config.h =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.h,v retrieving revision 1.11 diff -u -r1.11 e_config.h --- src/bin/e_config.h 11 Mar 2005 13:09:06 -0000 1.11 +++ src/bin/e_config.h 31 Mar 2005 05:24:17 -0000 @@ -64,6 +64,8 @@ int use_virtual_roots; Evas_List *modules; Evas_List *bindings; + Evas_List *font_fallbacks; + Evas_List *font_defaults; }; struct _E_Config_Module Index: src/bin/e_includes.h =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_includes.h,v retrieving revision 1.9 diff -u -r1.9 e_includes.h --- src/bin/e_includes.h 15 Mar 2005 10:26:05 -0000 1.9 +++ src/bin/e_includes.h 31 Mar 2005 05:24:17 -0000 @@ -33,3 +33,4 @@ #include "e_xinerama.h" #include "e_table.h" #include "e_layout.h" +#include "e_font.h" Index: src/bin/e_ipc.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_ipc.c,v retrieving revision 1.9 diff -u -r1.9 e_ipc.c --- src/bin/e_ipc.c 17 Mar 2005 01:30:50 -0000 1.9 +++ src/bin/e_ipc.c 31 Mar 2005 05:24:18 -0000 @@ -213,6 +213,253 @@ bg, strlen(bg) + 1); } break; + case E_IPC_OP_FONT_AVAILABLE_LIST: + { + Evas_List *fonts_available, *l; + int bytes; + char *font_name, *data, *p; + + bytes = 0; + fonts_available = e_font_available_list(); + printf("ipc font av: %d\n", fonts_available); + for (l = fonts_available; l; l = l->next) + { + font_name = evas_list_data(l); + bytes += strlen(font_name) + 1; + } + + data = malloc(bytes); + p = data; + for (l = fonts_available; l; l = l->next) + { + font_name = evas_list_data(l); + strcpy(p, font_name); + p += strlen(font_name); + *p = 0; + p++; + } + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_FONT_AVAILABLE_LIST_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + + e_font_available_list_free(fonts_available); + free(data); + } + break; + case E_IPC_OP_FONT_APPLY: + { + e_font_apply(); + } + break; + case E_IPC_OP_FONT_FALLBACK_CLEAR: + { + e_font_fallback_clear(); + } + break; + case E_IPC_OP_FONT_FALLBACK_APPEND: + { + char * font_name; + font_name = malloc(e->size + 1); + font_name[e->size] = 0; + memcpy(font_name, e->data, e->size); + e_font_fallback_append(font_name); + free(font_name); + + e_config_save_queue(); + } + break; + case E_IPC_OP_FONT_FALLBACK_PREPEND: + { + char * font_name; + font_name = malloc(e->size + 1); + font_name[e->size] = 0; + memcpy(font_name, e->data, e->size); + e_font_fallback_prepend(font_name); + free(font_name); + + e_config_save_queue(); + } + break; + case E_IPC_OP_FONT_FALLBACK_LIST: + { + Evas_List *fallbacks, *l; + int bytes; + E_Font_Fallback *eff; + char *data, *p; + + bytes = 0; + fallbacks = e_font_fallback_list(); + for (l = fallbacks; l; l = l->next) + { + eff = evas_list_data(l); + bytes += strlen(eff->name) + 1; + } + data = malloc(bytes); + p = data; + for (l = fallbacks; l; l = l->next) + { + eff = evas_list_data(l); + strcpy(p, eff->name); + p += strlen(eff->name); + *p = 0; + p++; + } + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_FONT_FALLBACK_LIST_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + free(data); + + } + break; + case E_IPC_OP_FONT_FALLBACK_REMOVE: + { + char * font_name; + font_name = malloc(e->size + 1); + font_name[e->size] = 0; + memcpy(font_name, e->data, e->size); + e_font_fallback_remove(font_name); + free(font_name); + + e_config_save_queue(); + } + break; + case E_IPC_OP_FONT_DEFAULT_SET: + { + char * p; + char * font_name; + char * text_class; + int font_size; + + + p = e->data; + + /* Make sure our data is packed for us <str>0<str>0 */ + if( p[e->size - 1] != 0) { + break; + } + + text_class = strdup(p); + + p += strlen(text_class) + 1; + font_name = strdup(p); + + p += strlen(font_name) + 1; + font_size = atoi(p); + + e_font_default_set(text_class, font_name, font_size); + + free(font_name); + free(text_class); + + e_config_save_queue(); + } + break; + case E_IPC_OP_FONT_DEFAULT_GET: + { + int bytes; + E_Font_Default *efd; + char *data, *p, *text_class; + + text_class = malloc(e->size + 1); + text_class[e->size] = 0; + memcpy(text_class, e->data, e->size); + + efd = e_font_default_get (text_class); + + free(text_class); + + bytes = 0; + if (efd) { + bytes += strlen(efd->text_class) + 1; + bytes += strlen(efd->font) + 1; + bytes++; /* efd->size */ + } + + data = malloc(bytes); + p = data; + + if (efd) { + strcpy(p, efd->text_class); + p += strlen(efd->text_class); + *p = 0; + p++; + + strcpy(p, efd->font); + p += strlen(efd->font); + *p = 0; + p++; + + /* FIXME: should this be packed like this (int to char) ? */ + *p = (char) efd->size; + p++; + } + + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_FONT_DEFAULT_GET_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + free(data); + } + break; + case E_IPC_OP_FONT_DEFAULT_REMOVE: + { + char * text_class; + text_class = malloc(e->size + 1); + text_class[e->size] = 0; + memcpy(text_class, e->data, e->size); + e_font_default_remove(text_class); + free(text_class); + + e_config_save_queue(); + } + break; + case E_IPC_OP_FONT_DEFAULT_LIST: + { + Evas_List *defaults, *l; + int bytes; + E_Font_Default *efd; + char *data, *p; + + bytes = 0; + defaults = e_font_default_list(); + for (l = defaults; l; l = l->next) + { + efd = l->data; + bytes += strlen(efd->text_class) + 1; + bytes += strlen(efd->font) + 1; + bytes++; /* efd->size */ + } + data = malloc(bytes); + p = data; + for (l =defaults; l; l = l->next) + { + efd = l->data; + strcpy(p, efd->text_class); + p += strlen(efd->text_class); + *p = 0; + p++; + strcpy(p, efd->font); + p += strlen(efd->font); + *p = 0; + p++; + /* FIXME: should this be packed like this (int to char) ? */ + *p = (char) efd->size; + p++; + } + ecore_ipc_client_send(e->client, + E_IPC_DOMAIN_REPLY, + E_IPC_OP_FONT_DEFAULT_LIST_REPLY, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + data, bytes); + free(data); + + } + break; case E_IPC_OP_RESTART: { restart = 1; Index: src/bin/e_ipc.h =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_ipc.h,v retrieving revision 1.8 diff -u -r1.8 e_ipc.h --- src/bin/e_ipc.h 17 Mar 2005 01:30:50 -0000 1.8 +++ src/bin/e_ipc.h 31 Mar 2005 05:24:18 -0000 @@ -23,6 +23,21 @@ E_IPC_OP_BG_SET, E_IPC_OP_BG_GET, E_IPC_OP_BG_GET_REPLY, + E_IPC_OP_FONT_AVAILABLE_LIST, + E_IPC_OP_FONT_AVAILABLE_LIST_REPLY, + E_IPC_OP_FONT_APPLY, + E_IPC_OP_FONT_FALLBACK_CLEAR, + E_IPC_OP_FONT_FALLBACK_APPEND, + E_IPC_OP_FONT_FALLBACK_PREPEND, + E_IPC_OP_FONT_FALLBACK_LIST, + E_IPC_OP_FONT_FALLBACK_LIST_REPLY, + E_IPC_OP_FONT_FALLBACK_REMOVE, + E_IPC_OP_FONT_DEFAULT_SET, + E_IPC_OP_FONT_DEFAULT_GET, + E_IPC_OP_FONT_DEFAULT_GET_REPLY, + E_IPC_OP_FONT_DEFAULT_REMOVE, + E_IPC_OP_FONT_DEFAULT_LIST, + E_IPC_OP_FONT_DEFAULT_LIST_REPLY, E_IPC_OP_RESTART, E_IPC_OP_LAST } E_Ipc_Op; Index: src/bin/e_main.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v retrieving revision 1.57 diff -u -r1.57 e_main.c --- src/bin/e_main.c 22 Mar 2005 09:09:12 -0000 1.57 +++ src/bin/e_main.c 31 Mar 2005 05:24:21 -0000 @@ -221,6 +221,9 @@ } _e_main_shutdown_push(ecore_evas_shutdown); + + /*** Finished loading subsystems, Loading WM Specifics ***/ + /* setup directories we will be using for configurations sotrage etc. */ if (!_e_main_dirs_init()) { @@ -247,9 +250,15 @@ /* setup edje to animate @ e_config->framerate frames per sec. */ edje_frametime_set(1.0 / e_config->framerate); - /* FIXME: this is just appending Kochi if Vera doesnt have it. We need - * a full config support subsystem for this */ - edje_fontset_append_set("Kochi-Gothic,Baekmuk-Dotum"); + + /* init font system */ + if (!e_font_init()) + { + e_error_message_show("Enlightenment cannot set up its font system."); + _e_main_shutdown(-1); + } + _e_main_shutdown_push(e_font_shutdown); + e_font_apply(); e_canvas_recache(); /* setup init status window/screen */ @@ -376,7 +385,7 @@ return 0; } -/* FIXME: make save to delete within a callback */ +/* FIXME: make safe to delete within a callback */ E_Before_Idler * e_main_idler_before_add(int (*func) (void *data), void *data, int once) { Index: src/bin/e_remote_main.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_remote_main.c,v retrieving revision 1.9 diff -u -r1.9 e_remote_main.c --- src/bin/e_remote_main.c 17 Mar 2005 01:30:50 -0000 1.9 +++ src/bin/e_remote_main.c 31 Mar 2005 05:24:23 -0000 @@ -36,10 +36,12 @@ #define SIMPLE_REQ 0 #define SIMPLE_STR_REQ 1 #define FULL_FUNC 2 +#define MULTI_STR_REQ 3 #define OREQ(opt, desc, ipc, rep) {opt, desc, 0, rep, SIMPLE_REQ, ipc, NULL} #define OSTR(opt, desc, ipc, rep) {opt, desc, 1, rep, SIMPLE_STR_REQ, ipc, NULL} #define OFNC(opt, desc, param, fn, rep) {opt, desc, param, rep, SIMPLE_FUNC, 0, fn} +#define OMUL(opt, desc, ipc, rep, argc) {opt, desc, argc, rep, MULTI_STR_REQ, ipc, NULL} E_IPC_Opt_Handler handlers[] = { @@ -49,6 +51,17 @@ OSTR("-module-disable", "Disable module OPT1 if not disabled", E_IPC_OP_MODULE_DISABLE, 0), OREQ("-module-list", "List all loaded modules and their states", E_IPC_OP_MODULE_LIST, 1), OSTR("-bg-set", "Set the background edje file to be OPT1", E_IPC_OP_BG_SET, 0), + OSTR("-font-fallback-remove", "Remove OPT1 from the fontset", E_IPC_OP_FONT_FALLBACK_REMOVE, 0), + OSTR("-font-fallback-prepend", "Prepend OPT1 to the fontset", E_IPC_OP_FONT_FALLBACK_PREPEND, 0), + OSTR("-font-fallback-append", "Append OPT1 to the fontset", E_IPC_OP_FONT_FALLBACK_APPEND, 0), + OREQ("-font-apply", "Apply changes made to the font system", E_IPC_OP_FONT_APPLY, 0), + OREQ("-font-fallback-list", "List the fallback fonts in order", E_IPC_OP_FONT_FALLBACK_LIST, 1), + OREQ("-font-available-list", "List available fonts", E_IPC_OP_FONT_AVAILABLE_LIST, 1), + OREQ("-font-fallback-clear", "Clear font fallback list", E_IPC_OP_FONT_FALLBACK_CLEAR, 0), + OSTR("-font-default-get", "List the default font associated with OPT1", E_IPC_OP_FONT_DEFAULT_GET, 1), + OSTR("-font-default-remove", "Remove the default text class OPT1", E_IPC_OP_FONT_DEFAULT_REMOVE, 0), + OREQ("-font-default-list", "List all configured text classes", E_IPC_OP_FONT_DEFAULT_LIST, 1), + OMUL("-font-default-set", "Set textclass (OPT1) font (OPT2) and size (OPT3)", E_IPC_OP_FONT_DEFAULT_SET, 0, 3), OREQ("-restart", "Restart E17", E_IPC_OP_RESTART, 0) }; @@ -196,8 +209,10 @@ ecore_app_args_get(&argc, &argv); for (i = 1; i < argc; i++) { - char *v; + char *v, *p; int j; + int k; + int data_size; for (j = 0; j < (int)(sizeof(handlers) / sizeof(E_IPC_Opt_Handler)); j++) { @@ -231,6 +246,29 @@ 0/*ref*/, 0/*ref_to*/, 0/*response*/, v, strlen(v)); break; + case MULTI_STR_REQ: + /* pack up the data "<str>0<str>0" */ + data_size = 0; + for(k = 0; k < handler->num_params; k++) { + data_size += strlen(argv[ i + 1 + k ]); + data_size++; /* NULL Pad */ + } + v = malloc(data_size); + p = v; + for(k = 0; k < handler->num_params; k++) { + strcpy(p, argv[ i + 1 + k]); + p += strlen(argv[ i + 1 + k]); + *p = 0; + p++; + } + ecore_ipc_server_send(_e_ipc_server, + E_IPC_DOMAIN_REQUEST, + handler->simple_request_id, + 0/*ref*/, 0/*ref_to*/, 0/*response*/, + v, data_size); + free(v); + + break; case FULL_FUNC: handler->func(argv + i + 1); break; @@ -257,7 +295,7 @@ Ecore_Ipc_Event_Server_Del *e; e = event; - return 1; + return 1; } static int @@ -300,6 +338,107 @@ else printf("REPLY: MODULE NONE\n"); break; + case E_IPC_OP_FONT_FALLBACK_LIST_REPLY: + if (e->data) + { + char *p; + + p = e->data; + while (p < (char *)(e->data + e->size)) + { + char *name; + + name = p; + p += strlen(name); + if (p < (char *)(e->data + e->size)) + { + printf("REPLY: FALLBACK NAME=\"%s\"\n", name); + } + p++; + } + } + else + printf("REPLY: FALLBACK NONE\n"); + break; + case E_IPC_OP_FONT_AVAILABLE_LIST_REPLY: + if (e->data) + { + char *p; + + p = e->data; + while (p < (char *)(e->data + e->size)) + { + char *name; + name = p; + p += strlen(name); + if (p < (char *)(e->data + e->size)) + { + printf("REPLY: AVAILABLE NAME=\"%s\"\n", name); + } + p++; + } + } + else + printf("REPLY: AVAILABLE NONE\n"); + break; + case E_IPC_OP_FONT_DEFAULT_GET_REPLY: + if (e->data) + { + char *text_class, *name; + char *p; + char size; + + p = e->data; + + text_class = p; + p += strlen(text_class) + 1; + if (p < (char *)(e->data + e->size)) + { + name = p; + p += strlen(name) + 1; + if (p < (char *)(e->data + e->size)) + { + size = *p; + printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%i\n", + text_class, name, (int)size); + p++; + + } + } + } + else + printf("REPLY: DEFAULT NONE\n"); + break; + case E_IPC_OP_FONT_DEFAULT_LIST_REPLY: + if (e->data) + { + char *text_class, *name; + char *p; + char size; + + p = e->data; + + while (p < (char *)(e->data + e->size)) + { + text_class = p; + p += strlen(text_class) + 1; + if (p < (char *)(e->data + e->size)) + { + name = p; + p += strlen(name) + 1; + if (p < (char *)(e->data + e->size)) + { + size = *p; + printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%i\n", + text_class, name, (int)size); + p++; + } + } + } + } + else + printf("REPLY: DEFAULT NONE\n"); + break; default: break; }
/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" #include "config.h" /* TODO List: * - export to libe * - use e_path to search for available fonts */ static Evas_List *_e_font_defaults; /* MRU <E_Font_Default> */ static Evas_List *_e_font_fallbacks; /* <E_Font_Fallback> */ Evas_List *_e_font_font_dir_available_get (Evas_List * available_fonts, const char *font_dir); int e_font_init (void) { /* just get the pointers into the config */ _e_font_defaults = e_config->font_defaults; _e_font_fallbacks = e_config->font_fallbacks; return 1; } int e_font_shutdown (void) { /* e_config will do this */ return 1; } void e_font_apply (void) { char buf[PATH_MAX]; Evas_List *next; E_Font_Fallback *eff; E_Font_Default *efd; /* setup edje fallback list */ next = _e_font_fallbacks; if (next) { eff = evas_list_data (next); strncpy (buf, eff->name, PATH_MAX - 1); next = evas_list_next (next); } else { edje_fontset_append_set (NULL); } while (next) { eff = evas_list_data (next); strcat (buf, ","); strcat (buf, eff->name); next = evas_list_next (next); } edje_fontset_append_set (buf); /* setup edje text classes */ next = _e_font_defaults; while (next) { efd = evas_list_data (next); edje_text_class_set (efd->text_class, efd->font, efd->size); next = evas_list_next (next); } } Evas_List * e_font_available_list (void) { Evas_List *available; available = NULL; /* use e_path for this */ available = _e_font_font_dir_available_get (available, "~/.e/e/fonts"); available = _e_font_font_dir_available_get (available, PACKAGE_DATA_DIR "/data/fonts"); return available; } void e_font_available_list_free (Evas_List * available) { char *font_name; Evas_List *l; for (l = available; l; l = l->next) { font_name = evas_list_data (l); available = evas_list_remove (available, l); free (font_name); } } Evas_List * _e_font_font_dir_available_get (Evas_List * available_fonts, const char *font_dir) { char buf[4096]; FILE *f; sprintf (buf, "%s/fonts.alias", font_dir); f = fopen (buf, "r"); if (f) { char fname[4096], fdef[4096]; Evas_List *next; /* read font alias lines */ while (fscanf (f, "%4090s %[^\n]\n", fname, fdef) == 2) { /* skip comments */ if ((fdef[0] == '!') || (fdef[0] == '#')) continue; /* skip duplicates */ next = available_fonts; while (next) { if (strcmp ((char *) evas_list_data (next), fname) == 0) continue; next = evas_list_next (next); } available_fonts = evas_list_append (available_fonts, strdup (fname)); } fclose (f); } return available_fonts; } void e_font_fallback_clear (void) { Evas_List *next; next = _e_font_fallbacks; while (next) { E_Font_Fallback *eff; eff = evas_list_data (next); _e_font_fallbacks = evas_list_remove_list (_e_font_fallbacks, next); E_FREE (eff->name); E_FREE (eff); next = evas_list_next (next); } return; } void e_font_fallback_append (const char *font) { E_Font_Fallback *eff; e_font_fallback_remove (font); eff = E_NEW (E_Font_Fallback, 1); eff->name = strdup (font); _e_font_fallbacks = evas_list_append (_e_font_fallbacks, eff); return; } void e_font_fallback_prepend (const char *font) { E_Font_Fallback *eff; e_font_fallback_remove (font); eff = E_NEW (E_Font_Fallback, 1); eff->name = strdup (font); _e_font_fallbacks = evas_list_prepend (_e_font_fallbacks, eff); return; } void e_font_fallback_remove (const char *font) { Evas_List *next; next = _e_font_fallbacks; while (next) { E_Font_Fallback *eff; eff = evas_list_data (next); if (strcmp (eff->name, font) == 0) { _e_font_fallbacks = evas_list_remove_list (_e_font_fallbacks, next); E_FREE (eff->name); E_FREE (eff); break; } next = evas_list_next (next); } return; } Evas_List * e_font_fallback_list (void) { return _e_font_fallbacks; } void e_font_default_set (const char *text_class, const char *font, int size) { E_Font_Default *efd; Evas_List *next; /* search for the text class */ next = _e_font_defaults; while (next) { efd = evas_list_data (next); if (strcmp (efd->text_class, text_class) == 0) { E_FREE (efd->font); efd->font = strdup (font); efd->size = size; /* move to the front of the list */ _e_font_defaults = evas_list_remove_list (_e_font_defaults, next); _e_font_defaults = evas_list_prepend (_e_font_defaults, efd); return; } next = evas_list_next (next); } /* the text class doesnt exist */ efd = E_NEW (E_Font_Default, 1); efd->text_class = strdup (text_class); efd->font = strdup (font); efd->size = size; _e_font_defaults = evas_list_prepend (_e_font_defaults, efd); return; } /* * returns a pointer to the data, return null if nothing if found. */ E_Font_Default * e_font_default_get (const char *text_class) { E_Font_Default *efd; Evas_List *next; /* search for the text class */ next = _e_font_defaults; while (next) { efd = evas_list_data (next); if (strcmp (efd->text_class, text_class) == 0) { /* move to the front of the list */ _e_font_defaults = evas_list_remove_list (_e_font_defaults, next); _e_font_defaults = evas_list_prepend (_e_font_defaults, efd); return efd; } next = evas_list_next (next); } return NULL; } void e_font_default_remove (const char *text_class) { E_Font_Default *efd; Evas_List *next; /* search for the text class */ next = _e_font_defaults; while (next) { efd = evas_list_data (next); if (strcmp (efd->text_class, text_class) == 0) { _e_font_defaults = evas_list_remove_list (_e_font_defaults, next); E_FREE (efd->text_class); E_FREE (efd->font); E_FREE (efd); return; } next = evas_list_next (next); } return; } Evas_List * e_font_default_list (void) { return _e_font_defaults; }
/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #ifdef E_TYPEDEFS typedef struct _E_Font_Default E_Font_Default; typedef struct _E_Font_Fallback E_Font_Fallback; #else #ifndef E_FONT_H #define E_FONT_H struct _E_Font_Default { char * text_class; char * font; int size; }; struct _E_Font_Fallback { char * name; }; EAPI int e_font_init(void); EAPI int e_font_shutdown(void); EAPI void e_font_apply(void); EAPI Evas_List * e_font_available_list(void); EAPI void e_font_available_list_free(Evas_List * available); /* global font fallbacks */ EAPI void e_font_fallback_clear(void); EAPI void e_font_fallback_append(const char * font); EAPI void e_font_fallback_prepend(const char * font); EAPI void e_font_fallback_remove(const char * font); EAPI Evas_List * e_font_fallback_list(void); /* setup edje text classes */ EAPI void e_font_default_set(const char * text_class, const char * font, int size); EAPI E_Font_Default * e_font_default_get(const char * text_class); EAPI void e_font_default_remove(const char * text_class); EAPI Evas_List * e_font_default_list(void); #endif #endif
enlightenment_remote -display localhost:1.0 -font-default-set menu_item Vera 13 enlightenment_remote -display localhost:1.0 -font-apply <Wait for some time> Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1209872256 (LWP 29685)] 0xb7e3e3cd in eet_read (ef=0x84bf980, name=0x843a1a0 "P\0320\b)\\\217\uffff\uffff(\uffff?HXF\b46\uffffC", size_ret=0xbffeb080) at eet_lib.c:746 746 if (eet_string_match(ef->header->directory->hash[hash].node[i].n ame, name)) (gdb) bt #0 0xb7e3e3cd in eet_read (ef=0x84bf980, name=0x843a1a0 "P\0320\b)\\\217\uffff\uffff(\uffff?HXF\b46\uffffC", size_ret=0xbffeb080) at eet_lib.c:746 #1 0xb7f331e4 in evas_font_load (evas=0x80f1f50, name=0x843a438 "fonts/Edje Vera,P\0320\b)\\\217\uffff\uffff(\uffff?HXF\b46\uffffC", source=0x81d5e78 "/home/shorne/local/share/enlightenment/data/themes/default .edj", size=10) at evas_font_dir.c:172 #2 0xb7f24d5c in evas_object_text_font_set (obj=0x80a9d78, font=0x843a438 "fonts/Edje Vera,P\0320\b)\\\217\uffff\uffff(\uffff?HXF\b46\uffffC", size=10) at evas_object_text.c:167 #3 0xb7fe461d in _edje_part_recalc_single (ed=0x80cf210, ep=0x80a9a68, desc=0x820d3a8, chosen_desc=0x820d3a8, rel1_to_x=0x80b43d8, rel1_to_y=0x0, rel2_to_x=0x80b9170, rel2_to_y=0x0, confine_to=0x0, params=0xbffed2f0, flags=3) at edje_calc.c:548 #4 0xb7fe5706 in _edje_part_recalc (ed=0x80cf210, ep=0x80a9a68, flags=3) at edje_calc.c:876 #5 0xb7fe3459 in _edje_recalc (ed=0x80cf210) at edje_calc.c:162 #6 0xb7ff8264 in _edje_thaw (ed=0x80cf210) at edje_util.c:1561 #7 0xb7ff5280 in edje_object_thaw (obj=0x81ee530) at edje_util.c:118 #8 0xb7ff50d9 in edje_thaw () at edje_util.c:40 #9 0x08053a56 in _e_main_cb_idler_before (data=0x0) at e_main.c:775 #10 0xb7f76f66 in _ecore_idle_enterer_call () at ecore_idle_enterer.c:78 #11 0xb7f79f00 in _ecore_main_loop_iterate_internal (once_only=0) ---Type <return> to continue, or q <return> to quit--- at ecore_main.c:453 #12 0xb7f79497 in ecore_main_loop_begin () at ecore_main.c:79 #13 0x08052e38 in main (argc=1, argv=0xbffffa24) at e_main.c:366 enlightenment_remote -display localhost:1.0 -font-default-set menu_item Kochi-Gothic 17 enlightenment_remote -display localhost:1.0 -font-apply <Everything works fine> enlightenment_remote -display localhost:1.0 -font-default-set menu_item Kochi-Gothic 13 enlightenment_remote -display localhost:1.0 -font-apply #0 0xb7fe33fe in _edje_recalc (ed=0x8630748) at edje_calc.c:152 (There are no parts on the edje) #1 0xb7ff5a23 in edje_text_class_set (text_class=0x80aeab8 "menu_item", font=0x80aed10 "Kochi-Gothic", size=17) at edje_util.c:357 #2 0x08077339 in e_font_apply () at e_font.c:50 #3 0x080557e8 in _e_ipc_cb_client_data (data=0x0, type=65, event=0x8632fd0) at e_ipc.c:222 #4 0xb7f75456 in _ecore_event_call () at ecore_events.c:394 #5 0xb7f7a27c in _ecore_main_loop_iterate_internal (once_only=0) at ecore_main.c:605 #6 0xb7f79497 in ecore_main_loop_begin () at ecore_main.c:79 #7 0x08052e38 in main (argc=1, argv=0xbffffa24) at e_main.c:366 enlightenment_remote -display localhost:1.0 -font-default-set title_bar Vera 35 enlightenment_remote -display localhost:1.0 -font-apply Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1209872256 (LWP 29921)] 0xb7e3e3cd in eet_read (ef=0x815cab0, name=0x8323e00 "\210\2312\b\232\231\231\231\231\231\uffff?\uffffo!\b50\uffffC", size_ret=0xbffeb080) at eet_lib.c:746 746 if (eet_string_match(ef->header->directory->hash[hash].node[i].name, name)) (gdb) bt #0 0xb7e3e3cd in eet_read (ef=0x815cab0, name=0x8323e00 "\210\2312\b\232\231\231\231\231\231\uffff?\uffffo!\b50\uffffC", size_ret=0xbffeb080) at eet_lib.c:746 #1 0xb7f331e4 in evas_font_load (evas=0x80e49c8, name=0x822b618 "fonts/Edje Vera,\210\2312\b\232\231\231\231\231\231\uffff?\uffffo!\b50\uffffC", source=0x81a85f0 "/home/shorne/local/share/enlightenment/data/themes/default.edj", size=7) at evas_font_dir.c:172 #2 0xb7f24d5c in evas_object_text_font_set (obj=0x81a84f0, font=0x822b618 "fonts/Edje Vera,\210\2312\b\232\231\231\231\231\231\uffff?\uffffo!\b50\uffffC", size=7) at evas_object_text.c:167 #3 0xb7fe461d in _edje_part_recalc_single (ed=0x8195220, ep=0x81a0b08, desc=0x81a6840, chosen_desc=0x81a6840, rel1_to_x=0x81a0330, rel1_to_y=0x0, rel2_to_x=0x0, rel2_to_y=0x0, confine_to=0x0, params=0xbffed2f0, flags=3) at edje_calc.c:548 #4 0xb7fe5706 in _edje_part_recalc (ed=0x8195220, ep=0x81a0b08, flags=3) at edje_calc.c:876 #5 0xb7fe3459 in _edje_recalc (ed=0x8195220) at edje_calc.c:162 #6 0xb7ff8264 in _edje_thaw (ed=0x8195220) at edje_util.c:1561 #7 0xb7ff5280 in edje_object_thaw (obj=0x819fee0) at edje_util.c:118 #8 0xb7ff50d9 in edje_thaw () at edje_util.c:40 #9 0x08053a56 in _e_main_cb_idler_before (data=0x0) at e_main.c:775 #10 0xb7f76f66 in _ecore_idle_enterer_call () at ecore_idle_enterer.c:78 #11 0xb7f79f00 in _ecore_main_loop_iterate_internal (once_only=0) at ecore_main.c:453 #12 0xb7f79497 in ecore_main_loop_begin () at ecore_main.c:79 #13 0x08052e38 in main (argc=1, argv=0xbffffa24) at e_main.c:366 enlightenment_remote -display localhost:1.0 -font-default-set title_bar ZYSong 20 enlightenment_remote -display localhost:1.0 -font-apply enlightenment_remote -display localhost:1.0 -font-default-set title_bar ZYSong 13 enlightenment_remote -display localhost:1.0 -font-apply enlightenment_remote -display localhost:1.0 -font-default-set title_bar ZYSong 10 enlightenment_remote -display localhost:1.0 -font-apply enlightenment_remote -display localhost:1.0 -font-default-set title_bar ZYSong 5 enlightenment_remote -display localhost:1.0 -font-apply <everything working fine> enlightenment_remote -display localhost:1.0 -font-default-set title_bar ZYSong 9 enlightenment_remote -display localhost:1.0 -font-apply Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1209872256 (LWP 29949)] 0xb7e3cb8e in eet_string_match (s1=0x10 <Address 0x10 out of bounds>, s2=0x844b9e8 "xs\f\b\uffff\uffff\uffff\uffff\uffff\uffff\uffff?\uffffz#\b53\uffffC") at eet_lib.c:190 190 if (*s1 != *s2) return 0; (gdb) bt #0 0xb7e3cb8e in eet_string_match (s1=0x10 <Address 0x10 out of bounds>, s2=0x844b9e8 "xs\f\b\uffff\uffff\uffff\uffff\uffff\uffff\uffff?\uffffz#\b53\uffffC") at eet_lib.c:190 #1 0xb7e3e3d5 in eet_read (ef=0x841e1a8, name=0x844b9e8 "xs\f\b\uffff\uffff\uffff\uffff\uffff\uffff\uffff?\uffffz#\b53\uffffC", size_ret=0xbffeb080) at eet_lib.c:746 #2 0xb7f331e4 in evas_font_load (evas=0x80e49c8, name=0x844ba08 "fonts/Edje Vera,xs\f\b\uffff\uffff\uffff\uffff\uffff\uffff\uffff?\uffffz#\b53\uffffC", source=0x8176640 "/home/shorne/local/share/enlightenment/data/themes/default.edj", size=7) at evas_font_dir.c:172 #3 0xb7f24d5c in evas_object_text_font_set (obj=0x8176500, font=0x844ba08 "fonts/Edje Vera,xs\f\b\uffff\uffff\uffff\uffff\uffff\uffff\uffff?\uffffz#\b53\uffffC", size=7) at evas_object_text.c:167 #4 0xb7fe461d in _edje_part_recalc_single (ed=0x810dc20, ep=0x810de08, desc=0x812bac8, chosen_desc=0x812bac8, rel1_to_x=0x81750a0, rel1_to_y=0x0, rel2_to_x=0x0, rel2_to_y=0x0, confine_to=0x0, params=0xbffed2f0, flags=3) at edje_calc.c:548 #5 0xb7fe5706 in _edje_part_recalc (ed=0x810dc20, ep=0x810de08, flags=3) at edje_calc.c:876 #6 0xb7fe3459 in _edje_recalc (ed=0x810dc20) at edje_calc.c:162 #7 0xb7ff8264 in _edje_thaw (ed=0x810dc20) at edje_util.c:1561 #8 0xb7ff5280 in edje_object_thaw (obj=0x810db20) at edje_util.c:118 #9 0xb7ff50d9 in edje_thaw () at edje_util.c:40 #10 0x08053a56 in _e_main_cb_idler_before (data=0x0) at e_main.c:775 #11 0xb7f76f66 in _ecore_idle_enterer_call () at ecore_idle_enterer.c:78 #12 0xb7f79f00 in _ecore_main_loop_iterate_internal (once_only=0) at ecore_main.c:453 #13 0xb7f79497 in ecore_main_loop_begin () at ecore_main.c:79 #14 0x08052e38 in main (argc=1, argv=0xbffffa24) at e_main.c:366 /* Leaks */ ==24446== 6990 bytes in 151 blocks are definitely lost in loss record 59 of 66 ==24446== at 0x1B903568: malloc (vg_replace_malloc.c:130) ==24446== by 0x1B91E4D0: _edje_text_recalc_apply (edje_text.c:559) ==24446== by 0x1B910263: _edje_part_recalc (edje_calc.c:972) ==24446== by 0x1B90D458: _edje_recalc (edje_calc.c:162) ==24446== by 0x1B92227C: _edje_thaw (edje_util.c:1561) ==24446== by 0x1B91F298: edje_object_thaw (edje_util.c:118) ==24446== by 0x1B91F0D8: edje_thaw (edje_util.c:40) ==24446== by 0x8053B25: _e_main_cb_idler_before (e_main.c:775) ==24446== by 0x1B99AF65: _ecore_idle_enterer_call (ecore_idle_enterer.c:78) ==24446== by 0x1B99DEFF: _ecore_main_loop_iterate_internal (ecore_main.c:453)==24446== by 0x1B99D496: ecore_main_loop_begin (ecore_main.c:79) ==24446== by 0x8052F07: main (e_main.c:366) ==24446== 397 bytes in 17 blocks are definitely lost in loss record 36 of 66 ==24446== at 0x1B903568: malloc (vg_replace_malloc.c:130) ==24446== by 0x4FD68D7F: strdup (in /lib/tls/libc-2.3.2.so) ==24446== by 0x80641C9: e_menu_item_icon_edje_set (e_menu.c:348) ==24446== by 0x806A08E: e_int_menus_main_new (e_int_menus.c:70) ==24446== by 0x8058820: _e_zone_cb_bg_mouse_down (e_zone.c:255) ==24446== by 0x1B9B57CB: evas_object_event_callback_call (evas_callbacks.c:19 0) ==24446== by 0x1B9B6D63: evas_event_feed_mouse_down (evas_events.c:190) ==24446== by 0x1B930D86: _ecore_evas_event_mouse_button_down (ecore_evas_x.c: 155) ==24446== by 0x1B999455: _ecore_event_call (ecore_events.c:394) ==24446== by 0x1B99E27B: _ecore_main_loop_iterate_internal (ecore_main.c:605) ==24446== by 0x1B99D496: ecore_main_loop_begin (ecore_main.c:79) ==24446== by 0x8052F07: main (e_main.c:366) ==24446== 1 bytes in 1 blocks are definitely lost in loss record 1 of 66 ==24446== at 0x1B903E99: calloc (vg_replace_malloc.c:175) ==24446== by 0x1BA63180: eet_data_descriptor_decode (eet_data.c:1774) ==24446== by 0x1BA63563: eet_data_descriptor_decode (eet_data.c:1908) ==24446== by 0x1BA62D9B: eet_data_read (eet_data.c:1629) ==24446== by 0x806396E: e_config_domain_load (e_config.c:303) ==24446== by 0x1E1E508F: ??? ==24446== by 0x1E1E4D34: ??? ==24446== by 0x806B3FD: e_module_enable (e_module.c:198) ==24446== by 0x806AF18: e_module_init (e_module.c:55) ==24446== by 0x8052D11: main (e_main.c:306)