Fix pager stacking issue. Maybe we should have a general stack event
authorsebastid <sebastid>
Mon, 29 Aug 2005 23:43:58 +0000 (23:43 +0000)
committersebastid <sebastid@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 29 Aug 2005 23:43:58 +0000 (23:43 +0000)
instead of lower/raise?

SVN revision: 16408

TODO
src/bin/e_border.c
src/bin/e_container.c
src/bin/e_container.h

diff --git a/TODO b/TODO
index f955db4..a0bd312 100644 (file)
--- 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
index 68efddb..d21e309 100644 (file)
@@ -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
index f7ef8d4..848940f 100644 (file)
@@ -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
index 992860d..4962faf 100644 (file)
@@ -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);