Enlightenment CVS committal Author : sebastid Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_border.c e_container.c e_container.h e_hints.c e_place.c e_resist.c Log Message: Looping borders are now done in correct stacking order. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v retrieving revision 1.197 retrieving revision 1.198 diff -u -3 -r1.197 -r1.198 --- e_border.c 13 May 2005 09:23:50 -0000 1.197 +++ e_border.c 13 May 2005 13:34:20 -0000 1.198 @@ -106,9 +106,6 @@ static void _e_border_move_end(E_Border *bd); static void _e_border_move_update(E_Border *bd); -static void _e_border_reorder_after(E_Border *bd, E_Border *after); -static void _e_border_reorder_before(E_Border *bd, E_Border *before); - static int _e_border_cb_focus_fix(void *data); /* local subsystem globals */ @@ -336,7 +333,7 @@ bd->zone = e_zone_current_get(con); bd->desk = e_desk_current_get(bd->zone); - con->clients = evas_list_append(con->clients, bd); + e_container_border_add(bd); borders = evas_list_append(borders, bd); managed = 1; @@ -592,8 +589,9 @@ { E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - _e_border_reorder_after(bd, NULL); + e_container_border_raise(bd); + { E_Event_Border_Raise *ev; @@ -610,8 +608,9 @@ { E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - _e_border_reorder_before(bd, NULL); + e_container_border_lower(bd); + { E_Event_Border_Lower *ev; @@ -628,12 +627,9 @@ { E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - _e_border_reorder_after(bd, above); - ecore_x_window_configure(bd->win, - ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING | - ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE, - 0, 0, 0, 0, 0, - above->win, ECORE_X_WINDOW_STACK_ABOVE); + + e_container_border_stack_above(bd, above); + { E_Event_Border_Raise *ev; @@ -651,12 +647,8 @@ { E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - _e_border_reorder_before(bd, below); - ecore_x_window_configure(bd->win, - ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING | - ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE, - 0, 0, 0, 0, 0, - below->win, ECORE_X_WINDOW_STACK_BELOW); + + e_container_border_stack_below(bd, below); { E_Event_Border_Lower *ev; @@ -1173,7 +1165,7 @@ void e_border_idler_before(void) { - Evas_List *l; + Evas_List *ml, *cl; if (!borders) return; @@ -1182,37 +1174,62 @@ * 1. show windows * 2. hide windows and evaluate rest */ - for (l = borders->last; l; l = l->prev) + for (ml = e_manager_list(); ml; ml = ml->next) { - E_Border *bd; + E_Manager *man; - bd = l->data; - if ((bd->changes.visible) && (bd->visible)) + man = ml->data; + for (cl = man->containers; cl; cl = cl->next) { - ecore_evas_show(bd->bg_ecore_evas); - ecore_x_window_show(bd->win); - bd->changes.visible = 0; + E_Container *con; + E_Border_List *bl; + E_Border *bd; + + con = cl->data; + bl = e_container_border_list_last(con); + while ((bd = e_container_border_list_prev(bl))) + { + if ((bd->changes.visible) && (bd->visible)) + { + ecore_evas_show(bd->bg_ecore_evas); + ecore_x_window_show(bd->win); + bd->changes.visible = 0; + } + } } } - for (l = borders; l; l = l->next) + for (ml = e_manager_list(); ml; ml = ml->next) { - E_Border *bd; + E_Manager *man; - bd = l->data; - if ((bd->changes.visible) && (!bd->visible)) + man = ml->data; + for (cl = man->containers; cl; cl = cl->next) { - ecore_x_window_hide(bd->win); - ecore_evas_hide(bd->bg_ecore_evas); - bd->changes.visible = 0; + E_Container *con; + E_Border_List *bl; + E_Border *bd; + + con = cl->data; + bl = e_container_border_list_first(con); + while ((bd = e_container_border_list_next(bl))) + { + if ((bd->changes.visible) && (!bd->visible)) + { + ecore_x_window_hide(bd->win); + ecore_evas_hide(bd->bg_ecore_evas); + bd->changes.visible = 0; + } + if (bd->changed) _e_border_eval(bd); + } } - if (bd->changed) _e_border_eval(bd); } } Evas_List * e_border_clients_get() { + /* FIXME: This should be a somewhat ordered list */ return borders; } @@ -1420,7 +1437,7 @@ e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win); ecore_x_window_del(bd->win); - bd->zone->container->clients = evas_list_remove(bd->zone->container->clients, bd); + e_container_border_remove(bd); borders = evas_list_remove(borders, bd); free(bd); @@ -4167,44 +4184,6 @@ e_move_update(bd->x, bd->y); } -static void -_e_border_reorder_after(E_Border *bd, E_Border *after) -{ - if (after) - { - bd->zone->container->clients = evas_list_remove(bd->zone->container->clients, bd); - bd->zone->container->clients = evas_list_append_relative(bd->zone->container->clients, bd, after); - borders = evas_list_remove(borders, bd); - borders = evas_list_append_relative(borders, bd, after); - } - else - { - bd->zone->container->clients = evas_list_remove(bd->zone->container->clients, bd); - bd->zone->container->clients = evas_list_append(bd->zone->container->clients, bd); - borders = evas_list_remove(borders, bd); - borders = evas_list_append(borders, bd); - } -} - -static void -_e_border_reorder_before(E_Border *bd, E_Border *before) -{ - if (before) - { - bd->zone->container->clients = evas_list_remove(bd->zone->container->clients, bd); - bd->zone->container->clients = evas_list_prepend_relative(bd->zone->container->clients, bd, before); - borders = evas_list_remove(borders, bd); - borders = evas_list_prepend_relative(borders, bd, before); - } - else - { - bd->zone->container->clients = evas_list_remove(bd->zone->container->clients, bd); - bd->zone->container->clients = evas_list_prepend(bd->zone->container->clients, bd); - borders = evas_list_remove(borders, bd); - borders = evas_list_prepend(borders, bd); - } -} - static int _e_border_cb_focus_fix(void *data) { =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -3 -r1.49 -r1.50 --- e_container.c 13 May 2005 10:09:55 -0000 1.49 +++ e_container.c 13 May 2005 13:34:21 -0000 1.50 @@ -6,6 +6,8 @@ /* TODO List: * * * fix shape callbacks to be able to be safely deleted + * * remove duplicate bd->layer -> layers code + * */ /* local subsystem functions */ @@ -508,6 +510,51 @@ * 200 = fullscreen * 999 = internal on top windows for E */ +int +e_container_borders_count(E_Container *con) +{ + /* FIXME: This could be stored and not calculated */ + int num, i; + + num = 0; + for (i = 0; i < num; i++) + num += evas_list_count(con->layers[i].clients); + + return num; +} + +void +e_container_border_add(E_Border *bd) +{ + int pos; + + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + bd->zone->container->layers[pos].clients = + evas_list_append(bd->zone->container->layers[pos].clients, bd); +} + +void +e_container_border_remove(E_Border *bd) +{ + int pos; + + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + bd->zone->container->layers[pos].clients = + evas_list_remove(bd->zone->container->layers[pos].clients, bd); +} + void e_container_window_raise(E_Container *con, Ecore_X_Window win, int layer) { @@ -605,6 +652,78 @@ evas_list_prepend(bd->zone->container->layers[pos].clients, bd); } +void +e_container_border_stack_above(E_Border *bd, E_Border *above) +{ + int pos; + + /* Remove from old layer */ + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + bd->zone->container->layers[pos].clients = + evas_list_remove(bd->zone->container->layers[pos].clients, bd); + + /* Add to new layer */ + bd->layer = above->layer; + + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + ecore_x_window_configure(bd->win, + ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING | + ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE, + 0, 0, 0, 0, 0, + above->win, ECORE_X_WINDOW_STACK_ABOVE); + + bd->zone->container->layers[pos].clients = + evas_list_append_relative(bd->zone->container->layers[pos].clients, bd, above); +} + +void +e_container_border_stack_below(E_Border *bd, E_Border *below) +{ + int pos; + + /* Remove from old layer */ + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + bd->zone->container->layers[pos].clients = + evas_list_remove(bd->zone->container->layers[pos].clients, bd); + + /* Add to new layer */ + bd->layer = below->layer; + + if (bd->layer == 0) pos = 0; + else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1; + else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2; + else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3; + else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4; + else pos = 5; + + ecore_x_window_configure(bd->win, + ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING | + ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE, + 0, 0, 0, 0, 0, + below->win, ECORE_X_WINDOW_STACK_BELOW); + + bd->zone->container->layers[pos].clients = + evas_list_prepend_relative(bd->zone->container->layers[pos].clients, bd, below); +} + E_Border_List * e_container_border_list_first(E_Container *con) { @@ -629,6 +748,8 @@ list->container = con; e_object_ref(E_OBJECT(con)); list->layer = 6; + if (list->clients = list->container->layers[list->layer].clients) + list->clients = list->container->layers[list->layer].clients->last; while ((list->layer > 0) && (!list->clients)) { list->layer--; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- e_container.h 13 May 2005 10:09:55 -0000 1.21 +++ e_container.h 13 May 2005 13:34:21 -0000 1.22 @@ -47,7 +47,6 @@ Evas_List *shapes; Evas_List *shape_change_cb; - Evas_List *clients; Evas_List *zones; struct { @@ -124,10 +123,15 @@ EAPI void e_container_shape_solid_rect_set(E_Container_Shape *es, int x, int y, int w, int h); EAPI void e_container_shape_solid_rect_get(E_Container_Shape *es, int *x, int *y, int *w, int *h); +EAPI int e_container_borders_count(E_Container *con); +EAPI void e_container_border_add(E_Border *bd); +EAPI void e_container_border_remove(E_Border *bd); EAPI void e_container_window_raise(E_Container *con, Ecore_X_Window, int layer); EAPI void e_container_window_lower(E_Container *con, Ecore_X_Window, int layer); EAPI void e_container_border_raise(E_Border *bd); EAPI void e_container_border_lower(E_Border *bd); +EAPI void e_container_border_stack_above(E_Border *bd, E_Border *above); +EAPI void e_container_border_stack_below(E_Border *bd, E_Border *below); extern EAPI int E_EVENT_CONTAINER_RESIZE; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_hints.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- e_hints.c 13 May 2005 09:23:51 -0000 1.20 +++ e_hints.c 13 May 2005 13:34:21 -0000 1.21 @@ -32,10 +32,11 @@ void e_hints_client_list_set(void) { - Evas_List *ml = NULL, *cl = NULL, *bl = NULL; + Evas_List *ml = NULL, *cl = NULL; unsigned int i = 0, num = 0; E_Manager *m; E_Container *c; + E_Border_List *bl; E_Border *b; Ecore_X_Window *clients = NULL; @@ -46,7 +47,7 @@ for (cl = m->containers; cl; cl = cl->next) { c = cl->data; - num += evas_list_count(c->clients); + num += e_container_borders_count(c); } } @@ -63,11 +64,10 @@ for (cl = m->containers; cl; cl = cl->next) { c = cl->data; - for (bl = c->clients; bl; bl = bl->next) - { - b = bl->data; - clients[i++] = b->win; - } + bl = e_container_border_list_first(c); + while ((b = e_container_border_list_next(bl))) + clients[i++] = b->win; + e_container_border_list_free(bl); } } for (ml = e_manager_list(); ml; ml = ml->next) @@ -94,10 +94,11 @@ void e_hints_client_stacking_set(void) { - Evas_List *ml = NULL, *cl = NULL, *bl = NULL; + Evas_List *ml = NULL, *cl = NULL; unsigned int i = 0, num = 0; E_Manager *m; E_Container *c; + E_Border_List *bl; E_Border *b; Ecore_X_Window *clients = NULL; @@ -108,7 +109,7 @@ for (cl = m->containers; cl; cl = cl->next) { c = cl->data; - num += evas_list_count(c->clients); + num += e_container_borders_count(c); } } @@ -124,11 +125,10 @@ for (cl = m->containers; cl; cl = cl->next) { c = cl->data; - for (bl = c->clients; bl; bl = bl->next) - { - b = bl->data; - clients[i++] = b->win; - } + bl = e_container_border_list_first(c); + while ((b = e_container_border_list_next(bl))) + clients[i++] = b->win; + e_container_border_list_free(bl); } } for (ml = e_manager_list(); ml; ml = ml->next) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_place.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- e_place.c 13 May 2005 04:05:43 -0000 1.4 +++ e_place.c 13 May 2005 13:34:21 -0000 1.5 @@ -7,15 +7,15 @@ e_place_zone_region_smart_cleanup(E_Zone *zone) { E_Desk *desk; - Evas_List *l, *borders = NULL; + Evas_List *borders = NULL; + E_Border_List *bl; + E_Border *border; E_OBJECT_CHECK(zone); desk = e_desk_current_get(zone); - for (l = e_border_clients_get(); l; l = l->next) + bl = e_container_border_list_first(desk->zone->container); + while ((border = e_container_border_list_next(bl))) { - E_Border *border; - - border = l->data; /* Build a list of windows on this desktop and not iconified. */ if ((border->desk == desk) && !(border->iconic)) { @@ -41,6 +41,7 @@ if (!ll) borders = evas_list_append(borders, border); } } + e_container_border_list_free(bl); /* Loop over the borders moving each one using the smart placement */ while (borders) @@ -61,7 +62,9 @@ { int a_w = 0, a_h = 0; int *a_x = NULL, *a_y = NULL; - Evas_List *l, *ll; + Evas_List *ll; + E_Border_List *bl; + E_Border *bd; a_w = 2; a_h = 2; @@ -76,13 +79,12 @@ a_y[0] = 0; a_y[1] = zone->h; - for (l = zone->container->clients; l; l = l->next) + bl = e_container_border_list_first(zone->container); + while ((bd = e_container_border_list_next(bl))) { - E_Border *bd; int ok; ok = 1; - bd = l->data; for (ll = skiplist; ll; ll = ll->next) { if (ll->data == bd) @@ -189,6 +191,8 @@ } } } + e_container_border_list_free(bl); + { int i, j; int area = 0x7fffffff; @@ -202,14 +206,13 @@ { int ar = 0; - for (l = zone->container->clients; l; l = l->next) + bl = e_container_border_list_first(zone->container); + while ((bd = e_container_border_list_next(bl))) { - E_Border *bd; int x1, y1, w1, h1, x2, y2, w2, h2; int ok; ok = 1; - bd = l->data; x1 = a_x[i]; y1 = a_y[j]; w1 = w; @@ -251,6 +254,8 @@ ar += (iw * ih); } } + e_container_border_list_free(bl); + if (ar < area) { area = ar; @@ -264,14 +269,14 @@ { int ar = 0; - for (l = zone->container->clients; l; l = l->next) + bl = e_container_border_list_first(zone->container); + while ((bd = e_container_border_list_next(bl))) { E_Border *bd; int x1, y1, w1, h1, x2, y2, w2, h2; int ok; ok = 1; - bd = l->data; x1 = a_x[i + 1] - w; y1 = a_y[j]; w1 = w; @@ -313,6 +318,8 @@ ar += (iw * ih); } } + e_container_border_list_free(bl); + if (ar < area) { area = ar; @@ -326,14 +333,14 @@ { int ar = 0; - for (l = zone->container->clients; l; l = l->next) + bl = e_container_border_list_first(zone->container); + while ((bd = e_container_border_list_next(bl))) { E_Border *bd; int x1, y1, w1, h1, x2, y2, w2, h2; int ok; ok = 1; - bd = l->data; x1 = a_x[i + 1] - w; y1 = a_y[j + 1] - h; w1 = w; @@ -375,6 +382,8 @@ ar += (iw * ih); } } + e_container_border_list_free(bl); + if (ar < area) { area = ar; @@ -388,14 +397,14 @@ { int ar = 0; - for (l = zone->container->clients; l; l = l->next) + bl = e_container_border_list_first(zone->container); + while ((bd = e_container_border_list_next(bl))) { E_Border *bd; int x1, y1, w1, h1, x2, y2, w2, h2; int ok; ok = 1; - bd = l->data; x1 = a_x[i]; y1 = a_y[j + 1] - h; w1 = w; @@ -437,6 +446,8 @@ ar += (iw * ih); } } + e_container_border_list_free(bl); + if (ar < area) { area = ar; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_resist.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- e_resist.c 10 Feb 2005 12:28:39 -0000 1.7 +++ e_resist.c 13 May 2005 13:34:21 -0000 1.8 @@ -26,6 +26,8 @@ int gad_resist = 32; Evas_List *l, *ll, *rects = NULL; E_Resist_Rect *r; + E_Border_List *bl; + E_Border *bd; /* FIXME: get resist values from config */ if (!resist) @@ -63,11 +65,11 @@ /* can add code here to add more fake obstacles with custom resist values */ /* here if need be - ie xinerama middle between screens and panels etc. */ - for (l = con->clients; l; l = l->next) + bl = e_container_border_list_first(con); + while ((bd = e_container_border_list_next(bl))) { E_Border *bd; - bd = l->data; if (bd->visible) { int ok; @@ -87,6 +89,8 @@ } } } + e_container_border_list_free(bl); + for (l = con->gadman->clients; l; l = l->next) { E_Gadman_Client *gmc; ------------------------------------------------------- This SF.Net email is sponsored by Oracle Space Sweepstakes Want to be the first software developer in space? Enter now for the Oracle Space Sweepstakes! http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs