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
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
bd->layer = 150;
e_hints_window_stacking_set(bd, E_STACKING_ABOVE);
}
- e_container_border_raise(bd);
+ e_border_raise(bd);
}
static void
bd->layer = 50;
e_hints_window_stacking_set(bd, E_STACKING_BELOW);
}
- e_container_border_raise(bd);
+ e_border_raise(bd);
}
static void
bd->layer = 100;
e_hints_window_stacking_set(bd, E_STACKING_NONE);
}
- e_container_border_raise(bd);
+ e_border_raise(bd);
}
static void
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 */
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 */
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
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);