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.h e_hints.c e_main.c e_startup.c 
        e_zone.c 


Log Message:


use startup notify... see ibar in default.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -3 -r1.64 -r1.65
--- e_apps.c    7 Sep 2005 01:15:40 -0000       1.64
+++ e_apps.c    14 Sep 2005 06:39:59 -0000      1.65
@@ -42,6 +42,8 @@
 static int       _e_app_is_eapp            (const char *path);
 static int       _e_app_copy               (E_App *dst, E_App *src);
 static void      _e_app_save_order         (E_App *app);
+static int       _e_app_cb_event_border_add(void *data, int type, void *event);
+static int       _e_app_cb_expire_timer    (void *data);
 
 /* local subsystem globals */
 static Evas_Hash   *_e_apps = NULL;
@@ -50,10 +52,12 @@
 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 Ecore_Event_Handler *_e_apps_border_add_handler = NULL;
 static Evas_List   *_e_apps_repositories = NULL;
 static E_App       *_e_apps_all = NULL;
 static char        *_e_apps_path_all = NULL;
 static char        *_e_apps_path_trash = NULL;
+static Evas_List   *_e_apps_start_pending = NULL;
 
 /* externally accessible functions */
 int
@@ -70,6 +74,7 @@
    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_border_add_handler = ecore_event_handler_add(E_EVENT_BORDER_ADD, 
_e_app_cb_event_border_add, NULL);
    _e_apps_all = e_app_new(buf, 1);
    return 1;
 }
@@ -77,6 +82,7 @@
 int
 e_app_shutdown(void)
 {
+   _e_apps_start_pending = evas_list_free(_e_apps_start_pending);
    if (_e_apps_all)
      {
        e_object_unref(E_OBJECT(_e_apps_all));
@@ -92,6 +98,11 @@
        ecore_event_handler_del(_e_apps_exit_handler);
        _e_apps_exit_handler = NULL;
      }
+   if (_e_apps_border_add_handler)
+     {
+       ecore_event_handler_del(_e_apps_border_add_handler);
+       _e_apps_border_add_handler = NULL;
+     }
    free(_e_apps_path_trash);
    free(_e_apps_path_all);
      {
@@ -255,9 +266,10 @@
 }
 
 int
-e_app_exec(E_App *a)
+e_app_exec(E_App *a, int launch_id)
 {
    Ecore_Exe *exe;
+   E_App_Instance *inst;
    
    E_OBJECT_CHECK_RETURN(a, 0);
    E_OBJECT_TYPE_CHECK_RETURN(a, E_APP_TYPE, 0);
@@ -275,10 +287,17 @@
                            a->exe);
        return 0;
      }
-   a->instances = evas_list_append(a->instances, exe);
+   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));
    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;
 }
 
@@ -672,14 +691,26 @@
 static void
 _e_app_free(E_App *a)
 {
+   while (evas_list_find(_e_apps_start_pending, a))
+     _e_apps_start_pending = evas_list_remove(_e_apps_start_pending, a);
    if (a->orig)
      {
        while (a->instances)
          {
-            Ecore_Exe *exe;
+            E_App_Instance *inst;
 
-            exe = a->instances->data;
-            ecore_exe_free(exe);
+            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);
             a->instances = evas_list_remove_list(a->instances, a->instances);
          }
        /* If this is a copy, it shouldn't have any references! */
@@ -695,10 +726,20 @@
      {
        while (a->instances)
          {
-            Ecore_Exe *exe;
+            E_App_Instance *inst;
 
-            exe = a->instances->data;
-            ecore_exe_free(exe);
+            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);
             a->instances = evas_list_remove_list(a->instances, a->instances);
          }
        while (a->subapps)
@@ -1024,6 +1065,8 @@
        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"
@@ -1031,8 +1074,25 @@
                                     "%s\n"
                                     "\n"
                                     "The command was not found\n"),
-                                  a->exe);     
-            a->instances = evas_list_remove(a->instances, ev->exe);
+                                  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));
          }
@@ -1361,3 +1421,61 @@
      }
    fclose(f);
 }
+
+static int
+_e_app_cb_event_border_add(void *data, int type, void *event)
+{
+   E_Event_Border_Add *ev;
+   Evas_List *l, *ll, *removes = NULL;
+   E_App *a;
+   E_App_Instance *inst;
+   
+   ev = event;
+   printf("BD ADD %i\n", ev->border->client.netwm.e_start_launch_id);
+   if (ev->border->client.netwm.e_start_launch_id <= 0) return 1;
+   for (l = _e_apps_start_pending; l; l = l->next)
+     {
+       a = l->data;
+       for (ll = a->instances; ll; ll = ll->next)
+         {
+            inst = ll->data;
+            printf("%i == %i\n", inst->launch_id, 
ev->border->client.netwm.e_start_launch_id);
+            if (inst->launch_id == ev->border->client.netwm.e_start_launch_id)
+              {
+                 if (inst->expire_timer)
+                   {
+                      ecore_timer_del(inst->expire_timer);
+                      inst->expire_timer = NULL;
+                   }
+                 removes = evas_list_append(removes, a);
+                 e_object_ref(E_OBJECT(a));
+                 break;
+              }
+         }
+     }
+   while (removes)
+     {
+       a = removes->data;
+       printf("APP [%s] popped up!\n", a->exe);
+        _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));
+     }
+   return 1;
+}
+
+static int
+_e_app_cb_expire_timer(void *data)
+{
+   E_App_Instance *inst;
+   E_App *a;
+   
+   inst = data;
+   a = inst->app;
+   printf("APP [%s] expired!\n", a->exe);
+   _e_apps_start_pending = evas_list_remove(_e_apps_start_pending, a);
+   inst->expire_timer = NULL;
+   _e_app_change(a, E_APP_READY_EXPIRE);
+   return 0;
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- e_apps.h    31 Aug 2005 04:49:05 -0000      1.18
+++ e_apps.h    14 Sep 2005 06:39:59 -0000      1.19
@@ -11,10 +11,12 @@
    E_APP_ORDER,
    E_APP_EXEC,
    E_APP_READY,
-   E_APP_EXIT
+   E_APP_EXIT,
+   E_APP_READY_EXPIRE
 } E_App_Change;
 
 typedef struct _E_App          E_App;
+typedef struct _E_App_Instance E_App_Instance;
 
 #else
 #ifndef E_APPS_H
@@ -61,13 +63,22 @@
    unsigned char       deleted : 1; /* this app's file is deleted from disk */
 };
 
+struct _E_App_Instance
+{
+   E_App       *app;
+   Ecore_Exe   *exe;
+   int          launch_id;
+   double       launch_time;
+   Ecore_Timer *expire_timer;
+};
+
 EAPI int    e_app_init(void);
 EAPI int    e_app_shutdown(void);
 
 EAPI E_App *e_app_new(const char *path, int scan_subdirs);
 EAPI int    e_app_is_parent(E_App *parent, E_App *app);
 EAPI void   e_app_subdir_scan(E_App *a, int scan_subdirs);
-EAPI int    e_app_exec(E_App *a);
+EAPI int    e_app_exec(E_App *a, int launch_id);
 EAPI int    e_app_starting_get(E_App *a);
 EAPI int    e_app_running_get(E_App *a);
 EAPI void   e_app_prepend_relative(E_App *add, E_App *before);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.h,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -3 -r1.111 -r1.112
--- e_border.h  13 Sep 2005 05:19:25 -0000      1.111
+++ e_border.h  14 Sep 2005 06:39:59 -0000      1.112
@@ -243,6 +243,8 @@
 
         Ecore_X_Window_Type type;
         
+        int e_start_launch_id;
+        
         struct {
            unsigned char name : 1;
            unsigned char icon_name : 1;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_hints.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -3 -r1.69 -r1.70
--- e_hints.c   5 Sep 2005 15:24:07 -0000       1.69
+++ e_hints.c   14 Sep 2005 06:39:59 -0000      1.70
@@ -395,6 +395,24 @@
      }
 #endif
 
+     {
+       char *str = NULL;
+       
+       if (
+           (ecore_x_netwm_startup_id_get(bd->client.win, &str) && (str)) ||
+           ((bd->client.icccm.client_leader > 0) && 
ecore_x_netwm_startup_id_get(bd->client.icccm.client_leader, &str) && (str))
+           )
+         {
+            if (!strncmp(str, "E_START|", 8))
+              {
+                 int id;
+                 
+                 id = atoi(str + 8);
+                 if (id > 0) bd->client.netwm.e_start_launch_id = id;
+              }
+            free(str);
+         }
+     }
    /* It's ok not to have fetch flag, should only be set on startup
     * and not changed. */
    if (!ecore_x_netwm_pid_get(bd->client.win, &bd->client.netwm.pid))
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.122
retrieving revision 1.123
diff -u -3 -r1.122 -r1.123
--- e_main.c    25 Aug 2005 13:48:32 -0000      1.122
+++ e_main.c    14 Sep 2005 06:39:59 -0000      1.123
@@ -424,13 +424,6 @@
    e_font_apply();
    e_canvas_recache();
 
-   /* init app system */
-   if (!e_app_init())
-     {
-       e_error_message_show(_("Enlightenment cannot set up its app system."));
-       _e_main_shutdown(-1);
-     }
-   _e_main_shutdown_push(e_app_shutdown);
    /* init theme system */
    if (!e_theme_init())
      {
@@ -456,6 +449,13 @@
                               "failed. Perhaps another window manager is 
running?\n"));
        _e_main_shutdown(-1);
      }
+   /* init app system */
+   if (!e_app_init())
+     {
+       e_error_message_show(_("Enlightenment cannot set up its app system."));
+       _e_main_shutdown(-1);
+     }
+   _e_main_shutdown_push(e_app_shutdown);
    /* do remember stuff */
    if (!e_remember_init())
      {
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_startup.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- e_startup.c 22 Jul 2005 18:49:09 -0000      1.5
+++ e_startup.c 14 Sep 2005 06:39:59 -0000      1.6
@@ -64,7 +64,7 @@
        e_init_done();
        return;
      }
-   e_app_exec(a);
+   e_app_exec(a, 0);
    snprintf(buf, sizeof(buf), _("Starting %s"), a->name);
    e_init_status_set((const char *)buf);   
    e_init_icons_app_add(a);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_zone.c,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -3 -r1.71 -r1.72
--- e_zone.c    31 Jul 2005 06:22:31 -0000      1.71
+++ e_zone.c    14 Sep 2005 06:39:59 -0000      1.72
@@ -585,10 +585,12 @@
    e_util_env_set("LD_PRELOAD_PATH", buf);
    snprintf(buf, sizeof(buf), "%s/enlightenment/preload/e_hack.so", 
e_prefix_lib_get());
  */
-   launch_id++;
+   snprintf(buf, sizeof(buf), "E_START|%i", launch_id);
+   e_util_env_set("DESKTOP_STARTUP_ID", buf);
    if (launch_id == 0) launch_id = 1;
    /* execute */
-   if (!e_app_exec(a)) launch_id = 0;
+   if (!e_app_exec(a, launch_id)) launch_id = 0;
+   launch_id++;
    
    /* reset env vars */
    if (penv_display)




-------------------------------------------------------
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