forked from enlightenment/enlightenment
fix client positioning when initial position is offscreen or size is huge
ref T1571
This commit is contained in:
parent
30bd5e4a0d
commit
0028c7aea3
|
@ -1852,9 +1852,49 @@ _e_client_eval(E_Client *ec)
|
||||||
/* if the explicit geometry request asks for the app to be
|
/* if the explicit geometry request asks for the app to be
|
||||||
* in another zone - well move it there */
|
* in another zone - well move it there */
|
||||||
{
|
{
|
||||||
E_Zone *zone;
|
E_Zone *zone = NULL;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = MAX(ec->x, 0);
|
||||||
|
y = MAX(ec->y, 0);
|
||||||
|
if ((!ec->re_manage) && ((ec->x != x) || (ec->y != y)))
|
||||||
|
zone = e_comp_zone_xy_get(ec->comp, x, y);
|
||||||
|
|
||||||
|
if (!zone)
|
||||||
|
{
|
||||||
zone = e_comp_zone_xy_get(ec->comp, ec->x + (ec->w / 2), ec->y + (ec->h / 2));
|
zone = e_comp_zone_xy_get(ec->comp, ec->x + (ec->w / 2), ec->y + (ec->h / 2));
|
||||||
|
if (zone)
|
||||||
|
{
|
||||||
|
E_Zone *z2 = e_comp_zone_xy_get(ec->comp, ec->x, ec->y);
|
||||||
|
|
||||||
|
if (z2 && (z2 != zone))
|
||||||
|
{
|
||||||
|
size_t psz = 0;
|
||||||
|
E_Zone *zf = z2;
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(ec->comp->zones, l, z2)
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
x = ec->x, y = ec->y, w = ec->w, h = ec->h;
|
||||||
|
E_RECTS_CLIP_TO_RECT(x, y, w, h, z2->x, z2->y, z2->w, z2->h);
|
||||||
|
if (w * h == z2->w * z2->h)
|
||||||
|
{
|
||||||
|
/* client fully covering zone */
|
||||||
|
zf = z2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((unsigned)(w * h) > psz)
|
||||||
|
{
|
||||||
|
psz = w * h;
|
||||||
|
zf = z2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
zone = zf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!zone)
|
if (!zone)
|
||||||
zone = e_comp_zone_xy_get(ec->comp, ec->x, ec->y);
|
zone = e_comp_zone_xy_get(ec->comp, ec->x, ec->y);
|
||||||
if (!zone)
|
if (!zone)
|
||||||
|
|
Loading…
Reference in New Issue