Enlightenment CVS committal Author : sebastid Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_border.c e_border.h Log Message: Merge Raise/Lower event to Stack event. Fix raise/lower order. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v retrieving revision 1.395 retrieving revision 1.396 diff -u -3 -r1.395 -r1.396 --- e_border.c 7 Sep 2005 04:45:35 -0000 1.395 +++ e_border.c 7 Sep 2005 14:55:46 -0000 1.396 @@ -98,8 +98,7 @@ static void _e_border_event_border_remove_free(void *data, void *ev); static void _e_border_event_border_zone_set_free(void *data, void *ev); static void _e_border_event_border_desk_set_free(void *data, void *ev); -static void _e_border_event_border_raise_free(void *data, void *ev); -static void _e_border_event_border_lower_free(void *data, void *ev); +static void _e_border_event_border_stack_free(void *data, void *ev); static void _e_border_event_border_icon_change_free(void *data, void *ev); static void _e_border_event_border_resize_free(void *data, void *ev); static void _e_border_event_border_move_free(void *data, void *ev); @@ -150,8 +149,7 @@ int E_EVENT_BORDER_UNICONIFY = 0; int E_EVENT_BORDER_STICK = 0; int E_EVENT_BORDER_UNSTICK = 0; -int E_EVENT_BORDER_RAISE = 0; -int E_EVENT_BORDER_LOWER = 0; +int E_EVENT_BORDER_STACK = 0; int E_EVENT_BORDER_ICON_CHANGE = 0; #define GRAV_SET(bd, grav) \ @@ -199,8 +197,7 @@ E_EVENT_BORDER_UNICONIFY = ecore_event_type_new(); E_EVENT_BORDER_STICK = ecore_event_type_new(); E_EVENT_BORDER_UNSTICK = ecore_event_type_new(); - E_EVENT_BORDER_RAISE = ecore_event_type_new(); - E_EVENT_BORDER_LOWER = ecore_event_type_new(); + E_EVENT_BORDER_STACK = ecore_event_type_new(); E_EVENT_BORDER_ICON_CHANGE = ecore_event_type_new(); return 1; @@ -831,133 +828,282 @@ void e_border_raise(E_Border *bd) { - E_Border *above; + E_Event_Border_Stack *ev; + E_Border *last = NULL; + Evas_List *l; E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - - above = e_container_border_raise(bd); - if (above) - { - E_Event_Border_Raise *ev; - ev = calloc(1, sizeof(E_Event_Border_Raise)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); - ev->above = above; - e_object_ref(E_OBJECT(above)); - ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL); - } - else - { - /* If the border hasn't been raised above anything, it is actually lowered */ - E_Event_Border_Lower *ev; - ev = calloc(1, sizeof(E_Event_Border_Lower)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); - ev->below = NULL; - ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); - } if (e_config->transient.raise) { - Evas_List *l; - for (l = bd->transients; l; l = l->next) + for (l = evas_list_last(bd->transients); l; l = l->prev) { E_Border *child; child = l->data; - /* Don't raise iconic transients. If the user wants these shown, + /* Don't stack iconic transients. If the user wants these shown, * thats another option. */ if (!child->iconic) - e_border_stack_above(child, bd); + { + printf("raise: %p %p\n", child, last); + if (last) + e_border_stack_below(child, last); + else + { + E_Border *above; + + /* First raise the border to find out which border we will end up above */ + above = e_container_border_raise(child); + + if (above) + { + /* We ended up above a border, now we must stack this border to + * generate the stacking event, and to check if this transient + * has other transients etc. + */ + e_border_stack_above(child, above); + } + else + { + /* If we didn't end up above any border, we are on the bottom! */ + e_border_lower(child); + } + } + last = child; + } + } + } + + ev = calloc(1, sizeof(E_Event_Border_Stack)); + ev->border = bd; + e_object_ref(E_OBJECT(bd)); + + if (last) + { + printf("below: %p %p\n", bd, last); + e_container_border_stack_below(bd, last); + ev->stack = last; + e_object_ref(E_OBJECT(last)); + ev->type = E_STACKING_BELOW; + } + else + { + printf("above: %p %p\n", bd, last); + E_Border *above; + + /* If we don't have any children, raise this border */ + above = e_container_border_raise(bd); + if (above) + { + /* We ended up above a border */ + ev->stack = above; + e_object_ref(E_OBJECT(above)); + ev->type = E_STACKING_ABOVE; + } + else + { + /* No border to raise above, same as a lower! */ + ev->stack = NULL; + ev->type = E_STACKING_BELOW; } } + + ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); } void e_border_lower(E_Border *bd) { - E_Border *below; + E_Event_Border_Stack *ev; + E_Border *last = NULL; + Evas_List *l; E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - below = e_container_border_lower(bd); - if (below) - { - E_Event_Border_Lower *ev; - ev = calloc(1, sizeof(E_Event_Border_Lower)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); - ev->below = below; - e_object_ref(E_OBJECT(below)); - ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); - } - else - { - /* If the border hasn't been lowered below anything, it is actually raised */ - E_Event_Border_Raise *ev; - ev = calloc(1, sizeof(E_Event_Border_Raise)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); - ev->above = NULL; - ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL); - } if (e_config->transient.lower) { - Evas_List *l; - for (l = bd->transients; l; l = l->next) + for (l = evas_list_last(bd->transients); l; l = l->prev) { E_Border *child; child = l->data; - e_border_stack_above(child, bd); + /* Don't stack iconic transients. If the user wants these shown, + * thats another option. + */ + if (!child->iconic) + { + if (last) + e_border_stack_below(child, last); + else + { + E_Border *below; + + /* First lower the border to find out which border we will end up below */ + below = e_container_border_lower(child); + + if (below) + { + /* We ended up below a border, now we must stack this border to + * generate the stacking event, and to check if this transient + * has other transients etc. + */ + e_border_stack_below(child, below); + } + else + { + /* If we didn't end up below any border, we are on top! */ + e_border_raise(child); + } + } + last = child; + } + } + } + + ev = calloc(1, sizeof(E_Event_Border_Stack)); + ev->border = bd; + e_object_ref(E_OBJECT(bd)); + + if (last) + { + e_container_border_stack_below(bd, last); + ev->stack = last; + e_object_ref(E_OBJECT(last)); + ev->type = E_STACKING_BELOW; + } + else + { + E_Border *below; + + /* If we don't have any children, lower this border */ + below = e_container_border_lower(bd); + if (below) + { + /* We ended up below a border */ + ev->stack = below; + e_object_ref(E_OBJECT(below)); + ev->type = E_STACKING_BELOW; + } + else + { + /* No border to hide under, same as a raise! */ + ev->stack = NULL; + ev->type = E_STACKING_ABOVE; } } + + ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); } void e_border_stack_above(E_Border *bd, E_Border *above) { + /* TODO: Should stack above allow the border to change level */ + E_Event_Border_Stack *ev; + E_Border *last = NULL; + Evas_List *l; + E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - e_container_border_stack_above(bd, above); + if (e_config->transient.raise) + { + for (l = evas_list_last(bd->transients); l; l = l->prev) + { + E_Border *child; + child = l->data; + /* Don't stack iconic transients. If the user wants these shown, + * thats another option. + */ + if (!child->iconic) + { + if (last) + e_border_stack_below(child, last); + else + e_border_stack_above(child, above); + last = child; + } + } + } + + ev = calloc(1, sizeof(E_Event_Border_Stack)); + ev->border = bd; + e_object_ref(E_OBJECT(bd)); + + if (last) { - E_Event_Border_Raise *ev; - - ev = calloc(1, sizeof(E_Event_Border_Raise)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); -// e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event"); - ev->above = above; + e_container_border_stack_below(bd, last); + ev->stack = last; + e_object_ref(E_OBJECT(last)); + ev->type = E_STACKING_BELOW; + } + else + { + e_container_border_stack_above(bd, above); + ev->stack = above; e_object_ref(E_OBJECT(above)); -// e_object_breadcrumb_add(E_OBJECT(above), "border_raise_event.above"); - ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL); + ev->type = E_STACKING_ABOVE; } + + ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); } void e_border_stack_below(E_Border *bd, E_Border *below) { + /* TODO: Should stack below allow the border to change level */ + E_Event_Border_Stack *ev; + E_Border *last = NULL; + Evas_List *l; + E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - e_container_border_stack_below(bd, below); + if (e_config->transient.lower) { - E_Event_Border_Lower *ev; - - ev = calloc(1, sizeof(E_Event_Border_Lower)); - ev->border = bd; - e_object_ref(E_OBJECT(bd)); -// e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event"); - ev->below = below; + for (l = evas_list_last(bd->transients); l; l = l->prev) + { + E_Border *child; + + child = l->data; + /* Don't stack iconic transients. If the user wants these shown, + * thats another option. + */ + if (!child->iconic) + { + if (last) + e_border_stack_below(child, last); + else + e_border_stack_below(child, below); + last = child; + } + } + } + + ev = calloc(1, sizeof(E_Event_Border_Stack)); + ev->border = bd; + e_object_ref(E_OBJECT(bd)); + + if (last) + { + e_container_border_stack_below(bd, last); + ev->stack = last; + e_object_ref(E_OBJECT(last)); + ev->type = E_STACKING_BELOW; + } + else + { + e_container_border_stack_below(bd, below); + ev->stack = below; e_object_ref(E_OBJECT(below)); -// e_object_breadcrumb_add(E_OBJECT(below), "border_lower_event.below"); - ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); + ev->type = E_STACKING_BELOW; } + + ecore_event_add(E_EVENT_BORDER_STACK, ev, _e_border_event_border_stack_free, NULL); } void @@ -6787,33 +6933,17 @@ } static void -_e_border_event_border_raise_free(void *data, void *ev) +_e_border_event_border_stack_free(void *data, void *ev) { - E_Event_Border_Raise *e; + E_Event_Border_Stack *e; e = ev; // e_object_breadcrumb_del(E_OBJECT(e->border), "border_raise_event"); e_object_unref(E_OBJECT(e->border)); - if (e->above) + if (e->stack) { // e_object_breadcrumb_del(E_OBJECT(e->above), "border_raise_event.above"); - e_object_unref(E_OBJECT(e->above)); - } - free(e); -} - -static void -_e_border_event_border_lower_free(void *data, void *ev) -{ - E_Event_Border_Lower *e; - - e = ev; -// e_object_breadcrumb_del(E_OBJECT(e->border), "border_lower_event"); - e_object_unref(E_OBJECT(e->border)); - if (e->below) - { -// e_object_breadcrumb_del(E_OBJECT(e->below), "border_lower_event.below"); - e_object_unref(E_OBJECT(e->below)); + e_object_unref(E_OBJECT(e->stack)); } free(e); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.h,v retrieving revision 1.109 retrieving revision 1.110 diff -u -3 -r1.109 -r1.110 --- e_border.h 2 Sep 2005 09:56:01 -0000 1.109 +++ e_border.h 7 Sep 2005 14:55:46 -0000 1.110 @@ -74,8 +74,7 @@ typedef struct _E_Event_Border_Unstick E_Event_Border_Unstick; typedef struct _E_Event_Border_Zone_Set E_Event_Border_Zone_Set; typedef struct _E_Event_Border_Desk_Set E_Event_Border_Desk_Set; -typedef struct _E_Event_Border_Raise E_Event_Border_Raise; -typedef struct _E_Event_Border_Lower E_Event_Border_Lower; +typedef struct _E_Event_Border_Stack E_Event_Border_Stack; typedef struct _E_Event_Border_Icon_Change E_Event_Border_Icon_Change; #else @@ -463,14 +462,10 @@ E_Desk *desk; }; -struct _E_Event_Border_Raise +struct _E_Event_Border_Stack { - E_Border *border, *above; -}; - -struct _E_Event_Border_Lower -{ - E_Border *border, *below; + E_Border *border, *stack; + E_Stacking type; }; struct _E_Event_Border_Icon_Change @@ -557,8 +552,7 @@ extern EAPI int E_EVENT_BORDER_UNSTICK; extern EAPI int E_EVENT_BORDER_ZONE_SET; extern EAPI int E_EVENT_BORDER_DESK_SET; -extern EAPI int E_EVENT_BORDER_RAISE; -extern EAPI int E_EVENT_BORDER_LOWER; +extern EAPI int E_EVENT_BORDER_STACK; extern EAPI int E_EVENT_BORDER_ICON_CHANGE; #endif ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs