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)


Reply via email to