Enable animation of resize operation.

Based on patches by Daniel Manjarres.

SVN revision: 61191
This commit is contained in:
Kim Woelders 2011-07-10 06:24:00 +00:00
parent 8989b80e80
commit 961e2cf215
6 changed files with 73 additions and 7 deletions

View File

@ -223,6 +223,8 @@ typedef struct {
char enable_sync_request;
char dragbar_nocover;
char enable_smart_max_hv;
char maximize_animate;
int maximize_speed;
} movres;
struct {
int movres;

View File

@ -445,6 +445,44 @@ doEwinMoveResize(EWin * ewin, Desk * dsk, int x, int y, int w, int h, int flags)
call_depth--;
}
void
EwinSlideSizeTo(EWin * ewin, int tx, int ty, int tw, int th)
{
int k, x, y, w, h;
int fx, fy, fw, fh, warp;
int speed = Conf.movres.maximize_speed;
fx = EoGetX(ewin);
fy = EoGetY(ewin);
fw = ewin->client.w;
fh = ewin->client.h;
warp = (ewin == GetEwinPointerInClient());
if (Conf.movres.maximize_animate)
{
ETimedLoopInit(0, 1024, speed);
for (k = 0; k <= 1024;)
{
x = ((fx * (1024 - k)) + (tx * k)) >> 10;
y = ((fy * (1024 - k)) + (ty * k)) >> 10;
w = ((fw * (1024 - k)) + (tw * k)) >> 10;
h = ((fh * (1024 - k)) + (th * k)) >> 10;
EwinMoveResize(ewin, x, y, w, h);
k = ETimedLoopNext();
}
}
EwinMoveResize(ewin, tx, ty, tw, th);
if (warp && ewin != GetEwinPointerInClient())
{
EwinWarpTo(ewin, 1);
FocusToEWin(ewin, FOCUS_SET);
}
}
void
EwinMove(EWin * ewin, int x, int y)
{

View File

@ -397,6 +397,8 @@ void SlideEwinsTo(EWin ** ewin, int *fx, int *fy, int *tx,
void EwinMove(EWin * ewin, int x, int y);
void EwinResize(EWin * ewin, int w, int h);
void EwinMoveResize(EWin * ewin, int x, int y, int w, int h);
void EwinSlideSizeTo(EWin * ewin, int tx, int ty,
int tw, int th);
void EwinMoveResizeWithGravity(EWin * ewin, int x, int y, int w,
int h, int grav);
void EwinMoveToDesktop(EWin * ewin, Desk * d);

View File

@ -162,6 +162,8 @@ static const CfgItem MiscCfgItems[] = {
CFG_ITEM_BOOL(Conf, movres.enable_sync_request, 0),
CFG_ITEM_BOOL(Conf, movres.dragbar_nocover, 0),
CFG_ITEM_BOOL(Conf, movres.enable_smart_max_hv, 0),
CFG_ITEM_BOOL(Conf, movres.maximize_animate, 0),
CFG_ITEM_INT(Conf, movres.maximize_speed, 6000),
CFG_ITEM_INT(Conf, opacity.menus, 85),
CFG_ITEM_INT(Conf, opacity.movres, 60),

View File

@ -31,6 +31,8 @@ typedef struct {
int resize;
int geominfo;
int maximize;
int maximize_speed;
char maximize_animate;
char dragbar_nocover;
char enable_smart_max_hv;
char avoid_server_grab;
@ -55,6 +57,8 @@ CB_ConfigureMoveResize(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
Conf.movres.enable_sync_request = dd->sync_request;
Conf.movres.dragbar_nocover = dd->dragbar_nocover;
Conf.movres.enable_smart_max_hv = dd->enable_smart_max_hv;
Conf.movres.maximize_speed = dd->maximize_speed;
Conf.movres.maximize_animate = dd->maximize_animate;
autosave();
}
@ -78,6 +82,8 @@ _DlgFillMoveResize(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
dd->sync_request = Conf.movres.enable_sync_request;
dd->dragbar_nocover = Conf.movres.dragbar_nocover;
dd->enable_smart_max_hv = Conf.movres.enable_smart_max_hv;
dd->maximize_speed = Conf.movres.maximize_speed;
dd->maximize_animate = Conf.movres.maximize_animate;
DialogItemTableSetOptions(table, 2, 0, 0, 0);
@ -236,6 +242,22 @@ _DlgFillMoveResize(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
DialogItemSetColSpan(di, 2);
DialogItemSetText(di, _("Enable smart maximization"));
DialogItemCheckButtonSetPtr(di, &dd->enable_smart_max_hv);
di = DialogAddItem(table, DITEM_CHECKBUTTON);
DialogItemSetColSpan(di, 2);
DialogItemSetText(di, _("Animate window maximization"));
DialogItemCheckButtonSetPtr(di, &dd->maximize_animate);
di = DialogAddItem(table, DITEM_TEXT);
DialogItemSetFill(di, 0, 0);
DialogItemSetAlign(di, 1024, 512);
DialogItemSetText(di, _("Maximization animation speed:"));
di = DialogAddItem(table, DITEM_SLIDER);
DialogItemSliderSetBounds(di, 0, 20000);
DialogItemSliderSetUnits(di, 500);
DialogItemSliderSetJump(di, 1000);
DialogItemSliderSetValPtr(di, &dd->maximize_speed);
}
const DialogDef DlgMoveResize = {

View File

@ -827,22 +827,22 @@ MaxSizeHV(EWin * ewin, const char *resize_type, int hor, int ver)
if (!hor && !ver)
{
/* Restore regular state */
EwinMoveResize(ewin, ewin->save_max.x, ewin->save_max.y,
ewin->save_max.w, ewin->save_max.h);
EwinSlideSizeTo(ewin, ewin->save_max.x, ewin->save_max.y,
ewin->save_max.w, ewin->save_max.h);
goto done;
}
if (old_ver == ver && old_hor && !hor)
{
/* Turn off horizontal maxsize */
EwinMoveResize(ewin, ewin->save_max.x, EoGetY(ewin),
ewin->save_max.w, ewin->client.h);
EwinSlideSizeTo(ewin, ewin->save_max.x, EoGetY(ewin),
ewin->save_max.w, ewin->client.h);
goto done;
}
if (old_hor == hor && old_ver && !ver)
{
/* Turn off vertical maxsize */
EwinMoveResize(ewin, EoGetX(ewin), ewin->save_max.y,
ewin->client.w, ewin->save_max.h);
EwinSlideSizeTo(ewin, EoGetX(ewin), ewin->save_max.y,
ewin->client.w, ewin->save_max.h);
goto done;
}
@ -967,7 +967,7 @@ MaxSizeHV(EWin * ewin, const char *resize_type, int hor, int ver)
if (h < 10)
h = 10;
EwinMoveResize(ewin, x, y, w, h);
EwinSlideSizeTo(ewin, x, y, w, h);
done:
ewin->state.maximizing = 0;
HintsSetWindowState(ewin);