Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_apps.c e_apps.h e_border.c e_border.h 


Log Message:


1. fix a segv on restart with ibar unreffing without a ref
2. add app icons (based off applications/all repository - need to make this a
function of its own though)
3. fix default apps to have name/class info.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- e_apps.c    2 Dec 2004 07:00:30 -0000       1.4
+++ e_apps.c    2 Dec 2004 10:07:50 -0000       1.5
@@ -37,12 +37,14 @@
 
 /* local subsystem globals */
 static Evas_Hash   *_e_apps = NULL;
+static Evas_List   *_e_apps_list = NULL;
 static Ecore_Timer *_e_apps_checker = NULL;
 static int          _e_apps_callbacks_walking = 0;
 static int          _e_apps_callbacks_delete_me = 0;
 static Evas_List   *_e_apps_change_callbacks = NULL;
 static Ecore_Event_Handler *_e_apps_exit_handler = NULL;
 static Evas_List   *_e_apps_repositories = NULL;
+static E_App       *_e_apps_all = NULL;
 
 /* externally accessible functions */
 int
@@ -53,15 +55,21 @@
    
    home = e_user_homedir_get();
    snprintf(buf, sizeof(buf), "%s/.e/e/applications/all", home);
-   E_FREE(home);
+   free(home);
    _e_apps_repositories = evas_list_append(_e_apps_repositories, strdup(buf));
    _e_apps_exit_handler = ecore_event_handler_add(ECORE_EVENT_EXE_EXIT, 
_e_apps_cb_exit, NULL);
+   _e_apps_all = e_app_new(buf, 1);
    return 1;
 }
 
 int
 e_app_shutdown(void)
 {
+   if (_e_apps_all)
+     {
+       e_object_unref(E_OBJECT(_e_apps_all));
+       _e_apps_all = NULL;
+     }
    while (_e_apps_repositories)
      {
        free(_e_apps_repositories->data);
@@ -144,6 +152,7 @@
        return NULL;
      }
    _e_apps = evas_hash_add(_e_apps, a->path, a);
+   _e_apps_list = evas_list_prepend(_e_apps_list, a);
    _e_app_monitor();
    return a;
 }
@@ -180,8 +189,7 @@
             Evas_List *pl;
                        
             snprintf(buf, sizeof(buf), "%s/%s", a->path, s);
-            if (e_file_exists(buf))
-              a2 = e_app_new(buf, scan_subdirs);
+            if (e_file_exists(buf)) a2 = e_app_new(buf, scan_subdirs);
             pl = _e_apps_repositories;
             while ((!a2) && (pl))
               {
@@ -270,6 +278,38 @@
      }
 }
 
+E_App *
+e_app_window_name_class_find(char *name, char *class)
+{
+   Evas_List *l;
+   
+   for (l = _e_apps_list; l; l = l->next)
+     {
+       E_App *a;
+       
+       a = l->data;
+       if ((a->win_name) || (a->win_class))
+         {
+            int ok = 0;
+            
+//          printf("%s.%s == %s.%s\n", name, class, a->win_name, a->win_class);
+            if ((!a->win_name) ||
+                ((a->win_name) && (!strcmp(a->win_name, name))))
+              ok++;
+            if ((!a->win_class) ||
+                ((a->win_class) && (!strcmp(a->win_class, class))))
+              ok++;
+            if (ok >= 2)
+              {
+                 _e_apps_list = evas_list_remove_list(_e_apps_list, l);
+                 _e_apps_list = evas_list_prepend(_e_apps_list, a);
+                 return a;
+              }
+         }
+     }
+   return NULL;
+}
+
 /* local subsystem functions */
 static void
 _e_app_free(E_App *a)
@@ -287,12 +327,14 @@
        E_App *a2;
        
        a2 = a->subapps->data;
-       e_object_unref(E_OBJECT(a2));
        a->subapps = evas_list_remove(a->subapps, a2);
+       a2->parent = NULL;
+       e_object_unref(E_OBJECT(a2));
      }
    if (a->parent)
      a->parent->subapps = evas_list_remove(a->parent->subapps, a);
    _e_apps = evas_hash_del(_e_apps, a->path, a);
+   _e_apps_list = evas_list_remove(_e_apps_list, a);
    if (a->name) free(a->name);
    if (a->generic) free(a->generic);
    if (a->comment) free(a->comment);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_apps.h    25 Nov 2004 05:31:20 -0000      1.2
+++ e_apps.h    2 Dec 2004 10:07:50 -0000       1.3
@@ -54,4 +54,7 @@
     
 EAPI void   e_app_change_callback_add(void (*func) (void *data, E_App *a, 
E_App_Change ch), void *data);
 EAPI void   e_app_change_callback_del(void (*func) (void *data, E_App *a, 
E_App_Change ch), void *data);
+
+EAPI E_App *e_app_window_name_class_find(char *name, char *class);
+
 #endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- e_border.c  2 Dec 2004 07:43:33 -0000       1.10
+++ e_border.c  2 Dec 2004 10:07:50 -0000       1.11
@@ -418,6 +418,7 @@
    if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
    if (bd->client.icccm.machine) free(bd->client.icccm.machine);
    e_object_del(E_OBJECT(bd->shape));
+   if (bd->icon_object) evas_object_del(bd->icon_object);
    evas_object_del(bd->bg_object);
    e_canvas_del(bd->bg_ecore_evas);
    ecore_evas_free(bd->bg_ecore_evas);
@@ -1134,11 +1135,59 @@
      }
    if (bd->client.icccm.fetch.name_class)
      {
-       if (bd->client.icccm.name) free(bd->client.icccm.name);
+       int nc_change = 0;
+       char *pname, *pclass;
+       
+       pname = bd->client.icccm.name;
+       pclass = bd->client.icccm.class;
        bd->client.icccm.name = NULL;
-       if (bd->client.icccm.class) free(bd->client.icccm.class);
        bd->client.icccm.class = NULL;
        ecore_x_window_prop_name_class_get(bd->client.win, 
&bd->client.icccm.name, &bd->client.icccm.class);
+       if ((pname) && (bd->client.icccm.name) &&
+           (pclass) && (bd->client.icccm.class))
+         {
+            if (!((!strcmp(bd->client.icccm.name, pname)) &&
+                  (!strcmp(bd->client.icccm.class, pclass))))
+              nc_change = 1;
+         }
+       else if (((!pname) || (!pclass)) &&
+                ((bd->client.icccm.name) || (bd->client.icccm.class)))
+         nc_change = 1;
+       else if (((bd->client.icccm.name) || (bd->client.icccm.class)) &&
+                ((!pname) || (!pclass)))
+         nc_change = 1;
+       if (pname) free(pname);
+       if (pclass) free(pclass);
+       if (nc_change)
+         {
+            E_App *a;
+            
+            a = NULL;
+            if (bd->icon_object)
+              {
+                 evas_object_del(bd->icon_object);
+                 bd->icon_object = NULL;
+              }
+            if ((bd->client.icccm.name) && (bd->client.icccm.class))
+              {
+                 a = e_app_window_name_class_find(bd->client.icccm.name,
+                                                  bd->client.icccm.class);
+                 if (a)
+                   {
+                      bd->icon_object = edje_object_add(bd->bg_evas);
+                      edje_object_file_set(bd->icon_object, a->path, "icon");
+                      if (bd->bg_object)
+                        {
+                           evas_object_show(bd->icon_object);
+                           edje_object_part_swallow(bd->bg_object, 
"icon_swallow", bd->icon_object);
+                        }
+                      else
+                        {
+                           evas_object_hide(bd->icon_object);
+                        }
+                   }
+              }
+         }
        bd->client.icccm.fetch.name_class = 0;
      }
    if (bd->client.icccm.fetch.icon_name)
@@ -1357,6 +1406,19 @@
        evas_object_resize(o, bd->w, bd->h);
        evas_object_show(o);
        bd->client.border.changed = 0;
+       
+       if (bd->icon_object)
+         {
+            if (bd->bg_object)
+              {
+                 evas_object_show(bd->icon_object);
+                 edje_object_part_swallow(bd->bg_object, "icon_swallow", 
bd->icon_object);
+              }
+            else
+              {
+                 evas_object_hide(bd->icon_object);
+              }
+         }
      }
 
    if (bd->new_client)
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- e_border.h  25 Nov 2004 15:32:36 -0000      1.4
+++ e_border.h  2 Dec 2004 10:07:50 -0000       1.5
@@ -36,6 +36,7 @@
    Evas           *bg_evas;
    Ecore_X_Window  bg_win;
    Evas_Object    *bg_object;
+   Evas_Object    *icon_object;
    Ecore_X_Window  event_win;
    
    struct {




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to