forked from enlightenment/enlightenment
use zone obstacles for window placement during shelf coverage calcs
This commit is contained in:
parent
f033d5616a
commit
5ec690512d
|
@ -89,36 +89,44 @@ _e_place_coverage_client_add(E_Desk *desk, Eina_List *skiplist, int ar, int x, i
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_e_place_coverage_shelf_add(E_Desk *desk, int ar, int x, int y, int w, int h)
|
_e_place_coverage_zone_obstacles_add_single(E_Zone_Obstacle *obs, int ar, int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
|
||||||
E_Shelf *es;
|
|
||||||
int x2, y2, w2, h2;
|
int x2, y2, w2, h2;
|
||||||
|
int x0, x00, yy0, y00;
|
||||||
|
int iw, ih;
|
||||||
|
|
||||||
l = e_shelf_list_all();
|
x2 = obs->x; y2 = obs->y; w2 = obs->w; h2 = obs->h;
|
||||||
EINA_LIST_FREE(l, es)
|
if (!E_INTERSECTS(x, y, w, h, x2, y2, w2, h2)) return ar;
|
||||||
{
|
|
||||||
if (!e_shelf_desk_visible(es, desk)) continue;
|
|
||||||
x2 = es->x; y2 = es->y; w2 = es->w; h2 = es->h;
|
|
||||||
if (E_INTERSECTS(x, y, w, h, x2, y2, w2, h2))
|
|
||||||
{
|
|
||||||
int x0, x00, yy0, y00;
|
|
||||||
int iw, ih;
|
|
||||||
|
|
||||||
if (!es->cfg->overlap) return 0x7fffffff;
|
/* FIXME: this option implies that windows should be resized when
|
||||||
x0 = x;
|
* an autohide shelf toggles its visibility, but it is not used correctly
|
||||||
if (x < x2) x0 = x2;
|
* and is instead used to determine whether shelves can be overlapped
|
||||||
x00 = (x + w);
|
*/
|
||||||
if ((x2 + w2) < (x + w)) x00 = (x2 + w2);
|
if (!e_config->border_fix_on_shelf_toggle) return 0x7fffffff;
|
||||||
yy0 = y;
|
|
||||||
if (y < y2) yy0 = y2;
|
x0 = x;
|
||||||
y00 = (y + h);
|
if (x < x2) x0 = x2;
|
||||||
if ((y2 + h2) < (y + h)) y00 = (y2 + h2);
|
x00 = (x + w);
|
||||||
iw = x00 - x0;
|
if ((x2 + w2) < (x + w)) x00 = (x2 + w2);
|
||||||
ih = y00 - yy0;
|
yy0 = y;
|
||||||
ar += (iw * ih);
|
if (y < y2) yy0 = y2;
|
||||||
}
|
y00 = (y + h);
|
||||||
}
|
if ((y2 + h2) < (y + h)) y00 = (y2 + h2);
|
||||||
|
iw = x00 - x0;
|
||||||
|
ih = y00 - yy0;
|
||||||
|
ar += (iw * ih);
|
||||||
|
return ar;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_e_place_coverage_zone_obstacles_add(E_Desk *desk, int ar, int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
E_Zone_Obstacle *obs;
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH(desk->obstacles, obs)
|
||||||
|
ar = _e_place_coverage_zone_obstacles_add_single(obs, ar, x, y, w, h);
|
||||||
|
EINA_INLIST_FOREACH(desk->zone->obstacles, obs)
|
||||||
|
ar = _e_place_coverage_zone_obstacles_add_single(obs, ar, x, y, w, h);
|
||||||
return ar;
|
return ar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +350,7 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
|
||||||
x, y,
|
x, y,
|
||||||
w, h);
|
w, h);
|
||||||
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
||||||
ar = _e_place_coverage_shelf_add(desk, ar,
|
ar = _e_place_coverage_zone_obstacles_add(desk, ar,
|
||||||
x, y,
|
x, y,
|
||||||
w, h);
|
w, h);
|
||||||
if (ar < area)
|
if (ar < area)
|
||||||
|
@ -367,7 +375,7 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
|
||||||
a_x[i], a_y[j],
|
a_x[i], a_y[j],
|
||||||
w, h);
|
w, h);
|
||||||
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
||||||
ar = _e_place_coverage_shelf_add(desk, ar,
|
ar = _e_place_coverage_zone_obstacles_add(desk, ar,
|
||||||
a_x[i], a_y[j],
|
a_x[i], a_y[j],
|
||||||
w, h);
|
w, h);
|
||||||
if (ar < area)
|
if (ar < area)
|
||||||
|
@ -386,7 +394,7 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
|
||||||
a_x[i + 1] - w, a_y[j],
|
a_x[i + 1] - w, a_y[j],
|
||||||
w, h);
|
w, h);
|
||||||
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
||||||
ar = _e_place_coverage_shelf_add(desk, ar,
|
ar = _e_place_coverage_zone_obstacles_add(desk, ar,
|
||||||
a_x[i + 1] - w, a_y[j],
|
a_x[i + 1] - w, a_y[j],
|
||||||
w, h);
|
w, h);
|
||||||
if (ar < area)
|
if (ar < area)
|
||||||
|
@ -405,7 +413,7 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
|
||||||
a_x[i + 1] - w, a_y[j + 1] - h,
|
a_x[i + 1] - w, a_y[j + 1] - h,
|
||||||
w, h);
|
w, h);
|
||||||
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
||||||
ar = _e_place_coverage_shelf_add(desk, ar,
|
ar = _e_place_coverage_zone_obstacles_add(desk, ar,
|
||||||
a_x[i + 1] - w, a_y[j + 1] - h,
|
a_x[i + 1] - w, a_y[j + 1] - h,
|
||||||
w, h);
|
w, h);
|
||||||
if (ar < area)
|
if (ar < area)
|
||||||
|
@ -424,7 +432,7 @@ e_place_desk_region_smart(E_Desk *desk, Eina_List *skiplist, int x, int y, int w
|
||||||
a_x[i], a_y[j + 1] - h,
|
a_x[i], a_y[j + 1] - h,
|
||||||
w, h);
|
w, h);
|
||||||
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
if (e_config->window_placement_policy == E_WINDOW_PLACEMENT_SMART)
|
||||||
ar = _e_place_coverage_shelf_add(desk, ar,
|
ar = _e_place_coverage_zone_obstacles_add(desk, ar,
|
||||||
a_x[i], a_y[j + 1] - h,
|
a_x[i], a_y[j + 1] - h,
|
||||||
w, h);
|
w, h);
|
||||||
if (ar < area)
|
if (ar < area)
|
||||||
|
|
Loading…
Reference in New Issue