diff --git a/src/bin/e_shelf.c b/src/bin/e_shelf.c index 41a021f05..90bc0f4c4 100644 --- a/src/bin/e_shelf.c +++ b/src/bin/e_shelf.c @@ -84,6 +84,39 @@ E_API int E_EVENT_SHELF_ADD = -1; E_API int E_EVENT_SHELF_DEL = -1; static Eina_List *handlers; +static inline Eina_Bool +_e_shelf_is_horizontal(const E_Shelf *es) +{ + Eina_Bool horiz = EINA_FALSE; + switch (es->gadcon->orient) + { + case E_GADCON_ORIENT_FLOAT: + case E_GADCON_ORIENT_HORIZ: + case E_GADCON_ORIENT_TOP: + case E_GADCON_ORIENT_BOTTOM: + case E_GADCON_ORIENT_CORNER_TL: + case E_GADCON_ORIENT_CORNER_TR: + case E_GADCON_ORIENT_CORNER_BL: + case E_GADCON_ORIENT_CORNER_BR: + horiz = 1; + break; + + case E_GADCON_ORIENT_VERT: + case E_GADCON_ORIENT_LEFT: + case E_GADCON_ORIENT_RIGHT: + case E_GADCON_ORIENT_CORNER_LT: + case E_GADCON_ORIENT_CORNER_RT: + case E_GADCON_ORIENT_CORNER_LB: + case E_GADCON_ORIENT_CORNER_RB: + horiz = 0; + break; + + default: + break; + } + return horiz; +} + static void _e_shelf_remaximize(E_Shelf *es) { @@ -109,7 +142,7 @@ _e_shelf_obstacles_update(E_Shelf *es) E_Zone_Obstacle *obs; EINA_LIST_FOREACH(es->zone_obstacles, l, obs) - e_zone_obstacle_modify(obs, &(Eina_Rectangle){es->x, es->y, es->w, es->h}); + e_zone_obstacle_modify(obs, &(Eina_Rectangle){es->x, es->y, es->w, es->h}, !_e_shelf_is_horizontal(es)); } static Eina_Bool @@ -996,12 +1029,14 @@ e_shelf_obstacles_update(E_Shelf *es) desk = e_desk_at_xy_get(es->zone, sd->x, sd->y); if (!desk) continue; es->zone_obstacles = eina_list_append(es->zone_obstacles, - e_zone_obstacle_add(es->zone, desk, &(Eina_Rectangle){es->x, es->y, es->w, es->h})); + e_zone_obstacle_add(es->zone, desk, &(Eina_Rectangle){es->x, es->y, es->w, es->h}, + !_e_shelf_is_horizontal(es))); } } else es->zone_obstacles = eina_list_append(es->zone_obstacles, - e_zone_obstacle_add(es->zone, NULL, &(Eina_Rectangle){es->x, es->y, es->w, es->h})); + e_zone_obstacle_add(es->zone, NULL, &(Eina_Rectangle){es->x, es->y, es->w, es->h}, + !_e_shelf_is_horizontal(es))); } E_API E_Shelf * diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 6c4682278..ad161408a 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -1239,10 +1239,10 @@ _e_zone_useful_geometry_calc(const E_Zone *zone, int dx, int dy, int *x, int *y, EINA_INLIST_FOREACH(zone->obstacles, obs) { if (!E_INTERSECTS(obs->x, obs->y, obs->w, obs->h, zx, zy, zw, zh)) continue; - if (obs->w >= obs->h) - eina_tiler_rect_del(tiler, &(Eina_Rectangle){0, obs->y - zy, zw, obs->h}); - else + if (obs->vertical) eina_tiler_rect_del(tiler, &(Eina_Rectangle){obs->x - zx, 0, obs->w, zh}); + else + eina_tiler_rect_del(tiler, &(Eina_Rectangle){0, obs->y - zy, zw, obs->h}); } desk = e_desk_at_xy_get(zone, dx, dy); if (desk) @@ -1250,10 +1250,10 @@ _e_zone_useful_geometry_calc(const E_Zone *zone, int dx, int dy, int *x, int *y, EINA_INLIST_FOREACH(desk->obstacles, obs) { if (!E_INTERSECTS(obs->x, obs->y, obs->w, obs->h, zx, zy, zw, zh)) continue; - if (obs->w >= obs->h) - eina_tiler_rect_del(tiler, &(Eina_Rectangle){0, obs->y - zy, zw, obs->h}); - else + if (obs->vertical) eina_tiler_rect_del(tiler, &(Eina_Rectangle){obs->x - zx, 0, obs->w, zh}); + else + eina_tiler_rect_del(tiler, &(Eina_Rectangle){0, obs->y - zy, zw, obs->h}); } } it = eina_tiler_iterator_new(tiler); @@ -1340,7 +1340,7 @@ e_zone_useful_geometry_dirty(E_Zone *zone) } E_API E_Zone_Obstacle * -e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom) +e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom, Eina_Bool vertical) { E_Zone_Obstacle *obs; @@ -1360,6 +1360,7 @@ e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom) obs->x = geom->x, obs->y = geom->y; obs->w = geom->w, obs->h = geom->h; obs->owner = E_OBJECT(desk) ?: E_OBJECT(zone); + obs->vertical = !!vertical; if (desk) { desk->obstacles = eina_inlist_append(desk->obstacles, EINA_INLIST_GET(obs)); @@ -1375,7 +1376,7 @@ e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom) } E_API void -e_zone_obstacle_modify(E_Zone_Obstacle *obs, Eina_Rectangle *geom) +e_zone_obstacle_modify(E_Zone_Obstacle *obs, Eina_Rectangle *geom, Eina_Bool vertical) { E_Zone *zone; E_Desk *desk; @@ -1387,6 +1388,7 @@ e_zone_obstacle_modify(E_Zone_Obstacle *obs, Eina_Rectangle *geom) return; obs->x = geom->x, obs->y = geom->y; obs->w = geom->w, obs->h = geom->h; + obs->vertical = !!vertical; if (obs->owner->type == E_DESK_TYPE) { diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index bb7762eda..e069a6759 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -129,6 +129,7 @@ struct _E_Zone_Obstacle EINA_INLIST; int x, y, w, h; E_Object *owner; + Eina_Bool vertical : 1; }; EINTERN int e_zone_init(void); @@ -164,8 +165,8 @@ E_API void e_zone_unstow(E_Zone *zone); E_API void e_zone_fade_handle(E_Zone *zone, int out, double tim); -E_API E_Zone_Obstacle *e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom); -E_API void e_zone_obstacle_modify(E_Zone_Obstacle *obs, Eina_Rectangle *geom); +E_API E_Zone_Obstacle *e_zone_obstacle_add(E_Zone *zone, E_Desk *desk, Eina_Rectangle *geom, Eina_Bool vertical); +E_API void e_zone_obstacle_modify(E_Zone_Obstacle *obs, Eina_Rectangle *geom, Eina_Bool vertical); extern E_API int E_EVENT_ZONE_DESK_COUNT_SET; extern E_API int E_EVENT_ZONE_MOVE_RESIZE;