Bugfix: Fix coordinates when the rect of an output changes (Thanks Paul)

Fixes #623
This commit is contained in:
Michael Stapelberg
2012-01-21 15:07:53 +00:00
parent cccf078f1e
commit 077d2433a7
4 changed files with 39 additions and 17 deletions

View File

@ -551,6 +551,28 @@ void floating_reposition(Con *con, Rect newrect) {
tree_render();
}
/*
* Fixes the coordinates of the floating window whenever the window gets
* reassigned to a different output (or when the outputs rect changes).
*
*/
void floating_fix_coordinates(Con *con, Rect *old_rect, Rect *new_rect) {
DLOG("Fixing coordinates of floating window %p\n", con);
/* First we get the x/y coordinates relative to the x/y coordinates
* of the output on which the window is on */
uint32_t rel_x = (con->rect.x - old_rect->x);
uint32_t rel_y = (con->rect.y - old_rect->y);
/* Then we calculate a fraction, for example 0.63 for a window
* which is at y = 1212 of a 1920 px high output */
double fraction_x = ((double)rel_x / old_rect->width);
double fraction_y = ((double)rel_y / old_rect->height);
DLOG("rel_x = %d, rel_y = %d, fraction_x = %f, fraction_y = %f, output->w = %d, output->h = %d\n",
rel_x, rel_y, fraction_x, fraction_y, old_rect->width, old_rect->height);
con->rect.x = new_rect->x + (fraction_x * new_rect->width);
con->rect.y = new_rect->y + (fraction_y * new_rect->height);
DLOG("Resulting coordinates: x = %d, y = %d\n", con->rect.x, con->rect.y);
}
#if 0
/*
* Moves the client 10px to the specified direction.