diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 772662bd1..9395a238a 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -251,7 +251,7 @@ ACT_FN_GO(window_maximized_toggle) bd = (E_Border *)obj; if (bd->maximized) e_border_unmaximize(bd); - else e_border_maximize(bd); + else e_border_maximize(bd, e_config->maximize_policy); } } diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 8159a251d..986db7dc5 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -1070,7 +1070,7 @@ e_border_unshade(E_Border *bd, E_Direction dir) } void -e_border_maximize(E_Border *bd) +e_border_maximize(E_Border *bd, E_Maximize max) { E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); @@ -1091,7 +1091,7 @@ e_border_maximize(E_Border *bd) bd->saved.h = bd->h; e_border_raise(bd); - switch (e_config->maximize_policy) + switch (max) { case E_MAXIMIZE_NONE: /* Ignore */ @@ -1140,9 +1140,11 @@ e_border_maximize(E_Border *bd) y2 = bd->zone->y + bd->zone->h; /* walk through all gadgets */ - e_maximize_border_gadman(bd, &x1, &y1, &x2, &y2); + e_maximize_border_gadman_fit(bd, &x1, &y1, &x2, &y2); /* walk through docks and toolbars */ + /* FIXME */ +#if 0 bl = e_container_border_list_first(bd->zone->container); while ((bd2 = e_container_border_list_next(bl))) { @@ -1161,6 +1163,7 @@ e_border_maximize(E_Border *bd) y1 = (bd2->y + bd2->h); } e_container_border_list_free(bl); +#endif w = x2 - x1; h = y2 - y1; _e_border_resize_limit(bd, &w, &h); @@ -1176,23 +1179,11 @@ e_border_maximize(E_Border *bd) y2 = bd->zone->y + bd->zone->h; /* walk through all gadgets */ - for (l = bd->zone->container->gadman->clients; l; l = l->next) - { - E_Gadman_Client *gmc; + e_maximize_border_gadman_fill(bd, &x1, &y1, &x2, &y2); - gmc = l->data; - if ((gmc->zone != bd->zone)) continue; - - if ((gmc->x < x2) && (gmc->x >= (bd->x + bd->w))) - x2 = gmc->x; - if (((gmc->x + gmc->w) > x1) && ((gmc->x + gmc->w) <= bd->x)) - x1 = (gmc->x + gmc->w); - if ((gmc->y < y2) && (gmc->y >= (bd->y + bd->w))) - y2 = gmc->y; - if (((gmc->y + gmc->h) > y1) && ((gmc->y + gmc->h) <= bd->y)) - y1 = (gmc->y + gmc->h); - } /* walk through all windows */ + /* FIXME */ +#if 0 bl = e_container_border_list_first(bd->zone->container); while ((bd2 = e_container_border_list_next(bl))) { @@ -1208,6 +1199,7 @@ e_border_maximize(E_Border *bd) y1 = (bd2->y + bd2->h); } e_container_border_list_free(bl); +#endif w = x2 - x1; h = y2 - y1; @@ -2930,7 +2922,7 @@ _e_border_cb_signal_action(void *data, Evas_Object *obj, const char *emission, c else if (!strcmp(source, "maximize")) { if (bd->maximized) e_border_unmaximize(bd); - else e_border_maximize(bd); + else e_border_maximize(bd, e_config->maximize_policy); } else if (!strcmp(source, "iconify")) { @@ -4802,7 +4794,7 @@ _e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi) bd = data; if (bd->maximized) e_border_unmaximize(bd); - else e_border_maximize(bd); + else e_border_maximize(bd, e_config->maximize_policy); } static void diff --git a/src/bin/e_border.h b/src/bin/e_border.h index ca00b29d8..87501c693 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -33,7 +33,7 @@ typedef enum _E_Focus_Policy E_FOCUS_SLOPPY } E_Focus_Policy; -typedef enum _E_Maximize_Policy +typedef enum _E_Maximize { E_MAXIMIZE_NONE, E_MAXIMIZE_ZOOM, @@ -41,7 +41,7 @@ typedef enum _E_Maximize_Policy E_MAXIMIZE_SMART, E_MAXIMIZE_EXPAND, E_MAXIMIZE_FILL -} E_Maximize_Policy; +} E_Maximize; @@ -255,7 +255,7 @@ struct _E_Border unsigned char re_manage : 1; unsigned char shading : 1; unsigned char shaded : 1; - E_Maximize_Policy maximized; + E_Maximize maximized; unsigned char iconic : 1; unsigned char sticky : 1; unsigned char shaped : 1; @@ -421,7 +421,7 @@ EAPI void e_border_stack_below(E_Border *bd, E_Border *below); EAPI void e_border_focus_set(E_Border *bd, int focus, int set); EAPI void e_border_shade(E_Border *bd, E_Direction dir); EAPI void e_border_unshade(E_Border *bd, E_Direction dir); -EAPI void e_border_maximize(E_Border *bd); +EAPI void e_border_maximize(E_Border *bd, E_Maximize max); EAPI void e_border_unmaximize(E_Border *bd); EAPI void e_border_fullscreen(E_Border *bd); EAPI void e_border_unfullscreen(E_Border *bd); diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index 15168000c..4df6552cc 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -389,7 +389,7 @@ e_hints_window_init(E_Border *bd) if (bd->client.netwm.state.shaded) e_border_shade(bd, e_hints_window_shade_direction_get(bd)); if ((bd->client.netwm.state.maximized_v) && (bd->client.netwm.state.maximized_h)) - e_border_maximize(bd); + e_border_maximize(bd, e_config->maximize_policy); if (bd->client.netwm.state.fullscreen) e_border_fullscreen(bd); if ((bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC) @@ -561,7 +561,7 @@ e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state, bd->changed = 1; if ((bd->client.netwm.state.maximized_v) && (bd->client.netwm.state.maximized_h)) - e_border_maximize(bd); + e_border_maximize(bd, e_config->maximize_policy); else if ((!bd->client.netwm.state.maximized_v) && (!bd->client.netwm.state.maximized_h)) e_border_unmaximize(bd); @@ -596,7 +596,7 @@ e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state, bd->changed = 1; if ((bd->client.netwm.state.maximized_v) && (bd->client.netwm.state.maximized_h)) - e_border_maximize(bd); + e_border_maximize(bd, e_config->maximize_policy); else if ((!bd->client.netwm.state.maximized_v) && (!bd->client.netwm.state.maximized_h)) e_border_unmaximize(bd); diff --git a/src/bin/e_maximize.c b/src/bin/e_maximize.c index 4bd597102..2ca6a2dbd 100644 --- a/src/bin/e_maximize.c +++ b/src/bin/e_maximize.c @@ -4,7 +4,7 @@ #include "e.h" void -e_maximize_border_gadman(E_Border *bd, int *x1, int *y1, int *x2, int *y2) +e_maximize_border_gadman_fit(E_Border *bd, int *x1, int *y1, int *x2, int *y2) { Evas_List *l; int cx1, cx2, cy1, cy2; @@ -25,20 +25,132 @@ e_maximize_border_gadman(E_Border *bd, int *x1, int *y1, int *x2, int *y2) for (l = bd->zone->container->gadman->clients; l; l = l->next) { E_Gadman_Client *gmc; + double ax, ay; gmc = l->data; if ((gmc->zone != bd->zone)) continue; - if ((gmc->ax == 0.0) && ((gmc->x + gmc->w) > cx1)) + ax = gmc->ax; + ay = gmc->ay; + + if (((ax == 0.0) || (ax == 1.0)) && + ((ay == 0.0) || (ay == 1.0))) + { + /* corner gadget */ + /* Fake removal from one alignment :) */ + if (gmc->w > gmc->h) + ax = 0.5; + else + ay = 0.5; + } + + if ((ax == 0.0) && (gmc->x + gmc->w) > cx1) cx1 = (gmc->x + gmc->w); - if ((gmc->ax == 1.0) && (gmc->x < cx2)) + else if ((ax == 1.0) && (gmc->x < cx2)) cx2 = gmc->x; - if ((gmc->ay == 0.0) && ((gmc->y + gmc->h) > cy1)) + else if ((ay == 0.0) && ((gmc->y + gmc->h) > cy1)) cy1 = (gmc->y + gmc->h); - if ((gmc->ay == 1.0) && (gmc->y < cy2)) + else if ((ay == 1.0) && (gmc->y < cy2)) cy2 = gmc->y; } - /* FIXME: Try to expand */ + + if (x1) *x1 = cx1; + if (y1) *y1 = cy1; + if (x2) *x2 = cx2; + if (y2) *y2 = cy2; +} + +void +e_maximize_border_gadman_fill(E_Border *bd, int *x1, int *y1, int *x2, int *y2) +{ + Evas_List *l; + int bx, by, bw, bh; + int cx1, cx2, cy1, cy2; + + cx1 = bd->zone->x; + if (x1) cx1 = *x1; + + cy1 = bd->zone->y; + if (y1) cy1 = *y1; + + cx2 = bd->zone->x + bd->zone->w; + if (x2) cx2 = *x2; + + cy2 = bd->zone->y + bd->zone->h; + if (y2) cy2 = *y2; + + /* Loop four times. We expand left, up, right, down. */ + /* FIXME: The right order? */ + bx = bd->x; + by = bd->y; + bw = bd->w; + bh = bd->h; + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + /* expand left */ + E_Gadman_Client *gmc; + int gx2; + + gmc = l->data; + if ((gmc->zone != bd->zone)) continue; + + gx2 = gmc->x + gmc->w; + if ((gx2 > cx1) && (gx2 <= bx) && + E_INTERSECTS(0, gmc->y, bd->zone->w, gmc->h, 0, by, bd->zone->w, bh)) + { + cx1 = gx2; + } + } + bw += (bx - cx1); + bx = cx1; + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + /* expand up */ + E_Gadman_Client *gmc; + int gy2; + + gmc = l->data; + if ((gmc->zone != bd->zone)) continue; + + gy2 = gmc->y + gmc->h; + if ((gy2 > cy1) && (gy2 <= by) && + E_INTERSECTS(gmc->x, 0, gmc->w, bd->zone->h, bx, 0, bw, bd->zone->h)) + { + cy1 = gy2; + } + } + bh += (by - cy1); + by = cy1; + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + /* expand right */ + E_Gadman_Client *gmc; + + gmc = l->data; + if ((gmc->zone != bd->zone)) continue; + + if ((gmc->x < cx2) && (gmc->x >= (bx + bw)) && + E_INTERSECTS(0, gmc->y, bd->zone->w, gmc->h, 0, by, bd->zone->w, bh)) + { + cx2 = gmc->x; + } + } + bw = (cx2 - cx1); + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + /* expand down */ + E_Gadman_Client *gmc; + + gmc = l->data; + if ((gmc->zone != bd->zone)) continue; + + if ((gmc->y < cy2) && (gmc->y >= (by + bh)) && + E_INTERSECTS(gmc->x, 0, gmc->w, bd->zone->h, bx, 0, bw, bd->zone->h)) + { + cy2 = gmc->y; + } + } + bh = (cy2 - cy1); if (x1) *x1 = cx1; if (y1) *y1 = cy1; diff --git a/src/bin/e_maximize.h b/src/bin/e_maximize.h index ac43a4233..b95503852 100644 --- a/src/bin/e_maximize.h +++ b/src/bin/e_maximize.h @@ -6,7 +6,8 @@ #ifndef E_MAXIMIZE_H #define E_MAXIMIZE_H -void e_maximize_border_gadman(E_Border *bd, int *x1, int *y1, int *x2, int *y2); +void e_maximize_border_gadman_fit(E_Border *bd, int *x1, int *y1, int *x2, int *y2); +void e_maximize_border_gadman_fill(E_Border *bd, int *x1, int *y1, int *x2, int *y2); #endif #endif