[prev in list] [next in list] [prev in thread] [next in thread] 

List:       enlightenment-svn
Subject:    E SVN: raster trunk/e/src/bin
From:       "Enlightenment SVN" <no-reply () enlightenment ! org>
Date:       2011-08-31 13:02:04
Message-ID: 20110831130204.7853E300001 () e2 ! enlightenment ! org
[Download RAW message or body]

Log:
bug pointed out by doyun - e can manipulate its list of windows while
  doing eval - so make an array copy of them for walking border list for
  safety.
  
  

Author:       raster
Date:         2011-08-31 06:02:04 -0700 (Wed, 31 Aug 2011)
New Revision: 63033
Trac:         http://trac.enlightenment.org/e/changeset/63033

Modified:
  trunk/e/src/bin/e_container.c trunk/e/src/bin/e_container.h 

Modified: trunk/e/src/bin/e_container.c
===================================================================
--- trunk/e/src/bin/e_container.c	2011-08-31 13:01:43 UTC (rev 63032)
+++ trunk/e/src/bin/e_container.c	2011-08-31 13:02:04 UTC (rev 63033)
@@ -819,79 +819,76 @@
       eina_list_prepend_relative(bd->zone->container->layers[pos].clients, bd, below);
 }
 
-EAPI E_Border_List *
-e_container_border_list_first(E_Container *con)
+static E_Border_List *
+_e_container_border_list_new(E_Container *con)
 {
    E_Border_List *list = NULL;
-
+   E_Border *bd;
+   int i;
+   Eina_List *l;
+   
    if (!(list = E_NEW(E_Border_List, 1))) return NULL;
    list->container = con;
-   e_object_ref(E_OBJECT(con));
-   list->layer = 0;
-   list->clients = list->container->layers[list->layer].clients;
-   while ((list->layer < 6) && (!list->clients))
-     list->clients = list->container->layers[++list->layer].clients;
+   e_object_ref(E_OBJECT(list->container));
+   eina_array_step_set(&(list->client_array), sizeof(list->client_array), 256);
+   for (i = 0; i < 7; i++)
+     {
+        EINA_LIST_FOREACH(con->layers[i].clients, l, bd)
+           eina_array_push(&(list->client_array), bd);
+     }
    return list;
 }
 
+static E_Border *
+_e_container_border_list_jump(E_Border_List *list, int dir)
+{
+   E_Border *bd;
+   
+   if ((list->pos < 0) || 
+       (list->pos >= eina_array_count_get(&(list->client_array))))
+      return NULL;
+   bd = eina_array_data_get(&(list->client_array), list->pos);
+   list->pos += dir;
+   return bd;
+}
+
 EAPI E_Border_List *
+e_container_border_list_first(E_Container *con)
+{
+   E_Border_List *list = NULL;
+   
+   list = _e_container_border_list_new(con);
+   list->pos = 0;
+   return list;
+}
+
+EAPI E_Border_List *
 e_container_border_list_last(E_Container *con)
 {
    E_Border_List *list = NULL;
 
-   if (!(list = E_NEW(E_Border_List, 1))) return NULL;
-   list->container = con;
-   e_object_ref(E_OBJECT(con));
-   list->layer = 6;
-   if (list->container->layers[list->layer].clients)
-     list->clients = eina_list_last(list->container->layers[list->layer].clients);
-   while ((list->layer > 0) && (!list->clients))
-     {
-	list->layer--;
-	if (list->container->layers[list->layer].clients)
-	  list->clients = eina_list_last(list->container->layers[list->layer].clients);
-     }
+   list = _e_container_border_list_new(con);
+   list->pos = eina_array_count_get(&(list->client_array)) - 1;
    return list;
 }
 
 EAPI E_Border *
 e_container_border_list_next(E_Border_List *list)
 {
-   E_Border *bd;
-
-   if (!list->clients) return NULL;
-
-   bd = eina_list_data_get(list->clients);
-
-   list->clients = eina_list_next(list->clients);
-   while ((list->layer < 6) && (!list->clients))
-     list->clients = list->container->layers[++list->layer].clients;
-   return bd;
+   return _e_container_border_list_jump(list, 1);
 }
 
 EAPI E_Border *
 e_container_border_list_prev(E_Border_List *list)
 {
-   E_Border *bd;
-
-   if (!list->clients) return NULL;
-
-   bd = eina_list_data_get(list->clients);
-
-   list->clients = eina_list_prev(list->clients);
-   while ((list->layer > 0) && (!list->clients))
-     {
-	list->layer--;
-	if (list->container->layers[list->layer].clients)
-	  list->clients = eina_list_last(list->container->layers[list->layer].clients);
-     }
-   return bd;
+   return _e_container_border_list_jump(list, -1);
 }
 
 EAPI void
 e_container_border_list_free(E_Border_List *list)
 {
    e_object_unref(E_OBJECT(list->container));
+   eina_array_flush(&(list->client_array));
    free(list);
 }
 

Modified: trunk/e/src/bin/e_container.h
===================================================================
--- trunk/e/src/bin/e_container.h	2011-08-31 13:01:43 UTC (rev 63032)
+++ trunk/e/src/bin/e_container.h	2011-08-31 13:02:04 UTC (rev 63033)
@@ -58,8 +58,8 @@
 struct _E_Border_List
 {
    E_Container *container;
-   int layer;
-   Eina_List *clients;
+   Eina_Array   client_array;
+   int          pos;
 };
 
 struct _E_Container_Shape


------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
enlightenment-svn mailing list
enlightenment-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic