Maximize update. Only zoom fullscreen is lacking, but that is more a

fullscreen mode, not a maximize mode.
Please comment the implementation!


SVN revision: 15423
This commit is contained in:
sebastid 2005-06-18 14:31:17 +00:00 committed by sebastid
parent bae19970a2
commit ff96193683
1 changed files with 125 additions and 14 deletions

View File

@ -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;