3 typedef struct _E_Maximize_Rect E_Maximize_Rect;
5 struct _E_Maximize_Rect
10 #define OBSTACLE(_x1, _y1, _x2, _y2) \
12 r = E_NEW(E_Maximize_Rect, 1); \
13 r->x1 = (_x1); r->yy1 = (_y1); r->x2 = (_x2); r->y2 = (_y2); \
14 rects = eina_list_append(rects, r); \
17 static void _e_maximize_border_rects_fill(E_Border *bd, Eina_List *list, int *x1, int *yy1, int *x2, int *y2, E_Maximize dir);
18 static void _e_maximize_border_rects_fill_both(E_Border *bd, Eina_List *rects, int *x1, int *yy1, int *x2, int *y2);
19 static void _e_maximize_border_rects_fill_horiz(E_Border *bd, Eina_List *rects, int *x1, int *x2, int *bx, int *by, int *bw, int *bh);
20 static void _e_maximize_border_rects_fill_vert(E_Border *bd, Eina_List *rects, int *yy1, int *y2, int *bx, int *by, int *bw, int *bh);
23 e_maximize_border_shelf_fit(E_Border *bd, int *x1, int *yy1, int *x2, int *y2, E_Maximize dir)
25 e_maximize_border_shelf_fill(bd, x1, yy1, x2, y2, dir);
29 e_maximize_border_dock_fit(E_Border *bd, int *x1, int *yy1, int *x2, int *y2)
33 int cx1, cx2, cy1, cy2;
41 cx2 = bd->zone->x + bd->zone->w;
44 cy2 = bd->zone->y + bd->zone->h;
47 bl = e_container_border_list_first(bd->zone->container);
48 while ((bd2 = e_container_border_list_next(bl)))
58 if ((bd2->zone != bd->zone) || (bd2 == bd) ||
59 (bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK))
62 if (((bd2->x == bd2->zone->x) || ((bd2->x + bd2->w) == (bd2->zone->x + bd2->zone->w))) &&
63 ((bd2->y == bd2->zone->y) || ((bd2->x + bd2->h) == (bd2->zone->x + bd2->zone->h))))
68 if (bd2->y == bd2->zone->y)
70 else if ((bd2->y + bd2->h) == (bd2->zone->y + bd2->zone->h))
75 if ((bd2->x + bd2->w) == (bd2->zone->x + bd2->zone->w))
77 else if (bd2->x == bd2->zone->x)
83 if (bd2->y == bd2->zone->y)
85 else if ((bd2->y + bd2->h) == (bd2->zone->y + bd2->zone->h))
87 else if (bd2->x == bd2->zone->x)
89 else if ((bd2->x + bd2->w) == (bd2->zone->x + bd2->zone->w))
96 if ((bd2->y + bd2->h) > cy1)
97 cy1 = (bd2->y + bd2->h);
108 if ((bd2->x + bd2->w) > cx1)
109 cx1 = (bd2->x + bd2->w);
112 printf("Crazy people. Dock isn't at the edge.\n");
116 e_container_border_list_free(bl);
125 e_maximize_border_shelf_fill(E_Border *bd, int *x1, int *yy1, int *x2, int *y2, E_Maximize dir)
127 Eina_List *l, *rects = NULL;
131 EINA_LIST_FOREACH(e_shelf_list(), l, es)
134 E_Config_Shelf_Desk *sd;
136 if (es->cfg->overlap) continue;
137 if (es->zone != bd->zone) continue;
138 if (es->cfg->desk_show_mode)
140 EINA_LIST_FOREACH(es->cfg->desk_list, ll, sd)
143 if ((sd->x == bd->desk->x) && (sd->y == bd->desk->y))
145 OBSTACLE(es->x + es->zone->x, es->y + es->zone->y,
146 es->x + es->zone->x + es->w, es->y + es->zone->y + es->h);
153 OBSTACLE(es->x + es->zone->x, es->y + es->zone->y,
154 es->x + es->zone->x + es->w, es->y + es->zone->y + es->h);
159 _e_maximize_border_rects_fill(bd, rects, x1, yy1, x2, y2, dir);
160 E_FREE_LIST(rects, free);
165 e_maximize_border_border_fill(E_Border *bd, int *x1, int *yy1, int *x2, int *y2, E_Maximize dir)
167 Eina_List *rects = NULL;
172 bl = e_container_border_list_first(bd->zone->container);
173 while ((bd2 = e_container_border_list_next(bl)))
175 if ((bd2->zone != bd->zone) || (bd == bd2) || (bd2->desk != bd->desk && !bd2->sticky) || (bd2->iconic))
177 OBSTACLE(bd2->x, bd2->y, bd2->x + bd2->w, bd2->y + bd2->h);
179 e_container_border_list_free(bl);
182 _e_maximize_border_rects_fill(bd, rects, x1, yy1, x2, y2, dir);
183 E_FREE_LIST(rects, free);
188 _e_maximize_border_rects_fill(E_Border *bd, Eina_List *rects, int *x1, int *yy1, int *x2, int *y2, E_Maximize dir)
190 if ((dir & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)
192 _e_maximize_border_rects_fill_both(bd, rects, x1, yy1, x2, y2);
203 if ((dir & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
204 _e_maximize_border_rects_fill_horiz(bd, rects, x1, x2, &bx, &by, &bw, &bh);
205 else if ((dir & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
206 _e_maximize_border_rects_fill_vert(bd, rects, yy1, y2, &bx, &by, &bw, &bh);
211 _e_maximize_border_rects_fill_both(E_Border *bd, Eina_List *rects, int *x1, int *yy1, int *x2, int *y2)
213 int hx1, hy1, hx2, hy2;
214 int vx1, vy1, vx2, vy2;
217 hx1 = vx1 = bd->zone->x;
218 if (x1) hx1 = vx1 = *x1;
220 hy1 = vy1 = bd->zone->y;
221 if (yy1) hy1 = vy1 = *yy1;
223 hx2 = vx2 = bd->zone->x + bd->zone->w;
224 if (x2) hx2 = vx2 = *x2;
226 hy2 = vy2 = bd->zone->y + bd->zone->h;
227 if (y2) hy2 = vy2 = *y2;
229 /* Init working values, try maximizing horizontally first */
234 _e_maximize_border_rects_fill_horiz(bd, rects, &hx1, &hx2, &bx, &by, &bw, &bh);
235 _e_maximize_border_rects_fill_vert(bd, rects, &hy1, &hy2, &bx, &by, &bw, &bh);
237 /* Reset working values, try maximizing vertically first */
242 _e_maximize_border_rects_fill_vert(bd, rects, &vy1, &vy2, &bx, &by, &bw, &bh);
243 _e_maximize_border_rects_fill_horiz(bd, rects, &vx1, &vx2, &bx, &by, &bw, &bh);
245 /* Use the result set that gives the largest volume */
246 if (((hx2 - hx1) * (hy2 - hy1)) > ((vx2 - vx1) * (vy2 - vy1)))
263 _e_maximize_border_rects_fill_horiz(E_Border *bd, Eina_List *rects, int *x1, int *x2, int *bx, int *by, int *bw, int *bh)
266 E_Maximize_Rect *rect;
272 cx2 = bd->zone->x + bd->zone->w;
276 EINA_LIST_FOREACH(rects, l, rect)
278 if ((rect->x2 > cx1) && (rect->x2 <= *bx) &&
279 E_INTERSECTS(0, rect->yy1, bd->zone->w, (rect->y2 - rect->yy1), 0, *by, bd->zone->w, *bh))
288 EINA_LIST_FOREACH(rects, l, rect)
290 if ((rect->x1 < cx2) && (rect->x1 >= (*bx + *bw)) &&
291 E_INTERSECTS(0, rect->yy1, bd->zone->w, (rect->y2 - rect->yy1), 0, *by, bd->zone->w, *bh))
303 _e_maximize_border_rects_fill_vert(E_Border *bd, Eina_List *rects, int *yy1, int *y2, int *bx, int *by, int *bw, int *bh)
306 E_Maximize_Rect *rect;
312 cy2 = bd->zone->y + bd->zone->h;
316 EINA_LIST_FOREACH(rects, l, rect)
318 if ((rect->y2 > cy1) && (rect->y2 <= *by) &&
319 E_INTERSECTS(rect->x1, 0, (rect->x2 - rect->x1), bd->zone->h, *bx, 0, *bw, bd->zone->h))
328 EINA_LIST_FOREACH(rects, l, rect)
330 if ((rect->yy1 < cy2) && (rect->yy1 >= (*by + *bh)) &&
331 E_INTERSECTS(rect->x1, 0, (rect->x2 - rect->x1), bd->zone->h, *bx, 0, *bw, bd->zone->h))