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)