Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_filechooser_widget.c etk_image.c etk_theme.c etk_theme.h 
        etk_widget.c 


Log Message:
* [Etk_Theme] Improve the API
* [Etk_Theme] Use default colors in etk_theme_color_get()
* [Etk_Theme] Get rid of the aliasing system since Edje can do that now


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_filechooser_widget.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -3 -r1.17 -r1.18
--- etk_filechooser_widget.c    16 Jan 2007 23:49:26 -0000      1.17
+++ etk_filechooser_widget.c    21 Mar 2007 18:15:26 -0000      1.18
@@ -176,7 +176,7 @@
       strftime(mod_time_string, 128, "%x", mod_time2);
       
       etk_tree_row_append(ETK_TREE(filechooser_widget->files_tree), NULL,
-         filechooser_widget->files_name_col, etk_theme_icon_get(), 
"places/folder_16", filename,
+         filechooser_widget->files_name_col, etk_theme_icon_path_get(), 
"places/folder_16", filename,
          filechooser_widget->files_date_col, mod_time_string, NULL);
    }
    
@@ -214,7 +214,7 @@
       strftime(mod_time_string, 128, "%x", mod_time2);
       
       etk_tree_row_append(ETK_TREE(filechooser_widget->files_tree), NULL,
-         filechooser_widget->files_name_col, etk_theme_icon_get(), icon ? icon 
: "mimetypes/text-x-generic_16", filename,
+         filechooser_widget->files_name_col, etk_theme_icon_path_get(), icon ? 
icon : "mimetypes/text-x-generic_16", filename,
          filechooser_widget->files_date_col, mod_time_string, NULL);
    }
    
@@ -541,18 +541,18 @@
    etk_tree_freeze(ETK_TREE(fcw->places_tree));
    
    row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL,
-      fcw->places_col, etk_theme_icon_get(), "actions/go-up_16", "..", NULL);
+      fcw->places_col, etk_theme_icon_path_get(), "actions/go-up_16", "..", 
NULL);
    etk_tree_row_data_set_full(row, strdup(".."), free);
    
    if ((home = getenv("HOME")))
    {
       row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL,
-         fcw->places_col, etk_theme_icon_get(), "places/user-home_16", 
_("Home"), NULL);
+         fcw->places_col, etk_theme_icon_path_get(), "places/user-home_16", 
_("Home"), NULL);
       etk_tree_row_data_set_full(row, strdup(home), free);
    }
    
    row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL,
-      fcw->places_col, etk_theme_icon_get(), "devices/computer_16", _("Root"), 
NULL);
+      fcw->places_col, etk_theme_icon_path_get(), "devices/computer_16", 
_("Root"), NULL);
    etk_tree_row_data_set_full(row, strdup("/"), free);
    
    /* Adds the mount points */
@@ -583,7 +583,7 @@
                continue;
             
             row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL,
-               fcw->places_col, etk_theme_icon_get(), 
"devices/drive-harddisk_16", ecore_file_get_file(mount_point->mnt_dir), NULL);
+               fcw->places_col, etk_theme_icon_path_get(), 
"devices/drive-harddisk_16", ecore_file_get_file(mount_point->mnt_dir), NULL);
             etk_tree_row_data_set_full(row, strdup(mount_point->mnt_dir), 
free);
          }
          endmntent(mtab);
@@ -617,7 +617,7 @@
             continue;
          
          row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL,
-            fcw->places_col, etk_theme_icon_get(), 
"devices/drive-harddisk_16", ecore_file_get_file(mount_points[i].f_mntonname), 
NULL);
+            fcw->places_col, etk_theme_icon_path_get(), 
"devices/drive-harddisk_16", ecore_file_get_file(mount_points[i].f_mntonname), 
NULL);
          etk_tree_row_data_set_full(row, strdup(mount_points[i].f_mntonname), 
free);
       }
    }
@@ -652,7 +652,7 @@
       if (sscanf(line, "file://%s", fav) == 1)
       {
          row = etk_tree_row_append(ETK_TREE(fcw->fav_tree), NULL,
-            fcw->fav_col, etk_theme_icon_get(), "places/folder_16", 
ecore_file_get_file(fav), NULL);
+            fcw->fav_col, etk_theme_icon_path_get(), "places/folder_16", 
ecore_file_get_file(fav), NULL);
          etk_tree_row_data_set_full(row, strdup(fav), free);
       }
    }
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_image.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -3 -r1.30 -r1.31
--- etk_image.c 30 Dec 2006 14:42:00 -0000      1.30
+++ etk_image.c 21 Mar 2007 18:15:26 -0000      1.31
@@ -938,7 +938,7 @@
          
          if (image->source == ETK_IMAGE_STOCK)
          {
-            file = etk_theme_icon_get();
+            file = etk_theme_icon_path_get();
             key = etk_stock_key_get(image->info.stock.id, 
image->info.stock.size);
          }
          else
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_theme.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- etk_theme.c 1 Feb 2007 19:14:52 -0000       1.12
+++ etk_theme.c 21 Mar 2007 18:15:26 -0000      1.13
@@ -3,60 +3,88 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <limits.h>
 #include <Ecore_File.h>
 #include <Edje.h>
 #include "etk_widget.h"
 #include "etk_config.h"
 #include "config.h"
 
+/**
+ * @addtogroup Etk_Theme
+ * @{
+ */
+
 static char *_etk_theme_find(const char *subdir, const char *file);
 
+static int _etk_theme_default_colors[ETK_COLOR_NUM_COLORS][4] =
+{
+   { 0, 0, 0, 255 },
+   { 255, 255, 255, 255 },
+   { 158, 158, 0, 255 },
+   { 255, 255, 255, 255 },
+   { 205, 0, 0, 255 },
+   { 255, 255, 255, 255 },
+   { 0, 0, 205, 255 },
+   { 255, 255, 255, 255 },
+   { 0, 140, 0, 255 },
+   { 255, 255, 255, 255 },
+   { 111, 79, 143, 255 },
+   { 255, 255, 255, 255 },
+   { 205, 0, 205, 255 },
+   { 255, 255, 255, 255 },
+   { 145, 87, 26, 255 },
+   { 255, 255, 255, 255 },
+   { 136, 136, 136, 255 },
+   { 255, 255, 255, 255 }
+};
+
+static char *_etk_theme_color_names[ETK_COLOR_NUM_COLORS] =
+{
+   "etk/color/foreground",
+   "etk/color/background",
+   "etk/color/important/fg",
+   "etk/color/important/bg",
+   "etk/color/warning/fg",
+   "etk/color/warning/bg",
+   "etk/color/info/fg",
+   "etk/color/info/bg",
+   "etk/color/default1/fg",
+   "etk/color/default1/bg",
+   "etk/color/default2/fg",
+   "etk/color/default2/bg",
+   "etk/color/default3/fg",
+   "etk/color/default3/bg",
+   "etk/color/default4/fg",
+   "etk/color/default4/bg",
+   "etk/color/default5/fg",
+   "etk/color/default5/bg"
+};
+
 static char *_etk_theme_widget_default = NULL;
 static char *_etk_theme_widget_current = NULL;
 static char *_etk_theme_icon_default = NULL;
 static char *_etk_theme_icon_current = NULL;
-static char *_etk_theme_colors[ETK_COLOR_NUM_COLORS];
 
 /**
  * @internal
- * @brief Initializes the themz system of Etk
+ * @brief Initializes the theme-system of Etk
  */
-void etk_theme_init()
+void etk_theme_init(void)
 {
    _etk_theme_widget_default = _etk_theme_find("themes", "default");
    _etk_theme_icon_default = _etk_theme_find("icons", "default");
    
-   etk_theme_widget_set(etk_config_widget_theme_get());
-   etk_theme_icon_set("default");
-
-   _etk_theme_colors[ETK_COLOR_FOREGROUND] = strdup("etk/color/foreground");
-   _etk_theme_colors[ETK_COLOR_BACKGROUND] = strdup("etk/color/background");
-   _etk_theme_colors[ETK_COLOR_IMPORTANT_FG] = 
strdup("etk/color/important/fg");
-   _etk_theme_colors[ETK_COLOR_IMPORTANT_BG] = 
strdup("etk/color/important/bg");
-   _etk_theme_colors[ETK_COLOR_WARNING_FG] = strdup("etk/color/warning/fg");
-   _etk_theme_colors[ETK_COLOR_WARNING_BG] = strdup("etk/color/warning/bg");
-   _etk_theme_colors[ETK_COLOR_INFO_FG] = strdup("etk/color/info/fg");
-   _etk_theme_colors[ETK_COLOR_INFO_BG] = strdup("etk/color/info/bg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT1_FG] = strdup("etk/color/default1/fg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT1_BG] = strdup("etk/color/default1/bg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT2_FG] = strdup("etk/color/default2/fg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT2_BG] = strdup("etk/color/default2/bg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT3_FG] = strdup("etk/color/default3/fg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT3_BG] = strdup("etk/color/default3/bg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT4_FG] = strdup("etk/color/default4/fg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT4_BG] = strdup("etk/color/default4/bg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT5_FG] = strdup("etk/color/default5/fg");
-   _etk_theme_colors[ETK_COLOR_DEFAULT5_BG] = strdup("etk/color/default5/bg");
+   etk_theme_widget_set_from_name(etk_config_widget_theme_get());
+   etk_theme_icon_set_from_name("default");
 }
 
 /**
  * @internal
  * @brief Shutdowns the theme system of Etk
  */
-void etk_theme_shutdown()
+void etk_theme_shutdown(void)
 {
-   int i;
-
    free(_etk_theme_widget_default);
    free(_etk_theme_widget_current);
    free(_etk_theme_icon_default);
@@ -66,154 +94,252 @@
    _etk_theme_widget_current = NULL;
    _etk_theme_icon_default = NULL;
    _etk_theme_icon_current = NULL;
+}
 
-   for (i = 0; i < ETK_COLOR_NUM_COLORS; i++)
+/**
+ * @brief Sets the theme that will be used by new widgets, from its path
+ * @param theme_path the path of the widget-theme to use
+ * @return Returns ETK_TRUE if the theme has been found, or ETK_FALSE otherwise
+ */
+Etk_Bool etk_theme_widget_set_from_path(const char *theme_path)
+{
+   if (!theme_path)
+      return ETK_FALSE;
+   
+   if (ecore_file_exists(theme_path))
    {
-      if (_etk_theme_colors[i])
-        free(_etk_theme_colors[i]);
+      free(_etk_theme_widget_current);
+      _etk_theme_widget_current = strdup(theme_path);
+      return ETK_TRUE;
    }
+   return ETK_FALSE;
+}
+
+/**
+ * @brief Sets the theme that will be used by new widgets, from its name
+ * @param theme_name the name of the widget-theme to use
+ * @return Returns ETK_TRUE if the theme has been found, or ETK_FALSE otherwise
+ */
+Etk_Bool etk_theme_widget_set_from_name(const char *theme_name)
+{
+   return etk_theme_widget_set_from_path(etk_theme_widget_find(theme_name));
 }
 
 /**
  * @brief Gets the path of the current widget-theme file of Etk
  * @return Returns the path of the current widget-theme file
  */
-const char *etk_theme_widget_get()
+const char *etk_theme_widget_path_get(void)
 {
    return _etk_theme_widget_current;
 }
 
 /**
- * @brief Sets the theme that will be used by new widgets
- * @param theme_name the name of the widget-theme to use
- * @return Returns ETK_TRUE if the theme has been found, or ETK_FALSE otherwise
+ * @brief Gets the name of the current widget-theme file of Etk
+ * @return Returns the name of the current widget-theme file, or NULL on 
failure
+ * @note The returned path will have to be freed with free()
  */
-Etk_Bool etk_theme_widget_set(const char *theme_name)
+char *etk_theme_widget_name_get(void)
 {
-   char *path;
+   const char *start, *end;
+   char *name;
+   int len;
    
-   if (!theme_name)
-      return ETK_FALSE;
+   if (!_etk_theme_widget_current)
+      return NULL;
+   
+   if (!(start = strrchr(_etk_theme_widget_current, '/')))
+      start = _etk_theme_widget_current;
+   else
+      start++;
    
-   if ((path = _etk_theme_find("themes", theme_name)))
+   if ((end = strrchr(start, '.')))
    {
-      free(_etk_theme_widget_current);
-      _etk_theme_widget_current = path;
-      return ETK_TRUE;
+      len = end - start;
+      name = malloc(len + 1);
+      strncpy(name, start, len);
+      name[len] = '\0';
+      return name;
    }
-   return ETK_FALSE;
+   
+   return NULL;
 }
 
 /**
- * @brief Gets the list of available widget-themes
- * @return Returns an Evas_List of available widget-themes.
- * The items of the list will have to be freed with free(), and the list will 
have to be freed with evas_list_free()
+ * @brief Gets the list of the available widget-themes. The list contains the 
names of the themes, not the paths
+ * @return Returns an Evas_List of the available widget-themes
+ * @note The returned list should be free with 
etk_theme_available_themes_free()
  */
-Evas_List *etk_theme_widget_available_themes_get()
+Evas_List *etk_theme_widget_available_themes_get(void)
 {
    Ecore_List *files;
    Evas_List *themes = NULL;
+   char path[2][PATH_MAX];
    char *home;
-   char *path;
    char *file;
+   int i;
    
    if ((home = getenv("HOME")))
+      snprintf(path[0], PATH_MAX, "%s/.e/etk/themes/", home);
+   else
+      path[0][0] = '\0';
+   snprintf(path[1], PATH_MAX, PACKAGE_DATA_DIR "/themes/");
+   
+   for (i = 0; i < 2; i++)
    {
-      /* TODO: etk_config_dir_get? */
-      path = malloc(strlen(home) + strlen("/.e/etk/themes/") + 1);
-      sprintf(path, "%s/.e/etk/themes/", home);
-      files = ecore_file_ls(path);
+      files = ecore_file_ls(path[i]);
       if (files)
       {
-        ecore_list_goto_first(files);
-        while ((file = ecore_list_next(files)))      
-           themes = evas_list_append(themes, ecore_file_strip_ext(file));
+         ecore_list_goto_first(files);
+         while ((file = ecore_list_next(files)))
+            themes = evas_list_append(themes, ecore_file_strip_ext(file));
          ecore_list_destroy(files);
       }
-      free(path);
-   }
-   
-   files = ecore_file_ls(PACKAGE_DATA_DIR "/themes/");
-   if (files)
-   {
-      ecore_list_goto_first(files);
-      while ((file = ecore_list_next(files)))
-        themes = evas_list_append(themes, ecore_file_strip_ext(file));
-      ecore_list_destroy(files);
    }
    
    return themes;
 }
 
 /**
- * @brief Gets the path of the current icon-theme file of Etk
- * @return Returns the path of the current icon-theme file
+ * @brief Finds the path of a widget-theme file, from its name
+ * @param theme_name the name of the theme to find
+ * @return Returns the path of the corresponding widget-theme file,
+ * or NULL if there is no corresponding theme
+ * @note The returned value will have to be freed with free()
  */
-const char *etk_theme_icon_get()
+char *etk_theme_widget_find(const char *theme_name)
 {
-   return _etk_theme_icon_current;
+   return _etk_theme_find("themes", theme_name);
 }
 
 /**
- * @brief Sets the theme that will be used by new icons
- * @param theme_name the name of the icon-theme to use
+ * @brief Sets the theme that will be used by new icons, from its path
+ * @param theme_path the path of the icon-theme to use
  * @return Returns ETK_TRUE if the theme has been found, or ETK_FALSE otherwise
  */
-Etk_Bool etk_theme_icon_set(const char *theme_name)
+Etk_Bool etk_theme_icon_set_from_path(const char *theme_path)
 {
-   char *path;
-   
-   if (!theme_name)
+   if (!theme_path)
       return ETK_FALSE;
    
-   if ((path = _etk_theme_find("icons", theme_name)))
+   if (ecore_file_exists(theme_path))
    {
       free(_etk_theme_icon_current);
-      _etk_theme_icon_current = path;
+      _etk_theme_icon_current = strdup(theme_path);
       return ETK_TRUE;
    }
    return ETK_FALSE;
 }
 
 /**
- * @brief Gets the list of available icon-themes
- * @return Returns an Evas_List of available icon-themes.
- * The items of the list will have to be freed with free(), and the list will 
have to be freed with evas_list_free()
+ * @brief Sets the theme that will be used by new icons, from its name
+ * @param theme_name the name of the icon-theme to use
+ * @return Returns ETK_TRUE if the theme has been found, or ETK_FALSE otherwise
+ */
+Etk_Bool etk_theme_icon_set_from_name(const char *theme_name)
+{
+   return etk_theme_icon_set_from_path(etk_theme_icon_find(theme_name));
+}
+
+/**
+ * @brief Gets the path of the current icon-theme file of Etk
+ * @return Returns the path of the current icon-theme file
+ */
+const char *etk_theme_icon_path_get(void)
+{
+   return _etk_theme_icon_current;
+}
+
+/**
+ * @brief Gets the name of the current icon-theme file of Etk
+ * @return Returns the name of the current icon-theme file, or NULL on failure
+ * @note The returned path will have to be freed with free()
+ */
+char *etk_theme_icon_name_get(void)
+{
+   const char *start, *end;
+   char *name;
+   int len;
+   
+   if (!_etk_theme_icon_current)
+      return NULL;
+   
+   if (!(start = strrchr(_etk_theme_icon_current, '/')))
+      start = _etk_theme_icon_current;
+   else
+      start++;
+   
+   if ((end = strrchr(start, '.')))
+   {
+      len = end - start;
+      name = malloc(len + 1);
+      strncpy(name, start, len);
+      name[len] = '\0';
+      return name;
+   }
+   
+   return NULL;
+}
+
+/**
+ * @brief Gets the list of the available icon-themes. The list contains the 
names of the themes, not the paths
+ * @return Returns an Evas_List of the available icon-themes
+ * @note The returned list should be free with 
etk_theme_available_themes_free()
  */
-Evas_List *etk_theme_icon_available_themes_get()
+Evas_List *etk_theme_icon_available_themes_get(void)
 {
    Ecore_List *files;
    Evas_List *themes = NULL;
+   char path[2][PATH_MAX];
    char *home;
-   char *path;
    char *file;
+   int i;
    
    if ((home = getenv("HOME")))
+      snprintf(path[0], PATH_MAX, "%s/.e/etk/icons/", home);
+   else
+      path[0][0] = '\0';
+   snprintf(path[1], PATH_MAX, PACKAGE_DATA_DIR "/icons/");
+   
+   for (i = 0; i < 2; i++)
    {
-      /* TODO: etk_config_dir_get? */
-      path = malloc(strlen(home) + strlen("/.e/etk/icons/") + 1);
-      sprintf(path, "%s/.e/etk/icons/", home);
-      files = ecore_file_ls(path);
+      files = ecore_file_ls(path[i]);
       if (files)
       {
-        ecore_list_goto_first(files);
-        while ((file = ecore_list_next(files)))      
-           themes = evas_list_append(themes, ecore_file_strip_ext(file));
+         ecore_list_goto_first(files);
+         while ((file = ecore_list_next(files)))
+            themes = evas_list_append(themes, ecore_file_strip_ext(file));
          ecore_list_destroy(files);
       }
-      free(path);
    }
    
-   files = ecore_file_ls(PACKAGE_DATA_DIR "/icons/");
-   if (files)
+   return themes;
+}
+
+/**
+ * @brief Finds the path of a icon-theme file, from its name
+ * @param theme_name the name of the theme to find
+ * @return Returns the path of the corresponding icon-theme file,
+ * or NULL if there is no corresponding theme
+ * @note The returned value will have to be freed with free()
+ */
+char *etk_theme_icon_find(const char *theme_name)
+{
+   return _etk_theme_find("icons", theme_name);
+}
+
+/**
+ * @brief A function used to free the list returned by 
etk_theme_widget_available_themes_get() or
+ * etk_theme_icon_available_themes_get()
+ * @param themes the list of themes to free
+ */
+void etk_theme_available_themes_free(Evas_List *themes)
+{
+   while (themes)
    {
-      ecore_list_goto_first(files);
-      while ((file = ecore_list_next(files)))
-        themes = evas_list_append(themes, ecore_file_strip_ext(file));
-      ecore_list_destroy(files);
+      free(themes->data);
+      themes = evas_list_remove_list(themes, themes);
    }
-   
-   return themes;
 }
 
 /**
@@ -226,47 +352,19 @@
  */
 Etk_Bool etk_theme_group_exists(const char *file, const char *group, const 
char *parent_group)
 {
-   char *full_group;
+   char full_group[PATH_MAX];
    
    if (!file)
       file = _etk_theme_widget_current ? _etk_theme_widget_current : 
_etk_theme_widget_default;
-   if (!group || *group == '\0' || !file)
+   if (!group || group[0] == '\0' || !file)
       return ETK_FALSE;
    
-   if (parent_group && *parent_group)
-   {
-      full_group = malloc(strlen("etk//") + strlen(parent_group) + 
strlen(group) + 1);
-      sprintf(full_group, "etk/%s/%s", parent_group, group);
-   }
+   if (parent_group && parent_group[0] != '\0')
+      snprintf(full_group, PATH_MAX, "etk/%s/%s", parent_group, group);
    else
-   {
-      full_group = malloc(strlen("etk/") + strlen(group) + 1);
-      sprintf(full_group, "etk/%s", group);
-   }
+      snprintf(full_group, PATH_MAX, "etk/%s", group);
    
-   /* Checks if the theme-group exists */
-   if (edje_file_group_exists(file, full_group))
-   {
-      free(full_group);
-      return ETK_TRUE;
-   }
-   else
-   {
-      char *alias;
-      char *alt_group;
-      int ret;
-      
-      alias = malloc(strlen("alias: ") + strlen(full_group) + 1);
-      sprintf(alias, "alias: %s", full_group);
-      alt_group = edje_file_data_get(file, alias);
-      free(full_group);
-      free(alias);
-      
-      ret = edje_file_group_exists(file, alt_group);
-      free(alt_group);
-      
-      return ret;
-   }
+   return edje_file_group_exists(file, full_group);
 }
 
 /**
@@ -280,58 +378,30 @@
  */
 Etk_Bool etk_theme_edje_object_set(Evas_Object *object, const char *file, 
const char *group, const char *parent_group)
 {
-   char *full_group;
+   char full_group[PATH_MAX];
    
    if (!object)
       return ETK_FALSE;
    
    if (!file)
       file = _etk_theme_widget_current ? _etk_theme_widget_current : 
_etk_theme_widget_default;
-   if (!group || *group == '\0' || !file)
+   if (!group || group[0] == '\0' || !file)
    {
       edje_object_file_set(object, NULL, NULL);
       return ETK_FALSE;
    }
    
-   if (parent_group && *parent_group)
-   {
-      full_group = malloc(strlen("etk//") + strlen(parent_group) + 
strlen(group) + 1);
-      sprintf(full_group, "etk/%s/%s", parent_group, group);
-   }
+   if (parent_group && parent_group[0] != '\0')
+      snprintf(full_group, PATH_MAX, "etk/%s/%s", parent_group, group);
    else
-   {
-      full_group = malloc(strlen("etk/") + strlen(group) + 1);
-      sprintf(full_group, "etk/%s", group);
-   }
+      snprintf(full_group, PATH_MAX, "etk/%s", group);
    
-   /* Load the object */
    if (edje_object_file_set(object, file, full_group))
-   {
-      free(full_group);
       return ETK_TRUE;
-   }
    else
    {
-      char *alias;
-      char *alt_group;
-      int ret;
-      
-      alias = malloc(strlen("alias: ") + strlen(full_group) + 1);
-      sprintf(alias, "alias: %s", full_group);
-      alt_group = edje_file_data_get(file, alias);
-      free(full_group);
-      free(alias);
-      
-      ret = edje_object_file_set(object, file, alt_group);
-      free(alt_group);
-      
-      if (ret)
-         return ETK_TRUE;
-      else
-      {
-         edje_object_file_set(object, NULL, NULL);
-         return ETK_FALSE;
-      }
+      edje_object_file_set(object, NULL, NULL);
+      return ETK_FALSE;
    }
 }
 
@@ -347,31 +417,51 @@
 {
    if (!object)
       return ETK_FALSE;
-   return etk_theme_edje_object_set(object, etk_widget_theme_file_get(parent), 
group, etk_widget_theme_group_get(parent));
+   
+   return etk_theme_edje_object_set(object, etk_widget_theme_file_get(parent),
+         group, etk_widget_theme_group_get(parent));
 }
 
 /**
- * @brief Gets the color type from the theme-file.
- * @param color_type an Etk_Color_Type
- * @return Returns an Etk_Color with the color filled from the theme-file, or 
color with -1 if it wasn't found
+ * @brief Gets the components of the given color. The color depends on the 
theme used
+ * @param file the path to the theme-file where to find the given color. If @a 
file is NULL,
+ * the current widget-theme file will be used
+ * @param color_type the color whose components will be returned
+ * @param r the location where to store the 'red' component of the color
+ * @param g the location where to store the 'green' component of the color
+ * @param b the location where to store the 'blue' component of the color
+ * @param a the location where to store the 'alpha' component of the color
+ * @return Returns ETK_TRUE if the color has been found, ETK_FALSE otherwise
+ * @note Note that even if the color has not been found (because it is not 
defined in the theme),
+ * the components will still be set to their default values, so the color will 
still be usable
  */
-Etk_Color etk_theme_color_get(Etk_Color_Type color_type)
+Etk_Bool etk_theme_color_get(const char *file, Etk_Color_Type color_type, int 
*r, int *g, int *b, int *a)
 {
-   Etk_Color color;
-   const char *file;
    char *color_string;
 
-   file = _etk_theme_widget_current ? _etk_theme_widget_current : 
_etk_theme_widget_default;
-   color_string = edje_file_data_get(file, _etk_theme_colors[color_type]);
-   if (!color_string || sscanf(color_string, "%d %d %d %d", &color.r, 
&color.g, &color.b, &color.a) != 4)
+   if (!file)
+      file = _etk_theme_widget_current ? _etk_theme_widget_current : 
_etk_theme_widget_default;
+   if (color_type < 0 || color_type >= ETK_COLOR_NUM_COLORS)
+      color_type = ETK_COLOR_FOREGROUND;
+   
+   if (file)
    {
-      Etk_Color color = { .r = -1, .g = -1, .b = -1, .a = -1 };
-      if (color_string) free(color_string);
-      return color;
+      color_string = edje_file_data_get(file, 
_etk_theme_color_names[color_type]);
+      if (color_string && sscanf(color_string, "%d %d %d %d", r, g, b, a) == 4)
+      {
+         free(color_string);
+         return ETK_TRUE;
+      }
+      free(color_string);
    }
-
-   if (color_string) free(color_string);
-   return color;
+   
+   /* The color has not been found, we set it to its default value */
+   if (r)   *r = _etk_theme_default_colors[color_type][0];
+   if (g)   *g = _etk_theme_default_colors[color_type][1];
+   if (b)   *b = _etk_theme_default_colors[color_type][2];
+   if (a)   *a = _etk_theme_default_colors[color_type][3];
+   
+   return ETK_FALSE;
 }
 
 /**************************
@@ -383,28 +473,36 @@
 /* Finds the theme called "theme_name" in the subdir "subdir" and returns its 
path, or NULL on failure */
 static char *_etk_theme_find(const char *subdir, const char *theme_name)
 {
+   char path[PATH_MAX];
    char *home;
-   char *path;
    
    if (!theme_name || !subdir)
       return ETK_FALSE;
    
    if ((home = getenv("HOME")))
    {
-      /* TODO: etk_config_dir_get? */
-      path = malloc(strlen(home) + strlen(subdir) + strlen("/.e/etk//.edj") + 
strlen(theme_name) + 1);
-      sprintf(path, "%s/.e/etk/%s/%s.edj", home, subdir, theme_name);
+      snprintf(path, PATH_MAX, "%s/.e/etk/%s/%s.edj", home, subdir, 
theme_name);
       if (ecore_file_exists(path))
-         return path;
-      else
-         free(path);
+         return strdup(path);
    }
    
-   path = malloc(strlen(subdir) + strlen(PACKAGE_DATA_DIR"//.edj") + 
strlen(theme_name) + 1);
-   sprintf(path, PACKAGE_DATA_DIR"/%s/%s.edj", subdir, theme_name);
+   snprintf(path, PATH_MAX, PACKAGE_DATA_DIR"/%s/%s.edj", subdir, theme_name);
    if (ecore_file_exists(path))
-      return path;
+      return strdup(path);
    
-   free(path);
    return NULL;
 }
+
+/** @} */
+
+/**************************
+ *
+ * Documentation
+ *
+ **************************/
+
+/**
+ * @addtogroup Etk_Theme
+ *
+ * TODOC
+ */
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_theme.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- etk_theme.h 1 Feb 2007 19:14:52 -0000       1.6
+++ etk_theme.h 21 Mar 2007 18:15:26 -0000      1.7
@@ -2,15 +2,20 @@
 #ifndef _ETK_THEME_H_
 #define _ETK_THEME_H_
 
+#include <Evas.h>
+#include "etk_types.h"
+
+/* TODO/FIXME list:
+ * - Use etk_config_dir_get() to get the dirs where the themes should be 
looked for
+ * - Better default colors?
+ */
+
 /**
  * @defgroup Etk_Theme The theme system of Etk
  * @brief The theme system of Etk
  * @{
  */
 
-#include <Evas.h>
-#include "etk_types.h"
-
 /** @brief The different types of colors */
 typedef enum Etk_Color_Type
 {
@@ -20,8 +25,8 @@
    ETK_COLOR_IMPORTANT_BG,        /**< Background color to express importance 
*/
    ETK_COLOR_WARNING_FG,          /**< Foreground color to express warning */
    ETK_COLOR_WARNING_BG,          /**< Background color to express warning */
-   ETK_COLOR_INFO_FG,            /**< Foreground color to show informative 
areas */
-   ETK_COLOR_INFO_BG,            /**< Background color to show informative 
areas */
+   ETK_COLOR_INFO_FG,             /**< Foreground color to show informative 
areas */
+   ETK_COLOR_INFO_BG,             /**< Background color to show informative 
areas */
    ETK_COLOR_DEFAULT1_FG,         /**< Default foreground color 1 */
    ETK_COLOR_DEFAULT1_BG,         /**< Default background color 1 */
    ETK_COLOR_DEFAULT2_FG,         /**< Default foreground color 2 */
@@ -35,22 +40,31 @@
    ETK_COLOR_NUM_COLORS
 } Etk_Color_Type;
 
-void etk_theme_init();
-void etk_theme_shutdown();
 
-const char *etk_theme_widget_get();
-Etk_Bool    etk_theme_widget_set(const char *theme_name);
-Evas_List  *etk_theme_widget_available_themes_get();
-
-const char *etk_theme_icon_get();
-Etk_Bool    etk_theme_icon_set(const char *theme_name);
-Evas_List  *etk_theme_icon_available_themes_get();
+void etk_theme_init(void);
+void etk_theme_shutdown(void);
+
+Etk_Bool    etk_theme_widget_set_from_path(const char *theme_path);
+Etk_Bool    etk_theme_widget_set_from_name(const char *theme_name);
+const char *etk_theme_widget_path_get(void);
+char       *etk_theme_widget_name_get(void);
+Evas_List  *etk_theme_widget_available_themes_get(void);
+char       *etk_theme_widget_find(const char *theme_name);
+
+Etk_Bool    etk_theme_icon_set_from_path(const char *theme_path);
+Etk_Bool    etk_theme_icon_set_from_name(const char *theme_name);
+const char *etk_theme_icon_path_get(void);
+char       *etk_theme_icon_name_get(void);
+Evas_List  *etk_theme_icon_available_themes_get(void);
+char       *etk_theme_icon_find(const char *theme_name);
+
+void        etk_theme_available_themes_free(Evas_List *themes);
 
 Etk_Bool etk_theme_group_exists(const char *file, const char *group, const 
char *parent_group);
 Etk_Bool etk_theme_edje_object_set(Evas_Object *object, const char *file, 
const char *group, const char *parent_group);
 Etk_Bool etk_theme_edje_object_set_from_parent(Evas_Object *object, const char 
*group, Etk_Widget *parent);
 
-Etk_Color etk_theme_color_get(Etk_Color_Type color_type);
+Etk_Bool etk_theme_color_get(const char *file, Etk_Color_Type color_type, int 
*r, int *g, int *b, int *a);
 
 /** @} */
 
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_widget.c,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -3 -r1.103 -r1.104
--- etk_widget.c        18 Mar 2007 20:44:47 -0000      1.103
+++ etk_widget.c        21 Mar 2007 18:15:26 -0000      1.104
@@ -500,8 +500,8 @@
  * @brief Gets the full theme-group of the widget
  * @param widget a widget
  * @return Returns the full theme-group of the widget
- * @note The returned value may be different from the theme-group set with 
etk_widget_theme_group_set(): if
- * @a widget has a theme-parent, this will be taken into account. For example, 
if @a widget is a row, and
+ * @note The returned value may be different from the theme-group set with 
etk_widget_theme_group_set() because
+ * if @a widget has a theme-parent, it will be taken into account. For 
example, if @a widget is a row, and
  * the theme-parent of the widget is a tree, the returned value will be 
"tree/row", and not just "row". @n
  * To get the value set with etk_widget_theme_group_set(), you can use
  * etk_object_properties_get(ETK_OBJECT(widget), "theme_group", &theme_group);



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to