Enlightenment CVS committal

Author  : onefang
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_desktop


Modified Files:
        Ecore_Desktop.h ecore_desktop.c ecore_desktop_menu.c 
        ecore_desktop_paths.c 


Log Message:
Bring it a bit more up to scratch, and a better match for what is
required in e_apps.c.

API breakage.


===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/Ecore_Desktop.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- Ecore_Desktop.h     14 Aug 2006 21:14:40 -0000      1.6
+++ Ecore_Desktop.h     14 Aug 2006 21:42:53 -0000      1.7
@@ -1,8 +1,9 @@
 #ifndef _ECORE_DESKTOP_H
 # define _ECORE_DESKTOP_H
 
-/* FIXME: No unnecessary includes in exported headers. */
+/* FIXME: No unnecessary includes in exported headers, when things settle down 
and we know what is unnecessary. */
 #include <string.h>
+#include <strings.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -35,7 +36,7 @@
 
 #define MAX_PATH 4096
 
-/* FIXME: No unnecessary macros in exported headers. */
+/* FIXME: No unnecessary macros in exported headers, when things settle down 
and we know what is unnecessary. */
 #define E_FN_DEL(_fn, _h) if (_h) { _fn(_h); _h = NULL; }
 #define E_REALLOC(p, s, n) p = (s *)realloc(p, sizeof(s) * n)
 #define E_NEW(s, n) (s *)calloc(n, sizeof(s))
@@ -52,6 +53,7 @@
 struct _Ecore_Desktop
 {
    Ecore_Hash         *data, *group, *Categories, *OnlyShowIn, *NotShowIn;
+   char               *eap_name;
    char               *name;
    char               *generic;
    char               *comment;
@@ -59,6 +61,7 @@
    char               *categories;
    char               *exec;
    char               *icon;
+   char               *icon_class;
    char               *icon_path;
    char               *path;
    char               *deletiondate;
@@ -100,7 +103,7 @@
 # endif
 
    /* Function Prototypes */
-   void                ecore_desktop_paths_init(void);
+   EAPI int            ecore_desktop_paths_init(void);
    char               *ecore_desktop_paths_file_find(Ecore_List * paths,
                                                   char *file, int sub,
                                                   int (*func) (const
@@ -119,15 +122,15 @@
                                                                         char
                                                                         *path),
                                                            const void *data);
-   void                ecore_desktop_paths_shutdown(void);
+   EAPI int            ecore_desktop_paths_shutdown(void);
 
    Ecore_Hash         *ecore_desktop_paths_to_hash(char *paths);
    Ecore_List         *ecore_desktop_paths_to_list(char *paths);
 
-   void                ecore_desktop_init(void);
-   void                ecore_desktop_shutdown(void);
-   Ecore_Hash         *ecore_desktop_ini_get(char *file);
-   Ecore_Desktop      *ecore_desktop_get(char *file);
+   EAPI int            ecore_desktop_init(void);
+   EAPI int            ecore_desktop_shutdown(void);
+   Ecore_Hash         *ecore_desktop_ini_get(const char *file);
+   Ecore_Desktop      *ecore_desktop_get(const char *file, const char *lang);
    void                ecore_desktop_destroy(Ecore_Desktop * desktop);
 
    char               *ecore_desktop_icon_find(char *icon, char *icon_size,
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ecore_desktop.c     14 Aug 2006 10:22:51 -0000      1.6
+++ ecore_desktop.c     14 Aug 2006 21:42:53 -0000      1.7
@@ -1,8 +1,12 @@
+#include <ctype.h>
+
 #include "Ecore_Desktop.h"
 #include "ecore_desktop_private.h"
 
 extern int          reject_count, not_over_count;
 
+static int          init_count = 0;
+
 static Ecore_Hash  *ini_file_cache;
 static Ecore_Hash  *desktop_cache;
 
@@ -28,7 +32,7 @@
  * @ingroup Ecore_Desktop_Main_Group
  */
 Ecore_Hash         *
-ecore_desktop_ini_get(char *file)
+ecore_desktop_ini_get(const char *file)
 {
    Ecore_Hash         *result;
 
@@ -138,15 +142,16 @@
  * Use ecore_desktop_destroy() to free this structure.
  *
  * @param   file Full path to the .desktop file.
+ * @param   lang Language to use, or NULL for default.
  * @return  An Ecore_Desktop containing the files contents.
  * @ingroup Ecore_Desktop_Main_Group
  */
 Ecore_Desktop      *
-ecore_desktop_get(char *file)
+ecore_desktop_get(const char *file, const char *lang)
 {
    Ecore_Desktop      *result;
 
-   result = (Ecore_Desktop *) ecore_hash_get(desktop_cache, file);
+   result = (Ecore_Desktop *) ecore_hash_get(desktop_cache, (char *) file);
    if (!result)
      {
        result = calloc(1, sizeof(Ecore_Desktop));
@@ -165,6 +170,22 @@
                  if (result->group)
                    {
                       char               *value;
+                      char               *eap_name = NULL;
+                      char               *exe = NULL;
+                      char               *categories = NULL;
+                      int                 size = 0;
+
+                       value = (char *) ecore_file_get_file(file);
+                      if (value)
+                         {
+                            char *temp = strrchr(value, '.');
+                            if (temp)
+                               *temp = '\0';
+                            result->eap_name = malloc(strlen(value) + 5);
+                            if (result->eap_name)
+                               sprintf(result->eap_name, "%s.eap", value);
+                         }
+                      eap_name = result->eap_name;
 
                       result->name =
                          (char *)ecore_hash_get(result->group, "Name");
@@ -176,9 +197,36 @@
                          (char *)ecore_hash_get(result->group, "Type");
                       result->exec =
                          (char *)ecore_hash_get(result->group, "Exec");
-                      result->window_class =
+// FIXME: Handle the fdo %x replacable params.  Some should be stripped, some 
should be expanded.
+                       exe = result->exec;
+                      value =
                          (char *)ecore_hash_get(result->group,
                                                 "StartupWMClass");
+                      if (value)
+                         result->window_class = strdup(value);
+                      else if (result->exec)
+                         {
+                            char *tmp;
+
+                            /* Guess - exe name with first letter capitalized. 
*/
+                             tmp = strdup(result->exec);
+                            if (tmp)
+                              {
+                                 char *p;
+
+                                 value = (char *) ecore_file_get_file(tmp);  
/* In case the exe included a path. */
+                                 p = value;
+                                 while ((*p != '\0') && (*p != ' '))
+                                   {
+                                      *p = tolower(*p);
+                                      p++;
+                                   }
+                                 *p = '\0';
+                                 *value = toupper(*value);
+                                  result->window_class = strdup(value);
+                                 free(tmp);
+                              }
+                         }
                       result->icon =
                          (char *)ecore_hash_get(result->group, "Icon");
                       result->categories =
@@ -186,6 +234,7 @@
                       if (result->categories)
                          result->Categories =
                             ecore_desktop_paths_to_hash(result->categories);
+                      categories = result->categories;
                       value =
                          (char *)ecore_hash_get(result->group, "OnlyShowIn");
                       if (value)
@@ -208,6 +257,49 @@
                       if (value)
                          result->startup =
                             (!strcmp(value, "true")) ? "1" : "0";
+
+/*
+ *    icon/class is a list of standard icons from the theme that can override 
the icon created above.
+ *    Use (from .desktop) eap name,exe name,categories.  It's case sensitive, 
the reccomendation is to lowercase it.
+ *    It should be most specific to most generic.  firefox,browser,internet 
for instance
+*/
+                      if (eap_name)  size += strlen(eap_name);
+                      if (exe)  size += strlen(exe);
+                      if (categories)  size += strlen(categories);
+                     result->icon_class = malloc(size + 3);
+                     if (result->icon_class)
+                        {
+                           char *p;
+                           int done = 0;
+
+                           result->icon_class[0] = '\0';
+                           if (eap_name)
+                              {
+                                 strcat(result->icon_class, eap_name);
+                                 done = 1;
+                              }
+                           if (exe)
+                              {
+                                 if (done)
+                                    strcat(result->icon_class, ",");
+                                 strcat(result->icon_class, exe);
+                              }
+                           if (categories)
+                              {
+                                 if (done)
+                                    strcat(result->icon_class, ",");
+                                 strcat(result->icon_class, categories);
+                              }
+                           p = result->icon_class;
+                           while (*p != '\0')
+                              {
+                                 if (*p == ';')
+                                    *p = ',';
+                                 else
+                                    *p = tolower(*p);
+                                 p++;
+                              }
+                        }
                    }
                  else
                    {
@@ -245,9 +337,13 @@
  *
  * @ingroup Ecore_Desktop_Main_Group
  */
-void
+EAPI int
 ecore_desktop_init()
 {
+   if (++init_count != 1) return init_count;
+
+   if (!ecore_desktop_paths_init()) return --init_count;
+
    if (!ini_file_cache)
      {
        ini_file_cache = ecore_hash_new(ecore_str_hash, ecore_str_compare);
@@ -268,6 +364,8 @@
                                       (Ecore_Free_Cb) ecore_desktop_destroy);
          }
      }
+
+   return init_count;   
 }
 
 /**
@@ -278,9 +376,11 @@
  *
  * @ingroup Ecore_Desktop_Main_Group
  */
-void
+EAPI int
 ecore_desktop_shutdown()
 {
+   if (--init_count != 0) return init_count;
+
    if (ini_file_cache)
      {
        ecore_hash_destroy(ini_file_cache);
@@ -291,6 +391,10 @@
        ecore_hash_destroy(desktop_cache);
        desktop_cache = NULL;
      }
+
+   ecore_desktop_paths_shutdown();
+
+   return init_count;   
 }
 
 /**
@@ -305,6 +409,12 @@
 void
 ecore_desktop_destroy(Ecore_Desktop * desktop)
 {
+   if (desktop->eap_name)
+      free(desktop->eap_name);
+   if (desktop->icon_class)
+      free(desktop->icon_class);
+   if (desktop->window_class)
+      free(desktop->window_class);
    if (desktop->NotShowIn)
       ecore_hash_destroy(desktop->NotShowIn);
    if (desktop->OnlyShowIn)
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ecore_desktop_menu.c        14 Aug 2006 20:24:20 -0000      1.5
+++ ecore_desktop_menu.c        14 Aug 2006 21:42:53 -0000      1.6
@@ -10,7 +10,6 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <libgen.h>
-#include <strings.h>
 
 #include <Ecore.h>
 
@@ -1443,7 +1442,8 @@
    key = (char *)node->key;
    app = (char *)node->value;
 
-   desktop = ecore_desktop_get(app);
+   /* FIXME: pass an actualy language parameter. */
+   desktop = ecore_desktop_get(app, NULL);
 
    if ((generate_data->unallocated) && (desktop->allocated))
       return;
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop_paths.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ecore_desktop_paths.c       14 Aug 2006 21:25:53 -0000      1.5
+++ ecore_desktop_paths.c       14 Aug 2006 21:42:53 -0000      1.6
@@ -32,6 +32,8 @@
  * and correct those guesses.
  */
 
+static int                  init_count = 0;
+
 
 static Ecore_List  *_ecore_desktop_paths_get(char *before, char *env_home,
                                             char *env, char *env_home_default,
@@ -67,9 +69,11 @@
 #endif
 
 
-void
+EAPI int
 ecore_desktop_paths_init()
 {
+   if (++init_count != 1) return init_count;
+
    /* FIXME: Keep track of any loose strdups in a list, so that we can free 
them at shutdown time. */
 
 #if defined GNOME_SUPPORT || defined KDE_SUPPORT
@@ -222,15 +226,21 @@
    if (exit_handler)
       ecore_event_handler_del(exit_handler);
 #endif
+
+   return init_count;
 }
 
-void
+EAPI int
 ecore_desktop_paths_shutdown()
 {
+   if (--init_count != 0) return init_count;
+
    E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_menus);
    E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_directories);
    E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_desktops);
    E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_icons);
+
+   return init_count;
 }
 
 /** Search for a file in fdo compatible locations.



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to