diff --git a/src/bin/e_border.c b/src/bin/e_border.c index dc316fbe6..3a3faf5b4 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -1079,6 +1079,8 @@ e_border_maximize(E_Border *bd) if (!bd->maximized) { Evas_List *l; + E_Border_List *bl; + E_Border *bd2; int x1, y1, x2, y2; int w, h; @@ -1088,8 +1090,6 @@ e_border_maximize(E_Border *bd) bd->saved.w = bd->w; bd->saved.h = bd->h; - e_hints_window_maximized_set(bd, 1); - e_border_raise(bd); switch (e_config->maximize_policy) { @@ -1098,9 +1098,9 @@ e_border_maximize(E_Border *bd) break; case E_MAXIMIZE_ZOOM: /* FIXME */ + bd->maximized = E_MAXIMIZE_ZOOM; break; case E_MAXIMIZE_FULLSCREEN: - /* FIXME: Care about step size */ if (bd->bg_object) { Evas_Coord cx, cy, cw, ch; @@ -1127,7 +1127,10 @@ e_border_maximize(E_Border *bd) /* center x-direction */ _e_border_resize_limit(bd, &w, &h); x1 = bd->zone->x + (bd->zone->w - w) / 2; - e_border_move_resize(bd, x1, bd->zone->y, w, h); + /* center y-direction */ + y1 = bd->zone->y + (bd->zone->h - h) / 2; + e_border_move_resize(bd, x1, y1, w, h); + bd->maximized = E_MAXIMIZE_FULLSCREEN; break; case E_MAXIMIZE_SMART: x1 = bd->zone->x; @@ -1167,21 +1170,127 @@ e_border_maximize(E_Border *bd) } } /* FIXME: walk through docks and toolbars */ - e_border_move_resize(bd, x1, y1, x2 - x1, y2 - y1); + w = x2 - x1; + h = y2 - y1; + _e_border_resize_limit(bd, &w, &h); + e_border_move_resize(bd, x1, y1, w, h); + bd->maximized = E_MAXIMIZE_SMART; break; case E_MAXIMIZE_EXPAND: - /* FIXME */ + x1 = bd->zone->x; + y1 = bd->zone->y; + x2 = bd->zone->x + bd->zone->w; + y2 = bd->zone->y + bd->zone->h; + + /* walk through all gadgets */ + /* FIXME: Should we care about clients that aren't aligned to */ + /* one edge? */ + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + E_Gadman_Client *gmc; + + gmc = l->data; + if ((gmc->zone != bd->zone) || + ((gmc->policy & 0xff) != E_GADMAN_POLICY_EDGES)) + continue; + switch (gmc->edge) + { + case E_GADMAN_EDGE_LEFT: + if ((gmc->x + gmc->w) > x1) + x1 = (gmc->x + gmc->w); + break; + case E_GADMAN_EDGE_RIGHT: + if (gmc->x < x2) + x2 = gmc->x; + break; + case E_GADMAN_EDGE_TOP: + if ((gmc->y + gmc->h) > y1) + y1 = (gmc->y + gmc->h); + break; + case E_GADMAN_EDGE_BOTTOM: + if (gmc->y < y2) + y2 = gmc->y; + break; + } + } + /* FIXME: walk through docks and toolbars */ + w = x2 - x1; + h = y2 - y1; + _e_border_resize_limit(bd, &w, &h); + e_border_move_resize(bd, x1, y1, w, h); + /* Don't set bd->maximized, no need to return from this state */ break; case E_MAXIMIZE_FILL: - /* FIXME */ + x1 = bd->zone->x; + y1 = bd->zone->y; + x2 = bd->zone->x + bd->zone->w; + y2 = bd->zone->y + bd->zone->h; + + /* walk through all gadgets */ + /* FIXME: Should we care about clients that aren't aligned to */ + /* one edge? */ + for (l = bd->zone->container->gadman->clients; l; l = l->next) + { + E_Gadman_Client *gmc; + + gmc = l->data; + if ((gmc->zone != bd->zone) || + ((gmc->policy & 0xff) != E_GADMAN_POLICY_EDGES)) + continue; + switch (gmc->edge) + { + case E_GADMAN_EDGE_LEFT: + if ((gmc->x + gmc->w) > x1) + x1 = (gmc->x + gmc->w); + break; + case E_GADMAN_EDGE_RIGHT: + if (gmc->x < x2) + x2 = gmc->x; + break; + case E_GADMAN_EDGE_TOP: + if ((gmc->y + gmc->h) > y1) + y1 = (gmc->y + gmc->h); + break; + case E_GADMAN_EDGE_BOTTOM: + if (gmc->y < y2) + y2 = gmc->y; + break; + } + } + /* walk through all windows */ + bl = e_container_border_list_first(bd->zone->container); + while ((bd2 = e_container_border_list_next(bl))) + { + if (bd2->zone != bd->zone) continue; + + if ((bd2->x < x2) && (bd2->x >= (bd->x + bd->w))) + x2 = bd2->x; + if (((bd2->x + bd2->w) > x1) && ((bd2->x + bd2->w) <= bd->x)) + x1 = (bd2->x + bd2->w); + if ((bd2->y < y2) && (bd2->y >= (bd->y + bd->w))) + y2 = bd2->y; + if (((bd2->y + bd2->h) > y1) && ((bd2->y + bd2->h) <= bd->y)) + y1 = (bd2->y + bd2->h); + } + e_container_border_list_free(bl); + + w = x2 - x1; + h = y2 - y1; + _e_border_resize_limit(bd, &w, &h); + e_border_move_resize(bd, x1, y1, w, h); + /* Don't set bd->maximized, no need to return from this state */ break; } - bd->maximized = e_config->maximize_policy; bd->changes.pos = 1; bd->changes.size = 1; bd->changed = 1; - edje_object_signal_emit(bd->bg_object, "maximize", ""); + if (bd->maximized) + { + edje_object_signal_emit(bd->bg_object, "maximize", ""); + e_hints_window_maximized_set(bd, 1); + } + } } @@ -1205,7 +1314,6 @@ e_border_unmaximize(E_Border *bd) /* FIXME */ break; case E_MAXIMIZE_FULLSCREEN: - /* FIXME */ if (bd->bg_object) { Evas_Coord cx, cy, cw, ch; @@ -1229,13 +1337,13 @@ e_border_unmaximize(E_Border *bd) } break; case E_MAXIMIZE_SMART: - /* FIXME */ + /* Don't have to do anything special */ break; case E_MAXIMIZE_EXPAND: - /* FIXME */ + /* Ignore */ break; case E_MAXIMIZE_FILL: - /* FIXME */ + /* Ignore */ break; } bd->maximized = E_MAXIMIZE_NONE; @@ -1275,9 +1383,11 @@ e_border_fullscreen(E_Border *bd) w = bd->zone->w + bd->client_inset.l + bd->client_inset.r; h = bd->zone->h + bd->client_inset.t + bd->client_inset.b; _e_border_resize_limit(bd, &w, &h); - /* center x */ + /* center */ x = x + (bd->zone->w + bd->client_inset.l + bd->client_inset.r - w) / 2; + y = y + (bd->zone->h + bd->client_inset.t + bd->client_inset.b - h) / 2; e_border_move_resize(bd, x, y, w, h); + ecore_evas_hide(bd->bg_ecore_evas); bd->fullscreen = 1; bd->changes.pos = 1; @@ -1302,6 +1412,7 @@ e_border_unfullscreen(E_Border *bd) bd->fullscreen = 0; e_border_move_resize(bd, bd->saved.x, bd->saved.y, bd->saved.w, bd->saved.h); + ecore_evas_show(bd->bg_ecore_evas); bd->changes.pos = 1; bd->changes.size = 1;