grow to edge works again, using the new edge detection code
This commit is contained in:
parent
007a84323f
commit
ad8a7e2e02
3 changed files with 96 additions and 64 deletions
|
@ -63,73 +63,23 @@ static gboolean run_func(ObActionsData *data, gpointer options)
|
||||||
Options *o = options;
|
Options *o = options;
|
||||||
|
|
||||||
if (data->client) {
|
if (data->client) {
|
||||||
gint x, y, width, height, dest;
|
gint x, y, w, h;
|
||||||
ObClient *c = data->client;
|
|
||||||
Rect *a;
|
|
||||||
|
|
||||||
a = screen_area(c->desktop, SCREEN_AREA_ALL_MONITORS, &c->frame->area);
|
|
||||||
x = c->frame->area.x;
|
|
||||||
y = c->frame->area.y;
|
|
||||||
/* get the unshaded frame's dimensions..if it is shaded */
|
|
||||||
width = c->area.width + c->frame->size.left + c->frame->size.right;
|
|
||||||
height = c->area.height + c->frame->size.top + c->frame->size.bottom;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
dest = client_directional_edge_search(c, o->dir);
|
|
||||||
|
|
||||||
switch(o->dir) {
|
|
||||||
case OB_DIRECTION_NORTH:
|
|
||||||
if (c->shaded) break; /* don't allow vertical resize if shaded */
|
|
||||||
|
|
||||||
if (a->y == y)
|
|
||||||
height = height / 2;
|
|
||||||
else {
|
|
||||||
height = c->frame->area.y + height - dest;
|
|
||||||
y = dest;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_DIRECTION_WEST:
|
|
||||||
if (a->x == x)
|
|
||||||
width = width / 2;
|
|
||||||
else {
|
|
||||||
width = c->frame->area.x + width - dest;
|
|
||||||
x = dest;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_DIRECTION_SOUTH:
|
|
||||||
if (c->shaded) break; /* don't allow vertical resize if shaded */
|
|
||||||
|
|
||||||
if (a->y + a->height == y + c->frame->area.height) {
|
|
||||||
height = c->frame->area.height / 2;
|
|
||||||
y = a->y + a->height - height;
|
|
||||||
} else
|
|
||||||
height = dest - c->frame->area.y;
|
|
||||||
y += (height - c->frame->area.height) % c->size_inc.height;
|
|
||||||
height -= (height - c->frame->area.height) % c->size_inc.height;
|
|
||||||
break;
|
|
||||||
case OB_DIRECTION_EAST:
|
|
||||||
if (a->x + a->width == x + c->frame->area.width) {
|
|
||||||
width = c->frame->area.width / 2;
|
|
||||||
x = a->x + a->width - width;
|
|
||||||
} else
|
|
||||||
width = dest - c->frame->area.x;
|
|
||||||
x += (width - c->frame->area.width) % c->size_inc.width;
|
|
||||||
width -= (width - c->frame->area.width) % c->size_inc.width;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached();
|
|
||||||
}
|
|
||||||
|
|
||||||
width -= c->frame->size.left + c->frame->size.right;
|
|
||||||
height -= c->frame->size.top + c->frame->size.bottom;
|
|
||||||
frame_frame_gravity(c->frame, &x, &y);
|
|
||||||
|
|
||||||
|
/* don't allow vertical resize if shaded */
|
||||||
|
if (o->dir != OB_DIRECTION_NORTH || o->dir != OB_DIRECTION_SOUTH ||
|
||||||
|
!data->client->shaded)
|
||||||
|
{
|
||||||
|
client_find_resize_directional(data->client, o->dir, TRUE,
|
||||||
|
&x, &y, &w, &h);
|
||||||
|
if (x != data->client->area.x || y != data->client->area.y ||
|
||||||
|
w != data->client->area.width ||
|
||||||
|
h != data->client->area.height)
|
||||||
|
{
|
||||||
actions_client_move(data, FALSE);
|
actions_client_move(data, FALSE);
|
||||||
client_move_resize(c, x, y, width, height);
|
client_move_resize(data->client, x, y, w, h);
|
||||||
actions_client_move(data, TRUE);
|
actions_client_move(data, TRUE);
|
||||||
|
}
|
||||||
#endif
|
}
|
||||||
g_free(a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -4089,6 +4089,85 @@ void client_find_move_directional(ObClient *self, ObDirection dir,
|
||||||
frame_frame_gravity(self->frame, x, y);
|
frame_frame_gravity(self->frame, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void client_find_resize_directional(ObClient *self, ObDirection side,
|
||||||
|
gboolean grow,
|
||||||
|
gint *x, gint *y, gint *w, gint *h)
|
||||||
|
{
|
||||||
|
gint head, size;
|
||||||
|
gint e, e_start, e_size, delta;
|
||||||
|
gboolean near;
|
||||||
|
ObDirection dir;
|
||||||
|
|
||||||
|
switch (side) {
|
||||||
|
case OB_DIRECTION_EAST:
|
||||||
|
head = RECT_RIGHT(self->frame->area) + (self->size_inc.width - 1);
|
||||||
|
size = self->frame->area.width;
|
||||||
|
e_start = RECT_TOP(self->frame->area);
|
||||||
|
e_size = self->frame->area.height;
|
||||||
|
dir = grow ? OB_DIRECTION_EAST : OB_DIRECTION_WEST;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_WEST:
|
||||||
|
head = RECT_LEFT(self->frame->area) - (self->size_inc.width - 1);
|
||||||
|
size = self->frame->area.width;
|
||||||
|
e_start = RECT_TOP(self->frame->area);
|
||||||
|
e_size = self->frame->area.height;
|
||||||
|
dir = grow ? OB_DIRECTION_WEST : OB_DIRECTION_EAST;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_NORTH:
|
||||||
|
head = RECT_TOP(self->frame->area) - (self->size_inc.height - 1);
|
||||||
|
size = self->frame->area.height;
|
||||||
|
e_start = RECT_LEFT(self->frame->area);
|
||||||
|
e_size = self->frame->area.width;
|
||||||
|
dir = grow ? OB_DIRECTION_NORTH : OB_DIRECTION_SOUTH;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_SOUTH:
|
||||||
|
head = RECT_BOTTOM(self->frame->area) + (self->size_inc.height - 1);
|
||||||
|
size = self->frame->area.height;
|
||||||
|
e_start = RECT_LEFT(self->frame->area);
|
||||||
|
e_size = self->frame->area.width;
|
||||||
|
dir = grow ? OB_DIRECTION_SOUTH : OB_DIRECTION_NORTH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
client_find_edge_directional(self, dir, head, size,
|
||||||
|
e_start, e_size, &e, &near);
|
||||||
|
*x = self->frame->area.x;
|
||||||
|
*y = self->frame->area.y;
|
||||||
|
*w = self->frame->area.width;
|
||||||
|
*h = self->frame->area.height;
|
||||||
|
switch (side) {
|
||||||
|
case OB_DIRECTION_EAST:
|
||||||
|
if (near) --e;
|
||||||
|
delta = e - RECT_RIGHT(self->frame->area);
|
||||||
|
*w += delta;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_WEST:
|
||||||
|
if (near) ++e;
|
||||||
|
delta = RECT_LEFT(self->frame->area) - e;
|
||||||
|
*x -= delta;
|
||||||
|
*w += delta;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_NORTH:
|
||||||
|
if (near) ++e;
|
||||||
|
delta = RECT_TOP(self->frame->area) - e;
|
||||||
|
*y -= delta;
|
||||||
|
*h += delta;
|
||||||
|
break;
|
||||||
|
case OB_DIRECTION_SOUTH:
|
||||||
|
if (near) --e;
|
||||||
|
delta = e - RECT_BOTTOM(self->frame->area);
|
||||||
|
*h += delta;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
frame_frame_gravity(self->frame, x, y);
|
||||||
|
*w -= self->frame->size.left + self->frame->size.right;
|
||||||
|
*h -= self->frame->size.top + self->frame->size.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
ObClient* client_under_pointer()
|
ObClient* client_under_pointer()
|
||||||
{
|
{
|
||||||
gint x, y;
|
gint x, y;
|
||||||
|
|
|
@ -463,6 +463,9 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
|
||||||
gint *dest, gboolean *near_edge);
|
gint *dest, gboolean *near_edge);
|
||||||
void client_find_move_directional(ObClient *self, ObDirection dir,
|
void client_find_move_directional(ObClient *self, ObDirection dir,
|
||||||
gint *x, gint *y);
|
gint *x, gint *y);
|
||||||
|
void client_find_resize_directional(ObClient *self, ObDirection side,
|
||||||
|
gboolean grow,
|
||||||
|
gint *x, gint *y, gint *w, gint *h);
|
||||||
|
|
||||||
/*! Fullscreen's or unfullscreen's the client window
|
/*! Fullscreen's or unfullscreen's the client window
|
||||||
@param fs true if the window should be made fullscreen; false if it should
|
@param fs true if the window should be made fullscreen; false if it should
|
||||||
|
|
Loading…
Reference in a new issue