From c51ae6b1c5d7bc2212b7653bcbf4d2681805abea Mon Sep 17 00:00:00 2001 From: sebastid Date: Mon, 29 Aug 2005 23:43:58 +0000 Subject: [PATCH] Fix pager stacking issue. Maybe we should have a general stack event instead of lower/raise? SVN revision: 16408 --- TODO | 3 --- src/bin/e_border.c | 48 +++++++++++++++++++++++++++++++------------ src/bin/e_container.c | 45 ++++++++++++++++++++++++++++++++++++++-- src/bin/e_container.h | 4 ++-- 4 files changed, 80 insertions(+), 20 deletions(-) diff --git a/TODO b/TODO index f955db44d..a0bd31285 100644 --- a/TODO +++ b/TODO @@ -20,9 +20,6 @@ Some of the things (in very short form) that need to be done to E17... map/unmap event and something else... they still are around in x- just e hides them and never shows them again fullscreen. is this correct? -* BUG: Check stacking in pager, doesn't care about below, above. - e_container_border_raise/lower should return what window they are above/ - below. * BUG: if you have 2 zones and you fill up zone 2 (right) mostly and then run a big xev (xev -g 1280x1024) that wont fit it gets placed offscreen to the right of zone 2 diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 68efddbf7..d21e309db 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -771,41 +771,63 @@ e_border_move_resize(E_Border *bd, int x, int y, int w, int h) void e_border_raise(E_Border *bd) { + E_Border *above; + E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - e_container_border_raise(bd); - + 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)); -// e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event"); - ev->above = NULL; + 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); + } } void e_border_lower(E_Border *bd) { + E_Border *below; + E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); - e_container_border_lower(bd); - + 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)); -// e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event"); - ev->below = NULL; + 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); + } } void @@ -6292,7 +6314,7 @@ _e_border_menu_cb_on_top(void *data, E_Menu *m, E_Menu_Item *mi) bd->layer = 150; e_hints_window_stacking_set(bd, E_STACKING_ABOVE); } - e_container_border_raise(bd); + e_border_raise(bd); } static void @@ -6306,7 +6328,7 @@ _e_border_menu_cb_below(void *data, E_Menu *m, E_Menu_Item *mi) bd->layer = 50; e_hints_window_stacking_set(bd, E_STACKING_BELOW); } - e_container_border_raise(bd); + e_border_raise(bd); } static void @@ -6320,7 +6342,7 @@ _e_border_menu_cb_normal(void *data, E_Menu *m, E_Menu_Item *mi) bd->layer = 100; e_hints_window_stacking_set(bd, E_STACKING_NONE); } - e_container_border_raise(bd); + e_border_raise(bd); } static void diff --git a/src/bin/e_container.c b/src/bin/e_container.c index f7ef8d4f2..848940fb9 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -645,9 +645,11 @@ e_container_window_lower(E_Container *con, Ecore_X_Window win, int layer) con->layers[pos].win, ECORE_X_WINDOW_STACK_ABOVE); } -void +E_Border * e_container_border_raise(E_Border *bd) { + E_Border *above = NULL; + Evas_List *l; int pos, i; /* Remove from old layer */ @@ -674,12 +676,33 @@ e_container_border_raise(E_Border *bd) bd->zone->container->layers[pos - 1].clients = evas_list_append(bd->zone->container->layers[pos - 1].clients, bd); + /* Find the window below this one */ + l = evas_list_find_list(bd->zone->container->layers[pos - 1].clients, bd); + if (l->prev) + above = l->prev->data; + else + { + /* Need to check the layers below */ + for (i = pos - 2; i >= 0; i--) + { + if ((bd->zone->container->layers[i].clients) && + (l = evas_list_last(bd->zone->container->layers[i].clients))) + { + above = l->data; + break; + } + } + } + e_hints_client_stacking_set(); + return above; } -void +E_Border * e_container_border_lower(E_Border *bd) { + E_Border *below = NULL; + Evas_List *l; int pos, i; /* Remove from old layer */ @@ -706,7 +729,25 @@ e_container_border_lower(E_Border *bd) bd->zone->container->layers[pos].clients = evas_list_prepend(bd->zone->container->layers[pos].clients, bd); + /* Find the window above this one */ + l = evas_list_find_list(bd->zone->container->layers[pos].clients, bd); + if (l->next) + below = l->next->data; + else + { + /* Need to check the layers above */ + for (i = pos + 1; i < 7; i++) + { + if (bd->zone->container->layers[i].clients) + { + below = bd->zone->container->layers[i].clients->data; + break; + } + } + } + e_hints_client_stacking_set(); + return below; } void diff --git a/src/bin/e_container.h b/src/bin/e_container.h index 992860dd0..4962fafd1 100644 --- a/src/bin/e_container.h +++ b/src/bin/e_container.h @@ -134,8 +134,8 @@ 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 E_Border *e_container_border_raise(E_Border *bd); +EAPI E_Border *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);