[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