From dc097d85952f82b101ea897d33958582db2fa010 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Sun, 31 Jan 2010 13:11:44 +0000 Subject: Handle windows that have server border set properly. --- diff --git a/put.c b/put.c index daf268f..9870cd3 100644 --- a/src/put/put.c +++ b/src/put/put.c @@ -43,6 +43,14 @@ GET_PUT_SCREEN (w->screen, \ GET_PUT_DISPLAY (w->screen->display))) +#define TOP_BORDER(w) ((w)->input.top) +#define LEFT_BORDER(w) ((w)->input.left) +#define RIGHT_BORDER(w) ((w)->input.right + 2 * (w)->serverBorderWidth) +#define BOTTOM_BORDER(w) ((w)->input.bottom + 2 * (w)->serverBorderWidth) + +#define HALF_WIDTH(w) ((w)->serverWidth / 2 + (w)->serverBorderWidth) +#define HALF_HEIGHT(w) ((w)->serverHeight / 2 + (w)->serverBorderWidth) + static int displayPrivateIndex; typedef enum @@ -395,54 +403,56 @@ putGetDistance (CompWindow *w, switch (type) { case PutCenter: /* center of the screen */ - dx = (workArea.width / 2) - (w->serverWidth / 2) - (x - workArea.x); - dy = (workArea.height / 2) - (w->serverHeight / 2) - (y - workArea.y); + dx = (workArea.width / 2) - (w->serverWidth / 2) - + w->serverBorderWidth - (x - workArea.x); + dy = (workArea.height / 2) - (w->serverHeight / 2) - + w->serverBorderWidth - (y - workArea.y); break; case PutLeft: /* center of the left edge */ - dx = -(x - workArea.x) + w->input.left + putGetPadLeft (s); - dy = (workArea.height / 2) - (w->serverHeight / 2) - (y - workArea.y); + dx = -(x - workArea.x) + LEFT_BORDER (w) + putGetPadLeft (s); + dy = (workArea.height / 2) - HALF_HEIGHT (w) - (y - workArea.y); break; case PutTopLeft: /* top left corner */ - dx = -(x - workArea.x) + w->input.left + putGetPadLeft (s); - dy = -(y - workArea.y) + w->input.top + putGetPadTop (s); + dx = -(x - workArea.x) + LEFT_BORDER (w) + putGetPadLeft (s); + dy = -(y - workArea.y) + TOP_BORDER (w) + putGetPadTop (s); break; case PutTop: /* center of top edge */ - dx = (workArea.width / 2) - (w->serverWidth / 2) - (x - workArea.x); - dy = -(y - workArea.y) + w->input.top + putGetPadTop (s); + dx = (workArea.width / 2) - HALF_WIDTH (w) - (x - workArea.x); + dy = -(y - workArea.y) + TOP_BORDER (w) + putGetPadTop (s); break; case PutTopRight: /* top right corner */ dx = workArea.width - w->serverWidth - (x - workArea.x) - - w->input.right - putGetPadRight (s); - dy = -(y - workArea.y) + w->input.top + putGetPadTop (s); + RIGHT_BORDER (w) - putGetPadRight (s); + dy = -(y - workArea.y) + TOP_BORDER (w) + putGetPadTop (s); break; case PutRight: /* center of right edge */ dx = workArea.width - w->serverWidth - (x - workArea.x) - - w->input.right - putGetPadRight (s); - dy = (workArea.height / 2) - (w->serverHeight / 2) - (y - workArea.y); + RIGHT_BORDER (w) - putGetPadRight (s); + dy = (workArea.height / 2) - HALF_HEIGHT (w) - (y - workArea.y); break; case PutBottomRight: /* bottom right corner */ dx = workArea.width - w->serverWidth - (x - workArea.x) - - w->input.right - putGetPadRight (s); + RIGHT_BORDER (w) - putGetPadRight (s); dy = workArea.height - w->serverHeight - (y - workArea.y) - - w->input.bottom - putGetPadBottom (s); + BOTTOM_BORDER (w) - putGetPadBottom (s); break; case PutBottom: /* center of bottom edge */ - dx = (workArea.width / 2) - (w->serverWidth / 2) - (x - workArea.x); + dx = (workArea.width / 2) - HALF_WIDTH (w) - (x - workArea.x); dy = workArea.height - w->serverHeight - (y - workArea.y) - - w->input.bottom - putGetPadBottom (s); + BOTTOM_BORDER (w) - putGetPadBottom (s); break; case PutBottomLeft: /* bottom left corner */ - dx = -(x - workArea.x) + w->input.left + putGetPadLeft (s); + dx = -(x - workArea.x) + LEFT_BORDER (w) + putGetPadLeft (s); dy = workArea.height - w->serverHeight - (y - workArea.y) - - w->input.bottom - putGetPadBottom (s); + BOTTOM_BORDER (w) - putGetPadBottom (s); break; case PutRestore: /* back to last position */ @@ -538,16 +548,16 @@ putGetDistance (CompWindow *w, if (posX < 0) /* account for a specified negative position, like geometry without (-0) */ - dx = posX + s->width - w->serverWidth - x - w->input.right; + dx = posX + s->width - w->serverWidth - x - RIGHT_BORDER (w); else - dx = posX - x + w->input.left; + dx = posX - x + LEFT_BORDER (w); if (posY < 0) /* account for a specified negative position, like geometry without (-0) */ - dy = posY + s->height - w->height - y - w->input.bottom; + dy = posY + s->height - w->serverHeight - y - BOTTOM_BORDER (w); else - dy = posY - y + w->input.top; + dy = posY - y + TOP_BORDER (w); break; case PutRelative: /* move window by offset */ @@ -572,35 +582,35 @@ putGetDistance (CompWindow *w, if (putGetWindowCenter (s)) { /* window center */ - dx = rx - (w->serverWidth / 2) - x; - dy = ry - (w->serverHeight / 2) - y; + dx = rx - HALF_WIDTH (w) - x; + dy = ry - HALF_HEIGHT (w) - y; } else if (rx < s->workArea.width / 2 && ry < s->workArea.height / 2) { /* top left quad */ - dx = rx - x + w->input.left; - dy = ry - y + w->input.top; + dx = rx - x + LEFT_BORDER (w); + dy = ry - y + TOP_BORDER (w); } else if (rx < s->workArea.width / 2 && ry >= s->workArea.height / 2) { /* bottom left quad */ - dx = rx - x + w->input.left; - dy = ry - w->height - y - w->input.bottom; + dx = rx - x + LEFT_BORDER (w); + dy = ry - w->serverHeight - y - BOTTOM_BORDER (w); } else if (rx >= s->workArea.width / 2 && ry < s->workArea.height / 2) { /* top right quad */ - dx = rx - w->width - x - w->input.right; - dy = ry - y + w->input.top; + dx = rx - w->serverWidth - x - RIGHT_BORDER (w); + dy = ry - y + TOP_BORDER (w); } else { /* bottom right quad */ - dx = rx - w->width - x - w->input.right; - dy = ry - w->height - y - w->input.bottom; + dx = rx - w->serverWidth - x - RIGHT_BORDER (w); + dy = ry - w->serverHeight - y - BOTTOM_BORDER (w); } } else @@ -627,10 +637,10 @@ putGetDistance (CompWindow *w, inDx = dxBefore = dx % s->width; inDy = dyBefore = dy % s->height; - extents.left = x + inDx - w->input.left; - extents.top = y + inDy - w->input.top; - extents.right = x + inDx + w->serverWidth + w->input.right; - extents.bottom = y + inDy + w->serverHeight + w->input.bottom; + extents.left = x + inDx - LEFT_BORDER (w); + extents.top = y + inDy - TOP_BORDER (w); + extents.right = x + inDx + w->serverWidth + RIGHT_BORDER (w); + extents.bottom = y + inDy + w->serverHeight + BOTTOM_BORDER (w); area.left = workArea.x + putGetPadLeft (s); area.top = workArea.y + putGetPadTop (s); -- cgit v0.8.2