Add window snapping with siblings

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-03-25 15:24:45 +01:00
parent 9c17053c51
commit 57c36df181
1 changed files with 60 additions and 10 deletions

70
mouse.c
View File

@ -35,28 +35,78 @@
extern AwesomeConf globalconf;
static area_t
mouse_snapclienttogeometry_outside(area_t geometry, area_t snap_geometry, int snap)
{
if(geometry.x < snap + snap_geometry.x + snap_geometry.width
&& geometry.x > snap_geometry.x + snap_geometry.width)
geometry.x = snap_geometry.x + snap_geometry.width;
else if(geometry.x + geometry.width < snap_geometry.x
&& geometry.x + geometry.width > snap_geometry.x - snap)
geometry.x = snap_geometry.x - geometry.width;
if(geometry.y < snap + snap_geometry.y + snap_geometry.height
&& geometry.y > snap_geometry.y + snap_geometry.height)
geometry.y = snap_geometry.y + snap_geometry.height;
else if(geometry.y + geometry.height < snap_geometry.y
&& geometry.y + geometry.height > snap_geometry.y - snap)
geometry.y = snap_geometry.y - geometry.height;
return geometry;
}
static area_t
mouse_snapclienttogeometry_inside(area_t geometry, area_t snap_geometry, int snap)
{
if(abs(geometry.x) < snap + snap_geometry.x && geometry.x > snap_geometry.x)
geometry.x = snap_geometry.x;
else if(abs((snap_geometry.x + snap_geometry.width) - (geometry.x + geometry.width))
< snap)
geometry.x = snap_geometry.x + snap_geometry.width - geometry.width;
if(abs(geometry.y) < snap + snap_geometry.y && geometry.y > snap_geometry.y)
geometry.y = snap_geometry.y;
else if(abs((snap_geometry.y + snap_geometry.height) - (geometry.y + geometry.height))
< snap)
geometry.y = snap_geometry.y + snap_geometry.height - geometry.height;
return geometry;
}
static area_t
mouse_snapclient(Client *c, area_t geometry)
{
Client *snapper;
int snap = globalconf.screens[c->screen].snap;
area_t snapper_geometry;
area_t screen_geometry =
screen_get_area(c->screen,
globalconf.screens[c->screen].statusbar,
&globalconf.screens[c->screen].padding);
geometry = titlebar_geometry_add(&c->titlebar, geometry);
geometry.width += 2 * c->border;
geometry.height += 2 * c->border;
if(abs(geometry.x) < snap + screen_geometry.x && geometry.x > screen_geometry.x)
geometry.x = screen_geometry.x;
else if(abs((screen_geometry.x + screen_geometry.width) - (geometry.x + geometry.width + 2 * c->border))
< snap)
geometry.x = screen_geometry.x + screen_geometry.width - geometry.width - 2 * c->border;
if(abs(geometry.y) < snap + screen_geometry.y && geometry.y > screen_geometry.y)
geometry.y = screen_geometry.y;
else if(abs((screen_geometry.y + screen_geometry.height) - (geometry.y + geometry.height + 2 * c->border))
< snap)
geometry.y = screen_geometry.y + screen_geometry.height - geometry.height - 2 * c->border;
geometry =
mouse_snapclienttogeometry_inside(geometry, screen_geometry, snap);
for(snapper = globalconf.clients; snapper; snapper = snapper->next)
if(snapper != c && client_isvisible(c, c->screen))
{
snapper_geometry = snapper->geometry;
snapper_geometry.width += 2 * c->border;
snapper_geometry.height += 2 * c->border;
snapper_geometry = titlebar_geometry_add(&snapper->titlebar,
snapper_geometry);
geometry =
mouse_snapclienttogeometry_outside(geometry,
snapper_geometry,
snap);
}
geometry.width -= 2 * c->border;
geometry.height -= 2 * c->border;
return titlebar_geometry_remove(&c->titlebar, geometry);
}