Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e.h e_config.c e_config.h e_font.c e_ipc.c e_ipc.h e_main.c 
        e_manager.c e_menu.c e_menu.h e_module.c e_path.c e_path.h 
        e_remote_main.c 


Log Message:


shorne's patch

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- e.h 12 May 2005 14:46:28 -0000      1.16
+++ e.h 20 May 2005 03:09:43 -0000      1.17
@@ -94,6 +94,8 @@
 extern EAPI E_Path *path_themes;
 extern EAPI E_Path *path_icons;
 extern EAPI E_Path *path_init;
+extern EAPI E_Path *path_modules;
+extern EAPI E_Path *path_backgrounds;
 extern EAPI int     restart;
 
 #endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -3 -r1.49 -r1.50
--- e_config.c  18 May 2005 05:06:04 -0000      1.49
+++ e_config.c  20 May 2005 03:09:43 -0000      1.50
@@ -31,11 +31,19 @@
 static E_Config_DD *_e_config_theme_edd = NULL;
 static E_Config_DD *_e_config_bindings_mouse_edd = NULL;
 static E_Config_DD *_e_config_bindings_key_edd = NULL;
+static E_Config_DD *_e_config_path_append_edd = NULL;
 
 /* externally accessible functions */
 int
 e_config_init(void)
 {
+   _e_config_path_append_edd = E_CONFIG_DD_NEW("E_Path_Dir", E_Path_Dir);
+#undef T
+#undef D
+#define T E_Path_Dir
+#define D _e_config_path_append_edd
+   E_CONFIG_VAL(D, T, dir, STR);
+
    _e_config_theme_edd = E_CONFIG_DD_NEW("E_Config_Theme", E_Config_Theme);
 #undef T
 #undef D
@@ -123,6 +131,14 @@
    E_CONFIG_LIST(D, T, themes, _e_config_theme_edd); /**/
    E_CONFIG_LIST(D, T, mouse_bindings, _e_config_bindings_mouse_edd); /**/
    E_CONFIG_LIST(D, T, key_bindings, _e_config_bindings_key_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_data, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_images, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_fonts, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_themes, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_init, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_icons, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_modules, _e_config_path_append_edd); /**/
+   E_CONFIG_LIST(D, T, path_append_backgrounds, _e_config_path_append_edd); 
/**/
 
    e_config = e_config_domain_load("e", _e_config_edd);
    if (e_config)
@@ -866,7 +882,71 @@
             E_FREE(eb->params);
             E_FREE(eb);
          }
-       
+       while (e_config->path_append_data)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_data->data;
+            e_config->path_append_data = 
evas_list_remove_list(e_config->path_append_data, e_config->path_append_data);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_images)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_images->data;
+            e_config->path_append_images = 
evas_list_remove_list(e_config->path_append_images, 
e_config->path_append_images);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_fonts)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_fonts->data;
+            e_config->path_append_fonts = 
evas_list_remove_list(e_config->path_append_fonts, e_config->path_append_fonts);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_themes)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_themes->data;
+            e_config->path_append_themes = 
evas_list_remove_list(e_config->path_append_themes, 
e_config->path_append_themes);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_init)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_init->data;
+            e_config->path_append_init = 
evas_list_remove_list(e_config->path_append_init, e_config->path_append_init);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_icons)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_icons->data;
+            e_config->path_append_icons = 
evas_list_remove_list(e_config->path_append_icons, e_config->path_append_icons);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_modules)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_modules->data;
+            e_config->path_append_modules = 
evas_list_remove_list(e_config->path_append_modules, 
e_config->path_append_modules);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+       while (e_config->path_append_backgrounds)
+         {
+            E_Path_Dir *epd;
+            epd = e_config->path_append_backgrounds->data;
+            e_config->path_append_backgrounds = 
evas_list_remove_list(e_config->path_append_backgrounds, 
e_config->path_append_backgrounds);
+            E_FREE(epd->dir);
+            E_FREE(epd);
+         }
+
        E_FREE(e_config->desktop_default_background);
        E_FREE(e_config->language);
        E_FREE(e_config);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- e_config.h  12 May 2005 09:28:58 -0000      1.22
+++ e_config.h  20 May 2005 03:09:44 -0000      1.23
@@ -46,7 +46,7 @@
  * defaults for e to work - started at 100 when we introduced this config
  * versioning feature
  */
-#define E_CONFIG_FILE_VERSION 103
+#define E_CONFIG_FILE_VERSION 104
 
 #define E_EVAS_ENGINE_DEFAULT      0
 #define E_EVAS_ENGINE_SOFTWARE_X11 1
@@ -85,6 +85,15 @@
    Evas_List  *themes;
    Evas_List  *mouse_bindings;
    Evas_List  *key_bindings;
+   Evas_List  *path_append_data;
+   Evas_List  *path_append_images;
+   Evas_List  *path_append_fonts;
+   Evas_List  *path_append_themes;
+   Evas_List  *path_append_init;
+   Evas_List  *path_append_icons;
+   Evas_List  *path_append_modules;
+   Evas_List  *path_append_backgrounds;
+
 };
 
 struct _E_Config_Module
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_font.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- e_font.c    29 Apr 2005 19:42:18 -0000      1.8
+++ e_font.c    20 May 2005 03:09:44 -0000      1.9
@@ -83,12 +83,19 @@
 Evas_List *
 e_font_available_list(void)
 {
-   Evas_List *available;
-   
+   Evas_List *dir_list;
+   Evas_List *next;
+   Evas_List *available;   
+
+   dir_list = e_path_dir_list_get(path_fonts);
    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");
+   for ( next = dir_list; next; next = next->next)
+     {
+        E_Path_Dir *epd = next->data;
+       available = _e_font_font_dir_available_get(available, epd->dir);
+     }
+   
+   e_path_dir_list_free(dir_list);
    return available;
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_ipc.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e_ipc.c     18 May 2005 07:37:33 -0000      1.26
+++ e_ipc.c     20 May 2005 03:09:44 -0000      1.27
@@ -7,7 +7,6 @@
 static void _e_ipc_reply_double_send(Ecore_Ipc_Client *client, double val, int 
opcode);
 static void _e_ipc_reply_int_send(Ecore_Ipc_Client *client, int val, int 
opcode);
 static void _e_ipc_reply_2int_send(Ecore_Ipc_Client *client, int val1, int 
val2, int opcode);
-static char *_e_ipc_path_str_get(char **paths, int *bytes);
 static char *_e_ipc_str_list_get(Evas_List *strs, int *bytes);
 static char *_e_ipc_simple_str_dec(char *data, int bytes);
 static char **_e_ipc_multi_str_dec(char *data, int bytes, int str_count);
@@ -27,6 +26,7 @@
 ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_key_binding_list_enc);
 ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_key_binding_enc);
 ECORE_IPC_DEC_STRUCT_PROTO(_e_ipc_key_binding_dec);
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_path_list_enc);
 
 /* local subsystem globals */
 static Ecore_Ipc_Server *_e_ipc_server  = NULL;
@@ -180,26 +180,6 @@
             free(data);
          }
        break;
-      case E_IPC_OP_MODULE_DIRS_LIST:
-         {
-            char *dirs[] = {
-               PACKAGE_LIB_DIR"/enlightenment/modules",
-               PACKAGE_LIB_DIR"/enlightenment/modules_extra",
-               "~/.e/e/modules",
-               NULL
-            };
-            char *data;
-            int bytes = 0;
-
-            data = _e_ipc_path_str_get(dirs, &bytes);
-            ecore_ipc_client_send(e->client,
-                                  E_IPC_DOMAIN_REPLY,
-                                  E_IPC_OP_MODULE_DIRS_LIST_REPLY,
-                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
-                                  data, bytes);
-            free(data);
-         }
-       break;
       case E_IPC_OP_BG_SET:
          {
             char *file;
@@ -390,26 +370,6 @@
 
          }
        break;
-      case E_IPC_OP_BG_DIRS_LIST:
-         {
-            char *dirs[] = {
-               PACKAGE_DATA_DIR"/data/themes",
-               "~/.e/e/backgrounds",
-               "~/.e/e/themes",
-               NULL
-            };
-            char *data;
-            int bytes = 0;
-
-            data = _e_ipc_path_str_get(dirs, &bytes);
-            ecore_ipc_client_send(e->client,
-                                  E_IPC_DOMAIN_REPLY,
-                                  E_IPC_OP_BG_DIRS_LIST_REPLY,
-                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
-                                  data, bytes);
-            free(data);
-         }
-       break;
       case E_IPC_OP_RESTART:
          {
             restart = 1;
@@ -775,6 +735,431 @@
                               e_config->zone_desks_y_count,
                               E_IPC_OP_DESKS_GET_REPLY);
        break;
+
+      /* Module PATH IPC */
+      case E_IPC_OP_MODULE_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+            char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_modules);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_MODULE_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_MODULE_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_modules, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_MODULE_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_modules, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_MODULE_DIRS_REMOVE:
+          {      
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_modules, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Theme PATH IPC */
+      case E_IPC_OP_THEME_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_themes);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_THEME_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_THEME_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_themes, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_THEME_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_themes, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_THEME_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_themes, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Font Path IPC */
+      case E_IPC_OP_FONT_DIRS_LIST:
+          {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_fonts);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_FONT_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_FONT_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_fonts, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_FONT_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_fonts, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_FONT_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_fonts, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+   
+      /* data Path IPC */
+      case E_IPC_OP_DATA_DIRS_LIST:
+         {
+             Evas_List *dir_list;
+            char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_data);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_DATA_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_DATA_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_data, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_DATA_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_data, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_DATA_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_data, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Images Path IPC */
+      case E_IPC_OP_IMAGE_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_images);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_IMAGE_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_IMAGE_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_images, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+     case E_IPC_OP_IMAGE_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_images, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_IMAGE_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_images, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Init Path IPC */
+      case E_IPC_OP_INIT_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_init);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_INIT_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_INIT_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_init, dir);
+            
+            free(dir);    
+            e_config_save_queue();
+            break;
+         }
+      case E_IPC_OP_INIT_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_init, dir);
+            
+            free(dir);    
+            e_config_save_queue();
+            break;
+         }
+      case E_IPC_OP_INIT_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_init, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Icon Path IPC */
+      case E_IPC_OP_ICON_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_icons);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_ICON_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_ICON_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_icons, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_ICON_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_icons, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_ICON_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_icons, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
+      /* Icon Path IPC */
+      case E_IPC_OP_BG_DIRS_LIST:
+         {
+            Evas_List *dir_list;
+             char *data;
+            int bytes = 0;
+
+            dir_list = e_path_dir_list_get(path_backgrounds);
+            data = _e_ipc_path_list_enc(dir_list, &bytes);
+            ecore_ipc_client_send(e->client,
+                                  E_IPC_DOMAIN_REPLY,
+                                  E_IPC_OP_BG_DIRS_LIST_REPLY,
+                                  0/*ref*/, 0/*ref_to*/, 0/*response*/,
+                                  data, bytes);
+
+            e_path_dir_list_free(dir_list);
+            free(data);
+            break;
+         }
+      case E_IPC_OP_BG_DIRS_APPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_append(path_backgrounds, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_BG_DIRS_PREPEND:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_prepend(path_backgrounds, dir);
+            
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+      case E_IPC_OP_BG_DIRS_REMOVE:
+         {       
+            char * dir;
+            
+            dir = _e_ipc_simple_str_dec(e->data, e->size);
+            e_path_user_path_remove(path_backgrounds, dir);
+
+            free(dir);    
+            e_config_save_queue(); 
+            break;
+         }
+
       default:
        break;
      }
@@ -838,39 +1223,6 @@
      }
 }
 
-/*
- * FIXME: This dosen't handle the case where one of the paths is of the
- *        form: ~moo/bar/baz need to figure out the correct path to the 
- *        specified users homedir
- */
-static char *
-_e_ipc_path_str_get(char **paths, int *bytes)
-{
-   char *data = NULL, **cur, *home;
-   int pos = 0;
-   char tmp[PATH_MAX];
-   
-   *bytes = 0;
-   home = e_user_homedir_get();
-   for (cur = paths; *cur != NULL; cur++)
-     {
-       char *p;
-
-       p = *cur;
-       if (*p == '~') snprintf(tmp, PATH_MAX, "%s%s", home, ++p);
-       else snprintf(tmp, PATH_MAX, "%s", p);
-
-       *bytes += strlen(tmp) + 1;
-       data = realloc(data, *bytes);
-
-       memcpy(data + pos, tmp, strlen(tmp));
-       pos = *bytes;
-       data[pos - 1] = 0;
-     }
-   free(home);
-   return data;
-}
-
 /**
  * Encode a list of strings into a flattened data block that looks like
  * <str>0<str>0... (ie string chars - nul byte in between until the end)
@@ -1126,3 +1478,13 @@
    ECORE_IPC_DEC_STRUCT_FOOT();
 }
 
+ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_path_list_enc)
+{
+   ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_Path_Dir);
+   ECORE_IPC_CNTS(dir);
+   ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
+   int l1;
+   ECORE_IPC_SLEN(l1, dir);
+   ECORE_IPC_PUTS(dir, l1);
+   ECORE_IPC_ENC_EVAS_LIST_FOOT();
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_ipc.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- e_ipc.h     13 May 2005 17:21:04 -0000      1.16
+++ e_ipc.h     20 May 2005 03:09:44 -0000      1.17
@@ -22,13 +22,10 @@
    E_IPC_OP_MODULE_DISABLE,
    E_IPC_OP_MODULE_LIST,
    E_IPC_OP_MODULE_LIST_REPLY,
-   E_IPC_OP_MODULE_DIRS_LIST,
-   E_IPC_OP_MODULE_DIRS_LIST_REPLY,
    E_IPC_OP_BG_SET,
    E_IPC_OP_BG_GET,
    E_IPC_OP_BG_GET_REPLY,
-   E_IPC_OP_BG_DIRS_LIST,
-   E_IPC_OP_BG_DIRS_LIST_REPLY,
+
    E_IPC_OP_FONT_AVAILABLE_LIST,
    E_IPC_OP_FONT_AVAILABLE_LIST_REPLY,
    E_IPC_OP_FONT_APPLY,
@@ -92,14 +89,69 @@
    E_IPC_OP_EDGE_FLIP_TIMEOUT_SET,
    E_IPC_OP_EDGE_FLIP_TIMEOUT_GET,
    E_IPC_OP_EDGE_FLIP_TIMEOUT_GET_REPLY,
+   
+   /* Module PATH IPC */
+   E_IPC_OP_MODULE_DIRS_LIST,
+   E_IPC_OP_MODULE_DIRS_LIST_REPLY,
+   E_IPC_OP_MODULE_DIRS_APPEND,
+   E_IPC_OP_MODULE_DIRS_PREPEND,
+   E_IPC_OP_MODULE_DIRS_REMOVE,
+
+   /* Theme PATH IPC */
+   E_IPC_OP_THEME_DIRS_LIST,
+   E_IPC_OP_THEME_DIRS_LIST_REPLY,
+   E_IPC_OP_THEME_DIRS_APPEND,
+   E_IPC_OP_THEME_DIRS_PREPEND,
+   E_IPC_OP_THEME_DIRS_REMOVE,
+
+   /* Font Path IPC */
+   E_IPC_OP_FONT_DIRS_LIST,
+   E_IPC_OP_FONT_DIRS_LIST_REPLY,
+   E_IPC_OP_FONT_DIRS_APPEND,
+   E_IPC_OP_FONT_DIRS_PREPEND,
+   E_IPC_OP_FONT_DIRS_REMOVE,
+
+   /* data Path IPC */
+   E_IPC_OP_DATA_DIRS_LIST,
+   E_IPC_OP_DATA_DIRS_LIST_REPLY,
+   E_IPC_OP_DATA_DIRS_APPEND,
+   E_IPC_OP_DATA_DIRS_PREPEND,
+   E_IPC_OP_DATA_DIRS_REMOVE,
+
+   /* Images Path IPC */
+   E_IPC_OP_IMAGE_DIRS_LIST,
+   E_IPC_OP_IMAGE_DIRS_LIST_REPLY,
+   E_IPC_OP_IMAGE_DIRS_APPEND,
+   E_IPC_OP_IMAGE_DIRS_PREPEND,
+   E_IPC_OP_IMAGE_DIRS_REMOVE,
+
+  /* Init Path IPC */
+   E_IPC_OP_INIT_DIRS_LIST,
+   E_IPC_OP_INIT_DIRS_LIST_REPLY,
+   E_IPC_OP_INIT_DIRS_APPEND,
+   E_IPC_OP_INIT_DIRS_PREPEND,
+   E_IPC_OP_INIT_DIRS_REMOVE,
+
+  /* Icon Path IPC */
+   E_IPC_OP_ICON_DIRS_LIST,
+   E_IPC_OP_ICON_DIRS_LIST_REPLY,
+   E_IPC_OP_ICON_DIRS_APPEND,
+   E_IPC_OP_ICON_DIRS_PREPEND,
+   E_IPC_OP_ICON_DIRS_REMOVE,
+
+   /* Background Path IPC */
+   E_IPC_OP_BG_DIRS_LIST,
+   E_IPC_OP_BG_DIRS_LIST_REPLY,
+   E_IPC_OP_BG_DIRS_APPEND,
+   E_IPC_OP_BG_DIRS_PREPEND,
+   E_IPC_OP_BG_DIRS_REMOVE,
+
    E_IPC_OP_DESKS_SET,
    E_IPC_OP_DESKS_GET,
    E_IPC_OP_DESKS_GET_REPLY,
    E_IPC_OP_LAST
      /* FIXME: add ipc: */
      /* get list of actions */
-     /* get list of paths */
-     /* add/del extra paths */
 } E_Ipc_Op;
 
 #else
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -3 -r1.81 -r1.82
--- e_main.c    19 May 2005 09:23:54 -0000      1.81
+++ e_main.c    20 May 2005 03:09:44 -0000      1.82
@@ -33,6 +33,8 @@
 E_Path *path_themes  = NULL;
 E_Path *path_init    = NULL;
 E_Path *path_icons   = NULL;
+E_Path *path_modules = NULL;
+E_Path *path_backgrounds = NULL;
 int     restart      = 0;
 int     good         = 0;
 int     evil         = 0;
@@ -284,6 +286,13 @@
        _e_main_shutdown(-1);
      }
    _e_main_shutdown_push(_e_main_dirs_shutdown);
+   /* init config system */
+   if (!e_config_init())
+     {
+       e_error_message_show(_("Enlightenment cannot set up its config 
system."));
+       _e_main_shutdown(-1);
+     }
+   _e_main_shutdown_push(e_config_shutdown);
    /* setup paths for finding things */
    if (!_e_main_path_init())
      {
@@ -292,13 +301,6 @@
        _e_main_shutdown(-1);
      }
    _e_main_shutdown_push(_e_main_path_shutdown);
-   /* init config system */
-   if (!e_config_init())
-     {
-       e_error_message_show(_("Enlightenment cannot set up its config 
system."));
-       _e_main_shutdown(-1);
-     }
-   _e_main_shutdown_push(e_config_shutdown);
    /* init actions system */
    if (!e_actions_init())
      {
@@ -683,53 +685,93 @@
 static int
 _e_main_path_init(void)
 {
+   /* setup data paths */
    path_data = e_path_new();
    if (!path_data)
      {
        e_error_message_show("Cannot allocate path for path_data\n");
        return 0;
      }
-   e_path_path_append(path_data, PACKAGE_DATA_DIR"/data");
+   e_path_default_path_append(path_data, PACKAGE_DATA_DIR"/data");
+   e_path_user_path_set(path_data, &(e_config->path_append_data));
+
+   /* setup image paths */
    path_images = e_path_new();
    if (!path_images)
      {
        e_error_message_show("Cannot allocate path for path_images\n");
        return 0;
      }
-   e_path_path_append(path_images, "~/.e/e/images");
-   e_path_path_append(path_images, PACKAGE_DATA_DIR"/data/images");
+   e_path_default_path_append(path_images, "~/.e/e/images");
+   e_path_default_path_append(path_images, PACKAGE_DATA_DIR"/data/images");
+   e_path_user_path_set(path_images, &(e_config->path_append_images));
+   
+   /* setup font paths */
    path_fonts = e_path_new();
    if (!path_fonts)
      {
        e_error_message_show("Cannot allocate path for path_fonts\n");
        return 0;
      }
-   e_path_path_append(path_fonts, "~/.e/e/fonts");
-   e_path_path_append(path_fonts, PACKAGE_DATA_DIR"/data/fonts");
+   e_path_default_path_append(path_fonts, "~/.e/e/fonts");
+   e_path_default_path_append(path_fonts, PACKAGE_DATA_DIR"/data/fonts");
+   e_path_user_path_set(path_fonts, &(e_config->path_append_fonts));
+
+   /* setup theme paths */
    path_themes = e_path_new();
    if (!path_themes)
      {
        e_error_message_show("Cannot allocate path for path_themes\n");
        return 0;
      }
-   e_path_path_append(path_themes, "~/.e/e/themes");
-   e_path_path_append(path_themes, PACKAGE_DATA_DIR"/data/themes");
+   e_path_default_path_append(path_themes, "~/.e/e/themes");
+   e_path_default_path_append(path_themes, PACKAGE_DATA_DIR"/data/themes");
+   e_path_user_path_set(path_themes, &(e_config->path_append_themes));
+
+   /* setup icon paths */
    path_icons = e_path_new();
    if (!path_icons)
      {
        e_error_message_show("Cannot allocate path for path_icons\n");
        return 0;
      }
-   e_path_path_append(path_icons, "~/.e/e/icons");
-   e_path_path_append(path_icons, PACKAGE_DATA_DIR"/data/icons");
+   e_path_default_path_append(path_icons, "~/.e/e/icons");
+   e_path_default_path_append(path_icons, PACKAGE_DATA_DIR"/data/icons");
+   e_path_user_path_set(path_icons, &(e_config->path_append_icons));
+
+   /* setup init paths */
    path_init = e_path_new();
    if (!path_init)
      {
        e_error_message_show("Cannot allocate path for path_init\n");
        return 0;
      }
-   e_path_path_append(path_init, "~/.e/e/init");
-   e_path_path_append(path_init, PACKAGE_DATA_DIR"/data/init");
+   e_path_default_path_append(path_init, "~/.e/e/init");
+   e_path_default_path_append(path_init, PACKAGE_DATA_DIR"/data/init");
+   e_path_user_path_set(path_init, &(e_config->path_append_init));
+
+   /* setup module paths */
+   path_modules = e_path_new();
+   if (!path_modules) 
+     {
+       e_error_message_show("Cannot allocate path for path_modules\n");
+       return 0;
+     }
+   e_path_default_path_append(path_modules, "~/.e/e/modules");
+   e_path_default_path_append(path_modules, 
PACKAGE_LIB_DIR"/enlightenment/modules");
+   e_path_default_path_append(path_modules, 
PACKAGE_LIB_DIR"/enlightenment/modules_extra");
+   e_path_user_path_set(path_modules, &(e_config->path_append_modules));    
+
+   /* setup background paths */
+   path_backgrounds = e_path_new();
+   if (!path_backgrounds) 
+     {
+       e_error_message_show("Cannot allocate path for path_backgrounds\n");
+       return 0;
+     }
+   e_path_default_path_append(path_backgrounds, "~/.e/e/backgrounds");
+   e_path_user_path_set(path_backgrounds, 
&(e_config->path_append_backgrounds));
+
    return 1;
 }
 
@@ -766,6 +808,16 @@
        e_object_del(E_OBJECT(path_init));
        path_init = NULL;
      }
+   if (path_modules)
+     {
+        e_object_del(E_OBJECT(path_modules));
+        path_modules = NULL;
+     }
+   if (path_backgrounds)
+     {
+       e_object_del(E_OBJECT(path_backgrounds));
+        path_backgrounds = NULL;
+     }
    return 1;
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e_manager.c 19 May 2005 04:38:32 -0000      1.26
+++ e_manager.c 20 May 2005 03:09:44 -0000      1.27
@@ -106,6 +106,8 @@
    Ecore_X_Window *windows;
    int wnum;
 
+   /* a manager is designated for each root. lets get all the windows in 
+      the managers root */
    windows = ecore_x_window_children_get(man->root, &wnum);
    if (windows)
      {
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -3 -r1.30 -r1.31
--- e_menu.c    18 May 2005 10:18:02 -0000      1.30
+++ e_menu.c    20 May 2005 03:09:44 -0000      1.31
@@ -410,7 +410,7 @@
 }
 
 void
-e_menu_item_icon_file_set(E_Menu_Item *mi, char *icon)
+e_menu_item_icon_file_set(E_Menu_Item *mi, const char *icon)
 {
    E_OBJECT_CHECK(mi);
    E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
@@ -427,7 +427,7 @@
 }
 
 void
-e_menu_item_icon_edje_set(E_Menu_Item *mi, char *icon, char *key)
+e_menu_item_icon_edje_set(E_Menu_Item *mi, const char *icon, const char *key)
 {
    E_OBJECT_CHECK(mi);
    E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
@@ -446,7 +446,7 @@
 }
 
 void
-e_menu_item_label_set(E_Menu_Item *mi, char *label)
+e_menu_item_label_set(E_Menu_Item *mi, const char *label)
 {
    E_OBJECT_CHECK(mi);
    E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- e_menu.h    21 Apr 2005 07:19:49 -0000      1.11
+++ e_menu.h    20 May 2005 03:09:44 -0000      1.12
@@ -146,9 +146,9 @@
 EAPI E_Menu_Item *e_menu_item_new(E_Menu *m);
 EAPI E_Menu_Item *e_menu_item_nth(E_Menu *m, int n);
 EAPI int          e_menu_item_num_get(E_Menu_Item *mi);
-EAPI void         e_menu_item_icon_file_set(E_Menu_Item *mi, char *icon);
-EAPI void         e_menu_item_icon_edje_set(E_Menu_Item *mi, char *icon, char 
*key);
-EAPI void         e_menu_item_label_set(E_Menu_Item *mi, char *label);
+EAPI void         e_menu_item_icon_file_set(E_Menu_Item *mi, const char *icon);
+EAPI void         e_menu_item_icon_edje_set(E_Menu_Item *mi, const char *icon, 
const char *key);
+EAPI void         e_menu_item_label_set(E_Menu_Item *mi, const char *label);
 EAPI void         e_menu_item_submenu_set(E_Menu_Item *mi, E_Menu *sub);
 EAPI void         e_menu_item_separator_set(E_Menu_Item *mi, int sep);
 EAPI void         e_menu_item_check_set(E_Menu_Item *mi, int chk);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_module.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e_module.c  4 May 2005 09:59:02 -0000       1.26
+++ e_module.c  20 May 2005 03:09:44 -0000      1.27
@@ -26,7 +26,6 @@
 
 /* local subsystem globals */
 static Evas_List *_e_modules = NULL;
-static E_Path    *_e_path_modules  = NULL;
 
 static E_Module_Api _e_module_api =
 {
@@ -39,12 +38,6 @@
 {
    Evas_List *pl = NULL, *l;
    
-   _e_path_modules = e_path_new();
-   if (!_e_path_modules) return 0;
-   e_path_path_append(_e_path_modules, "~/.e/e/modules");
-   e_path_path_append(_e_path_modules, 
PACKAGE_LIB_DIR"/enlightenment/modules");
-   e_path_path_append(_e_path_modules, 
PACKAGE_LIB_DIR"/enlightenment/modules_extra");
-   
    for (l = e_config->modules; l;)
      {
        E_Config_Module *em;
@@ -80,8 +73,6 @@
        l = l->next;
        e_object_del(E_OBJECT(tmp->data));
      }
-   e_object_del(E_OBJECT(_e_path_modules));
-   _e_path_modules = NULL;
    return 1;
 }
 
@@ -100,7 +91,7 @@
    if (name[0] != '/')
      {
        snprintf(buf, sizeof(buf), "%s/%s/module.so", name, MODULE_ARCH);
-       modpath = e_path_find(_e_path_modules, buf);
+       modpath = e_path_find(path_modules, buf);
      }
    else
      modpath = name;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_path.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- e_path.c    22 Apr 2005 03:06:27 -0000      1.9
+++ e_path.c    20 May 2005 03:09:44 -0000      1.10
@@ -22,13 +22,14 @@
 }
 
 void
-e_path_path_append(E_Path *ep, const char *path)
+e_path_default_path_append(E_Path *ep, const char *path)
 {
    E_OBJECT_CHECK(ep);
    E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
    if (!path) return;
    if (path[0] == '~')
      {
+        E_Path_Dir *epd;
        char *new_path;
        char *home_dir;
        int len1, len2;
@@ -43,24 +44,52 @@
             free(home_dir);
             return;
          }
+       epd = malloc(sizeof(E_Path_Dir));
+        if (!epd)
+         {
+            free(home_dir);
+            free(new_path);
+            return;
+         }
+
+        epd->dir = new_path;
        strcpy(new_path, home_dir);
        strcat(new_path, path + 1);
        free(home_dir);
-       ep->dir_list = evas_list_append(ep->dir_list, new_path);        
+       ep->default_dir_list = evas_list_append(ep->default_dir_list, epd);     
      }
    else
-     ep->dir_list = evas_list_append(ep->dir_list, strdup(path));
+     {
+       E_Path_Dir *epd;
+       epd = malloc(sizeof(E_Path_Dir));
+       if (!epd)
+         return;
+       epd->dir = strdup(path);
+       ep->default_dir_list = evas_list_append(ep->default_dir_list, epd);
+     }
    _e_path_cache_free(ep);
 }
 
 void
-e_path_path_prepend(E_Path *ep, const char *path)
+e_path_user_path_set(E_Path *ep, Evas_List **user_dir_list)
+{
+
+   E_OBJECT_CHECK(ep);
+   E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
+   
+   ep->user_dir_list = user_dir_list;
+   _e_path_cache_free(ep);
+}
+
+void
+e_path_user_path_append(E_Path *ep, const char *path)
 {
    E_OBJECT_CHECK(ep);
    E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
    if (!path) return;
    if (path[0] == '~')
      {
+        E_Path_Dir *epd;
        char *new_path;
        char *home_dir;
        int len1, len2;
@@ -75,18 +104,83 @@
             free(home_dir);
             return;
          }
+       epd = malloc(sizeof(E_Path_Dir));
+        if (!epd)
+         {
+            free(home_dir);
+            free(new_path);
+            return;
+         }
+
+        epd->dir = new_path;
        strcpy(new_path, home_dir);
        strcat(new_path, path + 1);
        free(home_dir);
-       ep->dir_list = evas_list_prepend(ep->dir_list, new_path);       
+       *(ep->user_dir_list) = evas_list_append(*(ep->user_dir_list), epd);     
      }
    else
-     ep->dir_list = evas_list_prepend(ep->dir_list, strdup(path));
+     {
+       E_Path_Dir *epd;
+       epd = malloc(sizeof(E_Path_Dir));
+       if (!epd)
+         return;
+       epd->dir = strdup(path);
+       *(ep->user_dir_list) = evas_list_append(*(ep->user_dir_list), epd);
+     }
    _e_path_cache_free(ep);
 }
 
 void
-e_path_path_remove(E_Path *ep, const char *path)
+e_path_user_path_prepend(E_Path *ep, const char *path)
+{
+   E_OBJECT_CHECK(ep);
+   E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
+   if (!path) return;
+   if (path[0] == '~')
+     {
+        E_Path_Dir *epd;
+       char *new_path;
+       char *home_dir;
+       int len1, len2;
+       
+       home_dir = e_user_homedir_get();
+       if (!home_dir) return;
+       len1 = strlen(home_dir);
+       len2 = strlen(path);
+       new_path = malloc(len1 + len2 + 1);
+       if (!new_path)
+         {
+            free(home_dir);
+            return;
+         }
+       epd = malloc(sizeof(E_Path_Dir));
+        if (!epd)
+         {
+            free(home_dir);
+            free(new_path);
+            return;
+         }
+
+        epd->dir = new_path;
+       strcpy(new_path, home_dir);
+       strcat(new_path, path + 1);
+       free(home_dir);
+       *(ep->user_dir_list) = evas_list_prepend(*(ep->user_dir_list), epd);    
+     }
+   else
+     {
+       E_Path_Dir *epd;
+       epd = malloc(sizeof(E_Path_Dir));
+       if (!epd)
+         return;
+       epd->dir = strdup(path);
+       *(ep->user_dir_list) = evas_list_prepend(*(ep->user_dir_list), epd);
+     }
+   _e_path_cache_free(ep);
+}
+
+void
+e_path_user_path_remove(E_Path *ep, const char *path)
 {
    Evas_List *l;
 
@@ -112,16 +206,19 @@
        strcpy(new_path, home_dir);
        strcat(new_path, path + 1);
        free(home_dir);
-       for (l = ep->dir_list; l; l = l->next)
+       for (l = *(ep->user_dir_list); l; l = l->next)
          {
-            char *p;
+            E_Path_Dir *epd;
             
-            p = l->data;
-            if (p)
+            epd = l->data;
+            if (epd->dir)
               {
-                 if (!strcmp(p, new_path))
+                 if (!strcmp(epd->dir, new_path))
                    {
-                      ep->dir_list = evas_list_prepend(ep->dir_list, l->data);
+                      *(ep->user_dir_list) = evas_list_remove_list(
+                                               *(ep->user_dir_list), l);
+                      free(epd->dir);
+                      free(epd);
                       free(new_path);
                       _e_path_cache_free(ep);
                       return;
@@ -132,16 +229,18 @@
       }
    else
      {
-       for (l = ep->dir_list; l; l = l->next)
+       for (l = *(ep->user_dir_list); l; l = l->next)
          {
-            char *p;
-            
-            p = l->data;
-            if (p)
+            E_Path_Dir *epd;
+            epd = l->data;
+            if (epd->dir)
               {
-                 if (!strcmp(p, path))
+                 if (!strcmp(epd->dir, path))
                    {
-                      ep->dir_list = evas_list_prepend(ep->dir_list, l->data);
+                      *(ep->user_dir_list) = evas_list_remove_list(
+                                               *(ep->user_dir_list), l);
+                      free(epd->dir);
+                      free(epd);
                       _e_path_cache_free(ep);
                       return;
                    }
@@ -158,6 +257,7 @@
    
    E_OBJECT_CHECK_RETURN(ep, NULL);
    E_OBJECT_TYPE_CHECK_RETURN(ep, E_PATH_TYPE, NULL);
+
    if (!file) return NULL;
    _e_path_buf[0] = 0;
    str = evas_hash_find(ep->hash, file);
@@ -166,14 +266,40 @@
        strcpy(_e_path_buf, str);
        return _e_path_buf;
      }
-   for (l = ep->dir_list; l; l = l->next)
+   /* Look in the default dir list */
+   for (l = ep->default_dir_list; l; l = l->next)
+     {
+       E_Path_Dir *epd;
+       char *rp;
+       
+       epd = l->data;
+       if (epd->dir)
+         {
+            snprintf(_e_path_buf, sizeof(_e_path_buf), "%s/%s", epd->dir, 
file);
+            rp = ecore_file_realpath(_e_path_buf);
+            if ((rp) && (rp[0] != 0))
+              {
+                 strncpy(_e_path_buf, rp, sizeof(_e_path_buf) - 1);
+                 _e_path_buf[sizeof(_e_path_buf) - 1] = 0;
+                 free(rp);
+                 if (evas_hash_size(ep->hash) >= 512)
+                   _e_path_cache_free(ep);
+                 ep->hash = evas_hash_add(ep->hash, file, strdup(_e_path_buf));
+                 return _e_path_buf;
+              }
+            if (rp) free(rp);
+         }
+     }
+   /* Look in the users dir list */
+   for (l = *(ep->user_dir_list); l; l = l->next)
      {
-       char *p, *rp;
+       E_Path_Dir *epd;
+       char *rp;
        
-       p = l->data;
-       if (p)
+       epd = l->data;
+       if (epd->dir)
          {
-            snprintf(_e_path_buf, sizeof(_e_path_buf), "%s/%s", p, file);
+            snprintf(_e_path_buf, sizeof(_e_path_buf), "%s/%s", epd->dir, 
file);
             rp = ecore_file_realpath(_e_path_buf);
             if ((rp) && (rp[0] != 0))
               {
@@ -195,16 +321,63 @@
 e_path_evas_append(E_Path *ep, Evas *evas)
 {
    Evas_List *l;
+   Evas_List *dir_list;
    
    E_OBJECT_CHECK(ep);
    E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
    if (!evas) return;
-   for (l = ep->dir_list; l; l = l->next)
+
+   dir_list = e_path_dir_list_get(ep);
+
+   for (l = dir_list; l; l = l->next)
      {
-       char *p;
+       E_Path_Dir *epd;
        
-       p = l->data;
-       if (p) evas_font_path_append(evas, p);
+       epd = l->data;
+       if (epd->dir) evas_font_path_append(evas, epd->dir);
+     }
+}
+
+/* compine default_list and and user_list int and easy to use list */
+Evas_List *
+e_path_dir_list_get(E_Path *ep)
+{
+   Evas_List   *dir_list;
+   Evas_List   *l;
+   E_Path_Dir  *new_epd;
+   E_Path_Dir  *epd;
+
+   dir_list = NULL;
+
+   for (l = ep->default_dir_list; l; l = l->next)
+     {
+       epd = l->data;
+       new_epd = malloc(sizeof(E_Path_Dir));
+       new_epd->dir = strdup(epd->dir);
+       dir_list = evas_list_append(dir_list, new_epd);
+     }
+   for (l = *(ep->user_dir_list); l; l = l->next)
+     {
+       epd = l->data;
+       new_epd = malloc(sizeof(E_Path_Dir));
+       new_epd->dir = strdup(epd->dir);
+       dir_list = evas_list_append(dir_list, new_epd);
+     }
+
+   return dir_list;
+}
+
+void
+e_path_dir_list_free(Evas_List *dir_list)
+{
+   E_Path_Dir *epd;
+
+   while (dir_list)
+     {
+       epd = dir_list->data;
+       dir_list = evas_list_remove_list(dir_list, dir_list);
+       free(epd->dir);
+       free(epd);
      }
 }
 
@@ -213,10 +386,14 @@
 _e_path_free(E_Path *ep)
 {
    _e_path_cache_free(ep);
-   while (ep->dir_list)
+   while (ep->default_dir_list)
      {
-       free(ep->dir_list->data);
-       ep->dir_list = evas_list_remove_list(ep->dir_list, ep->dir_list);
+       E_Path_Dir *epd;
+       epd = ep->default_dir_list->data;
+       free(epd->dir);
+       free(epd);
+       ep->default_dir_list = evas_list_remove_list(ep->default_dir_list, 
+                                               ep->default_dir_list);
      }
    free(ep);
 }
@@ -227,6 +404,7 @@
    if (!ep->hash) return;
    evas_hash_foreach(ep->hash, _e_path_cache_free_cb, NULL);
    evas_hash_free(ep->hash);
+   ep->hash = NULL;
 }
 
 static Evas_Bool
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_path.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- e_path.h    7 Feb 2005 13:51:09 -0000       1.6
+++ e_path.h    20 May 2005 03:09:44 -0000      1.7
@@ -4,28 +4,44 @@
 #ifdef E_TYPEDEFS
 
 typedef struct _E_Path E_Path;
-   
+typedef struct _E_Path_Dir E_Path_Dir;   
+
 #else
 #ifndef E_PATH_H
 #define E_PATH_H
 
 #define E_PATH_TYPE 0xE0b0100c
 
+struct _E_Path_Dir
+{
+   char * dir;
+};
+
 struct _E_Path
 {
    E_Object   e_obj_inherit;
-   
+    
    Evas_Hash *hash;
    
-   Evas_List *dir_list;
+   Evas_List *default_dir_list;
+   /* keep track of the associated e_config path */
+   Evas_List **user_dir_list;
 };
 
+/* init and setup */
 EAPI E_Path     *e_path_new(void);
-EAPI void        e_path_path_append(E_Path *ep, const char *path);
-EAPI void        e_path_path_prepend(E_Path *ep, const char *path);
-EAPI void        e_path_path_remove(E_Path *ep, const char *path);
-EAPI char        *e_path_find(E_Path *ep, const char *file); /* for conveience 
this doesnt return a malloc'd string. it's a static buffer, so a new call will 
replace this buffer, but thsi means there is no need to free the return */
+EAPI void        e_path_user_path_set(E_Path *ep, Evas_List **user_dir_list);
+EAPI void        e_path_inherit_path_set(E_Path *ep, E_Path *path_inherit);
+/* append a hardcoded path */
+EAPI void        e_path_default_path_append(E_Path *ep, const char *path);
+/* e_config path manipulation */
+EAPI void        e_path_user_path_append(E_Path *ep, const char *path);
+EAPI void        e_path_user_path_prepend(E_Path *ep, const char *path);
+EAPI void        e_path_user_path_remove(E_Path *ep, const char *path);
+EAPI char       *e_path_find(E_Path *ep, const char *file); /* for conveience 
this doesnt return a malloc'd string. it's a static buffer, so a new call will 
replace this buffer, but thsi means there is no need to free the return */
 EAPI void        e_path_evas_append(E_Path *ep, Evas *evas);
+EAPI Evas_List  *e_path_dir_list_get(E_Path *ep);
+EAPI void       e_path_dir_list_free(Evas_List *dir_list);
 
 #endif
 #endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_remote_main.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e_remote_main.c     19 May 2005 00:12:30 -0000      1.26
+++ e_remote_main.c     20 May 2005 03:09:44 -0000      1.27
@@ -42,6 +42,7 @@
 ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_key_binding_list_dec);
 ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_key_binding_enc);
 ECORE_IPC_DEC_STRUCT_PROTO(_e_ipc_key_binding_dec);
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_path_list_dec);
 
 /* local subsystem globals */
 static Ecore_Ipc_Server *_e_ipc_server  = NULL;
@@ -262,10 +263,8 @@
    OSTR("-module-enable", "Enable module OPT1 if not enabled", 
E_IPC_OP_MODULE_ENABLE, 0),
    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),
-   OREQ("-module-dirs-list", "List all modules directories", 
E_IPC_OP_MODULE_DIRS_LIST, 1),
-   OSTR("-bg-set", "Set the background edje file to be OPT1", E_IPC_OP_BG_SET, 
0),
+      OSTR("-bg-set", "Set the background edje file to be OPT1", 
E_IPC_OP_BG_SET, 0),
    OREQ("-bg-get", "Get the background edje file", E_IPC_OP_BG_GET, 1),
-   OREQ("-bg-dirs-list", "Get the background directories", 
E_IPC_OP_BG_DIRS_LIST, 1),
    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),
@@ -288,6 +287,39 @@
    OREQ("-binding-key-list", "List all key bindings", 
E_IPC_OP_BINDING_KEY_LIST, 1),
    OFNC("-binding-key-add", "Add an existing key binding. OPT1 = Context, OPT2 
= key, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = action 
parameters", 6, _e_opt_binding_key_add, 0),
    OFNC("-binding-key-del", "Delete an existing key binding. OPT1 = Context, 
OPT2 = key, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = 
action parameters", 6, _e_opt_binding_key_del, 0),
+   OREQ("-module-dirs-list", "List all module directories", 
E_IPC_OP_MODULE_DIRS_LIST, 1),
+   OSTR("-module-dirs-append", "Append OPT1 to the user module path", 
E_IPC_OP_MODULE_DIRS_APPEND, 0),
+   OSTR("-module-dirs-prepend", "Prepend OPT1 to the user module path", 
E_IPC_OP_MODULE_DIRS_PREPEND, 0),
+   OSTR("-module-dirs-remove", "Remove OPT1 from the user module path", 
E_IPC_OP_MODULE_DIRS_REMOVE, 0),
+   OREQ("-data-dirs-list", "List all data directories", 
E_IPC_OP_DATA_DIRS_LIST, 1),
+   OSTR("-data-dirs-append", "Append OPT1 to the user data path", 
E_IPC_OP_DATA_DIRS_APPEND, 0),
+    OSTR("-data-dirs-prepend", "Prepend OPT1 to the user data path", 
E_IPC_OP_DATA_DIRS_PREPEND, 0),
+   OSTR("-data-dirs-remove", "Remove OPT1 from the user data path", 
E_IPC_OP_DATA_DIRS_REMOVE, 0),
+   OREQ("-font-dirs-list", "List all font directories", 
E_IPC_OP_FONT_DIRS_LIST, 1),
+   OSTR("-font-dirs-append", "Append OPT1 to the user font path", 
E_IPC_OP_FONT_DIRS_APPEND, 0),
+    OSTR("-font-dirs-prepend", "Prepend OPT1 to the user font path", 
E_IPC_OP_FONT_DIRS_PREPEND, 0),
+   OSTR("-font-dirs-remove", "Remove OPT1 from the user font path", 
E_IPC_OP_FONT_DIRS_REMOVE, 0),
+   OREQ("-theme-dirs-list", "List all theme directories", 
E_IPC_OP_THEME_DIRS_LIST, 1),
+   OSTR("-theme-dirs-append", "Append OPT1 to the user theme path", 
E_IPC_OP_THEME_DIRS_APPEND, 0),
+    OSTR("-theme-dirs-prepend", "Prepend OPT1 to the user theme path", 
E_IPC_OP_THEME_DIRS_PREPEND, 0),
+   OSTR("-theme-dirs-remove", "Remove OPT1 from the user theme path", 
E_IPC_OP_THEME_DIRS_REMOVE, 0),
+   OREQ("-init-dirs-list", "List all init directories", 
E_IPC_OP_INIT_DIRS_LIST, 1),
+   OSTR("-init-dirs-append", "Append OPT1 to the user init path", 
E_IPC_OP_INIT_DIRS_APPEND, 0),
+    OSTR("-init-dirs-prepend", "Prepend OPT1 to the user init path", 
E_IPC_OP_INIT_DIRS_PREPEND, 0),
+   OSTR("-init-dirs-remove", "Remove OPT1 from the user init path", 
E_IPC_OP_INIT_DIRS_REMOVE, 0),
+   OREQ("-icon-dirs-list", "List all icon directories", 
E_IPC_OP_ICON_DIRS_LIST, 1),
+   OSTR("-icon-dirs-append", "Append OPT1 to the user icon path", 
E_IPC_OP_ICON_DIRS_APPEND, 0),
+   OSTR("-icon-dirs-prepend", "Prepend OPT1 to the user icon path", 
E_IPC_OP_ICON_DIRS_PREPEND, 0),
+   OSTR("-icon-dirs-remove", "Remove OPT1 from the user icon path", 
E_IPC_OP_ICON_DIRS_REMOVE, 0),
+   OREQ("-image-dirs-list", "List all image directories", 
E_IPC_OP_IMAGE_DIRS_LIST, 1),
+   OSTR("-image-dirs-append", "Append OPT1 to the user image path", 
E_IPC_OP_IMAGE_DIRS_APPEND, 0),
+   OSTR("-image-dirs-prepend", "Prepend OPT1 to the user image path", 
E_IPC_OP_IMAGE_DIRS_PREPEND, 0),
+   OSTR("-image-dirs-remove", "Remove OPT1 from the user image path", 
E_IPC_OP_IMAGE_DIRS_REMOVE, 0),
+  OREQ("-bg-dirs-list", "List all background directories", 
E_IPC_OP_BG_DIRS_LIST, 1),
+   OSTR("-bg-dirs-append", "Append OPT1 to the user background path", 
E_IPC_OP_BG_DIRS_APPEND, 0),
+   OSTR("-bg-dirs-prepend", "Prepend OPT1 to the user background path", 
E_IPC_OP_BG_DIRS_PREPEND, 0),
+   OSTR("-bg-dirs-remove", "Remove OPT1 from the user background path", 
E_IPC_OP_BG_DIRS_REMOVE, 0),
+   OFNC("-binding-key-del", "Delete an existing key binding. OPT1 = Context, 
OPT2 = key, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = 
action parameters", 6, _e_opt_binding_key_del, 0),
    ODBL("-menus-scroll-speed-set", "Set the scroll speed of menus 
(pixels/sec)", E_IPC_OP_MENUS_SCROLL_SPEED_SET, 0),
    OREQ("-menus-scroll-speed-get", "Get the scroll speed of menus 
(pixels/sec)", E_IPC_OP_MENUS_SCROLL_SPEED_GET, 1),
    ODBL("-menus-fast-move-threshhold-set", "Set the mouse speed in pixels per 
second that is considered a 'fast move'", 
E_IPC_OP_MENUS_FAST_MOVE_THRESHHOLD_SET, 0),
@@ -600,7 +632,7 @@
             E_Module *m;
             
             modules = _e_ipc_module_list_dec(e->data, e->size);             
-            while(modules)
+            while (modules)
               {
                   m = modules->data;
                   printf("REPLY: MODULE NAME=\"%s\" ENABLED=%i\n",
@@ -612,44 +644,12 @@
        else
          printf("REPLY: MODULE NONE\n");
        break;
-      case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
-       if (e->data)
-         {
-            char *p;
-
-            p = e->data;
-            while (p < (char *)(e->data + e->size))
-              {
-                 char *dir;
-                 
-                 dir = p;
-                 printf("REPLY: MODULE DIR=%s\n", dir);
-                 p += strlen(dir) + 1;
-              }
-         }
-       break;
       case E_IPC_OP_BG_GET_REPLY:
        if (e->data)
          {
             printf("REPLY: %s\n", (char *)e->data);
          }
        break;
-      case E_IPC_OP_BG_DIRS_LIST_REPLY:
-       if (e->data)
-         {     
-            char *p;
-            
-            p = e->data;
-            while (p < (char *)(e->data + e->size))
-              {
-                 char *dir;
-                 
-                 dir = p;
-                 printf("REPLY: BG DIR=%s\n", dir);
-                 p += strlen(dir) + 1;
-              }
-         }
-       break;
       case E_IPC_OP_FONT_FALLBACK_LIST_REPLY:
        if (e->data)
          {
@@ -790,6 +790,134 @@
         else
           printf("REPLY: AVAILABLE NONE\n"); 
         break;   
+      case E_IPC_OP_DATA_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: DATA DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_IMAGE_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: IMAGE DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_FONT_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: FONT DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_THEME_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: THEME DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_INIT_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: INIT DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_ICON_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: ICON DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: MODULE DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
+      case E_IPC_OP_BG_DIRS_LIST_REPLY:
+       if (e->data)
+         {
+            Evas_List *dirs;
+            E_Path_Dir *dir;
+
+            dirs = _e_ipc_path_list_dec(e->data, e->size);
+            while (dirs)
+              {
+                 dir = dirs->data;
+                 printf("REPLY: BACKGROUND DIR=\"%s\"\n", dir->dir);
+                 dirs = evas_list_remove_list(dirs, dirs);
+                 E_FREE(dir);
+              }
+         }
+       break;
       case E_IPC_OP_MENUS_SCROLL_SPEED_GET_REPLY:
        if (e->data)
          {
@@ -1149,3 +1277,9 @@
    ECORE_IPC_GET8(any_mod);
    ECORE_IPC_DEC_STRUCT_FOOT();
 }
+ECORE_IPC_DEC_EVAS_LIST_PROTO(_e_ipc_path_list_dec)
+{
+   ECORE_IPC_DEC_EVAS_LIST_HEAD(E_Path_Dir);
+   ECORE_IPC_GETS(dir);
+   ECORE_IPC_DEC_EVAS_LIST_FOOT();
+}




-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes
Want to be the first software developer in space?
Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7412&alloc_id=16344&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to