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_icon.c e_icon.h 


Log Message:


I have cleaned up app instance trackign a little. it's a bit complex really,
but works better now, and e now falls back to lookign for startup info and
app instances etc. to try find an icon, and finally uses the icon provided by
the app itself (netwm icon only) :)

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -3 -r1.70 -r1.71
--- e_apps.c    26 Sep 2005 02:06:23 -0000      1.70
+++ e_apps.c    26 Sep 2005 09:13:43 -0000      1.71
@@ -297,6 +297,7 @@
                                 a3->parent = a;
                                 a->subapps = evas_list_append(a->subapps, a3);
                                 a2->references = 
evas_list_append(a2->references, a3);
+                                _e_apps_list = evas_list_prepend(_e_apps_list, 
a3);
                              }
                            else
                              e_object_del(E_OBJECT(a3));
@@ -476,6 +477,7 @@
                                 a3->parent = a;
                                 a->subapps = evas_list_append(a->subapps, a3);
                                 a2->references = 
evas_list_append(a2->references, a3);
+                                _e_apps_list = evas_list_prepend(_e_apps_list, 
a3);
                              }
                            else
                              e_object_del(E_OBJECT(a3));
@@ -503,9 +505,11 @@
    if (!a->exe) return 0;
    /* FIXME: set up locale, encoding and input method env vars if they are in
     * the eapp file */
-   exe = ecore_exe_run(a->exe, a);
+   inst = calloc(1, sizeof(E_App_Instance));
+   exe = ecore_exe_run(a->exe, inst);
    if (!exe)
      {
+       free(inst);
        e_error_dialog_show(_("Run Error"),
                            _("Enlightenment was unable fork a child process:\n"
                              "\n"
@@ -514,17 +518,16 @@
                            a->exe);
        return 0;
      }
-   inst = calloc(1, sizeof(E_App_Instance));
    inst->app = a;
    inst->exe = exe;
    inst->launch_id = launch_id;
    inst->launch_time = ecore_time_get();
    inst->expire_timer = ecore_timer_add(10.0, _e_app_cb_expire_timer, inst);
    a->instances = evas_list_append(a->instances, inst);
-   e_object_ref(E_OBJECT(a));
+//   e_object_ref(E_OBJECT(a));
+   _e_apps_start_pending = evas_list_append(_e_apps_start_pending, a);
    if (a->startup_notify) a->starting = 1;
    _e_app_change(a, E_APP_EXEC);
-   _e_apps_start_pending = evas_list_append(_e_apps_start_pending, a);
    return 1;
 }
 
@@ -766,6 +769,33 @@
 }
 
 E_App *
+e_app_launch_id_pid_find(int launch_id, pid_t pid)
+{
+   Evas_List *l, *ll;
+   
+   for (l = _e_apps_list; l; l = l->next)
+     {
+       E_App *a;
+       
+       a = l->data;
+       for (ll = a->instances; ll; ll = ll->next)
+         {
+            E_App_Instance *ai;
+            
+            ai = ll->data;
+            if (((launch_id > 0) && (ai->launch_id > 0) && (ai->launch_id == 
launch_id)) ||
+                ((pid > 1) && (ai->exe) && (ecore_exe_pid_get(ai->exe) == 
pid)))
+              {
+                 _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;
+}
+
+E_App *
 e_app_window_name_class_title_role_find(const char *name, const char *class,
                                        const char *title, const char *role)
 {
@@ -927,18 +957,10 @@
             E_App_Instance *inst;
 
             inst = a->instances->data;
-            if (inst->expire_timer)
-              {
-                 ecore_timer_del(inst->expire_timer);
-                 inst->expire_timer = NULL;
-              }
-            if (inst->exe)
-              {
-                 ecore_exe_free(inst->exe);
-                 inst->exe = NULL;
-              }
-            free(inst);
+            inst->app = a->orig;
+            a->orig->instances = evas_list_append(a->orig->instances, inst);
             a->instances = evas_list_remove_list(a->instances, a->instances);
+            _e_apps_start_pending = evas_list_append(_e_apps_start_pending, 
a->orig);
          }
        /* If this is a copy, it shouldn't have any references! */
        if (a->references)
@@ -946,6 +968,7 @@
        if (a->parent)
          a->parent->subapps = evas_list_remove(a->parent->subapps, a);
        a->orig->references = evas_list_remove(a->orig->references, a);
+       _e_apps_list = evas_list_remove(_e_apps_list, a);
        e_object_unref(E_OBJECT(a->orig));
        free(a);
      }
@@ -1277,56 +1300,6 @@
      }
 }
 
-static int
-_e_apps_cb_exit(void *data, int type, void *event)
-{
-   Ecore_Event_Exe_Exit *ev;
-   E_App *a;
-   
-   /* FIXME: Check if we launched this exe, else it isn't sure that
-    * the exe data is an E_App!
-    */
-   ev = event;
-   if (ev->exe)
-     {
-       a = ecore_exe_data_get(ev->exe);
-       if (a)
-         {
-            Evas_List *l;
-            
-            if (ev->exit_code == 127) /* /bin/sh uses this if cmd not found */
-              e_error_dialog_show(_("Run Error"),
-                                  _("Enlightenment was unable run the 
program:\n"
-                                    "\n"
-                                    "%s\n"
-                                    "\n"
-                                    "The command was not found\n"),
-                                  a->exe);
-            for (l = a->instances; l; l = l->next)
-              {
-                 E_App_Instance *inst;
-                 
-                 inst = l->data;
-                 if (ev->exe == inst->exe)
-                   {
-                      if (inst->expire_timer)
-                        {
-                           ecore_timer_del(inst->expire_timer);
-                           inst->expire_timer = NULL;
-                        }
-                      inst->exe = NULL;
-                      a->instances = evas_list_remove_list(a->instances, l);
-                      free(inst);
-                      break;
-                   }
-              }
-            _e_app_change(a, E_APP_EXIT);
-            e_object_unref(E_OBJECT(a));
-         }
-     }
-   return 1;
-}
-
 static void
 _e_app_cb_monitor(void *data, Ecore_File_Monitor *em,
                  Ecore_File_Event event, const char *path)
@@ -1524,6 +1497,7 @@
 
                                      subapps = evas_list_append(subapps, a3);
                                      a2->references = 
evas_list_append(a2->references, a3);
+                                     _e_apps_list = 
evas_list_prepend(_e_apps_list, a3);
                                   }
                                 else
                                   e_object_del(E_OBJECT(a3));
@@ -1661,6 +1635,60 @@
 }
 
 static int
+_e_apps_cb_exit(void *data, int type, void *event)
+{
+   Ecore_Event_Exe_Exit *ev;
+   E_App *a;
+   
+   /* FIXME: Check if we launched this exe, else it isn't sure that
+    * the exe data is an E_App!
+    */
+   ev = event;
+   if (ev->exe)
+     {
+       E_App_Instance *ai;
+       
+       ai = ecore_exe_data_get(ev->exe);
+       a = ai->app;
+       if (a)
+         {
+            Evas_List *l;
+            
+            if (ev->exit_code == 127) /* /bin/sh uses this if cmd not found */
+              e_error_dialog_show(_("Run Error"),
+                                  _("Enlightenment was unable run the 
program:\n"
+                                    "\n"
+                                    "%s\n"
+                                    "\n"
+                                    "The command was not found\n"),
+                                  a->exe);
+            for (l = a->instances; l; l = l->next)
+              {
+                 E_App_Instance *inst;
+                 
+                 inst = l->data;
+                 if (ev->exe == inst->exe)
+                   {
+                      if (inst->expire_timer)
+                        {
+                           ecore_timer_del(inst->expire_timer);
+                           inst->expire_timer = NULL;
+                        }
+                      inst->exe = NULL;
+                      a->instances = evas_list_remove_list(a->instances, l);
+                      free(inst);
+                      _e_apps_start_pending = 
evas_list_remove(_e_apps_start_pending, a);
+//                    e_object_unref(E_OBJECT(a));
+                      break;
+                   }
+              }
+            _e_app_change(a, E_APP_EXIT);
+         }
+     }
+   return 1;
+}
+
+static int
 _e_app_cb_event_border_add(void *data, int type, void *event)
 {
    E_Event_Border_Add *ev;
@@ -1694,8 +1722,8 @@
        a = removes->data;
         _e_app_change(a, E_APP_READY);
        _e_apps_start_pending = evas_list_remove(_e_apps_start_pending, a);
-       removes = evas_list_remove_list(removes, removes);
         e_object_unref(E_OBJECT(a));
+       removes = evas_list_remove_list(removes, removes);
      }
    return 1;
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- e_apps.h    24 Sep 2005 17:25:48 -0000      1.20
+++ e_apps.h    26 Sep 2005 09:13:43 -0000      1.21
@@ -90,6 +90,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_launch_id_pid_find(int launch_id, pid_t pid);
 EAPI E_App *e_app_window_name_class_title_role_find(const char *name, const 
char *class,
                                                    const char *title, const 
char *role);
 EAPI E_App *e_app_file_find(char *file);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.418
retrieving revision 1.419
diff -u -3 -r1.418 -r1.419
--- e_border.c  25 Sep 2005 22:04:20 -0000      1.418
+++ e_border.c  26 Sep 2005 09:13:43 -0000      1.419
@@ -2077,11 +2077,11 @@
 e_border_icon_add(E_Border *bd, Evas *evas)
 {
    Evas_Object *o;
+   E_App *a = NULL;
 
    o = NULL;
    if ((bd->client.icccm.name) && (bd->client.icccm.class))
      {
-       E_App *a;
        char *title = "";
        
        if (bd->client.netwm.name) title = bd->client.netwm.name;
@@ -2090,11 +2090,18 @@
                                                    bd->client.icccm.class,
                                                    title,
                                                    
bd->client.icccm.window_role);
-       if (a)
+     }
+   if (!a)
+     {
+       a = e_app_launch_id_pid_find(bd->client.netwm.e_start_launch_id,
+                                    bd->client.netwm.pid);
+     }
+   if (a)
+     {
+       o = edje_object_add(evas);
+       if (!e_util_edje_icon_list_set(o, a->icon_class))
          {
-            o = edje_object_add(evas);
-            if (!e_util_edje_icon_list_set(o, a->icon_class))
-              edje_object_file_set(o, a->path, "icon");
+            edje_object_file_set(o, a->path, "icon");
          }
      }
    else if (bd->client.netwm.icons)
@@ -2792,9 +2799,9 @@
        return 1;
      }
    /* Don't delete hidden or iconified windows */
-   if ((bd->iconic) || (!bd->visible) || (bd->await_hide_event))
+   if ((bd->iconic) || (!bd->visible) || (bd->await_hide_event > 0))
      {
-       if (bd->await_hide_event)
+       if (bd->await_hide_event > 0)
          bd->await_hide_event--;
        /* Only hide the border if it is visible */
        if (bd->visible)
@@ -4083,17 +4090,38 @@
                       if (bd->icon_object)
                         {
                            E_Drag *drag;
-                           Evas_Object *o;
+                           Evas_Object *o = NULL;
                            Evas_Coord x, y, w, h;
-                           const char *file, *part;
+                           const char *file = NULL, *part = NULL;
 
                            evas_object_geometry_get(bd->icon_object,
                                                     &x, &y, &w, &h);
                            drag = e_drag_new(bd->zone->container, bd->x + x, 
bd->y + y,
                                              "enlightenment/border", bd, NULL);
-                           o = edje_object_add(drag->evas);
                            edje_object_file_get(bd->icon_object, &file, &part);
-                           edje_object_file_set(o, file, part);
+                           if ((file) && (part))
+                             {
+                                o = edje_object_add(drag->evas);
+                                edje_object_file_set(o, file, part);
+                             }
+                           else
+                             {
+                                int iw, ih;
+                                void *data;
+                                
+                                data = e_icon_data_get(bd->icon_object, &iw, 
&ih);
+                                if (data)
+                                  {
+                                     o = e_icon_add(drag->evas);
+                                     e_icon_data_set(o, data, iw, ih);
+                                  }
+                             }
+                           if (!o)
+                             {
+                                /* FIXME: fallback icon for drag */
+                                o = evas_object_rectangle_add(drag->evas);
+                                evas_object_color_set(o, 255, 255, 255, 255);
+                             }
                            e_drag_object_set(drag, o);
 
                            e_drag_resize(drag, w, h);
@@ -4478,37 +4506,6 @@
        bd->client.netwm.update.state = 0;
      }
 
-   if (bd->changes.icon)
-     {
-       if (bd->icon_object)
-         {
-            evas_object_del(bd->icon_object);
-            bd->icon_object = NULL;
-         }
-
-       bd->icon_object = e_border_icon_add(bd, bd->bg_evas);
-       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);
-         }
-
-         {
-            E_Event_Border_Icon_Change *ev;
-
-            ev = calloc(1, sizeof(E_Event_Border_Icon_Change));
-            ev->border = bd;
-            e_object_ref(E_OBJECT(bd));
-//          e_object_breadcrumb_add(E_OBJECT(bd), "border_icon_change_event");
-            ecore_event_add(E_EVENT_BORDER_ICON_CHANGE, ev,
-                            _e_border_event_border_icon_change_free, NULL);
-         }
-       bd->changes.icon = 0;
-     }
    if (bd->changes.shape)
      {
        Ecore_X_Rectangle *rects;
@@ -5029,7 +5026,7 @@
               e_border_zone_set(bd, zone);
          }
      }
-
+   
    /* effect changes to the window border itself */
    if ((bd->changes.shading))
      {
@@ -5361,6 +5358,38 @@
          }
        bd->changes.visible = 0;
      }
+
+   if (bd->changes.icon)
+     {
+       if (bd->icon_object)
+         {
+            evas_object_del(bd->icon_object);
+            bd->icon_object = NULL;
+         }
+       bd->icon_object = e_border_icon_add(bd, bd->bg_evas);
+       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);
+         }
+
+         {
+            E_Event_Border_Icon_Change *ev;
+
+            ev = calloc(1, sizeof(E_Event_Border_Icon_Change));
+            ev->border = bd;
+            e_object_ref(E_OBJECT(bd));
+//          e_object_breadcrumb_add(E_OBJECT(bd), "border_icon_change_event");
+            ecore_event_add(E_EVENT_BORDER_ICON_CHANGE, ev,
+                            _e_border_event_border_icon_change_free, NULL);
+         }
+       bd->changes.icon = 0;
+     }
+   
    bd->new_client = 0;
    
    bd->changed = 0;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_icon.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- e_icon.c    3 Jun 2005 06:43:23 -0000       1.3
+++ e_icon.c    26 Sep 2005 09:13:44 -0000      1.4
@@ -140,6 +140,16 @@
    evas_object_image_data_copy_set(sd->obj, data);
 }
 
+void *
+e_icon_data_get(Evas_Object *obj, int *w, int *h)
+{
+   E_Smart_Data *sd;
+   
+   sd = evas_object_smart_data_get(obj);
+   evas_object_image_size_get(sd->obj, w, h);
+   return evas_object_image_data_get(sd->obj, 0);
+}
+
 /* local subsystem globals */
 static void
 _e_icon_smart_reconfigure(E_Smart_Data *sd)
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_icon.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- e_icon.h    3 Jun 2005 06:43:23 -0000       1.5
+++ e_icon.h    26 Sep 2005 09:13:44 -0000      1.6
@@ -17,6 +17,7 @@
 EAPI int          e_icon_fill_inside_get  (Evas_Object *obj);
 EAPI void         e_icon_fill_inside_set  (Evas_Object *obj, int fill_inside);
 EAPI void         e_icon_data_set         (Evas_Object *obj, void *data, int 
w, int h);
-
+EAPI void        *e_icon_data_get         (Evas_Object *obj, int *w, int *h);
+    
 #endif
 #endif




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to