Bugfix: Use more precise floating point arithmetic (Thanks helgiks)

This prevents errors in rounding leading to an unoccupied space of
-1 which in turn leads to infinity when calculating the new size
of a container after resizing.
This commit is contained in:
Michael Stapelberg 2009-12-08 11:48:25 +01:00
parent 99c7a14285
commit befd7f6f22

View File

@ -47,37 +47,37 @@ static bool update_if_necessary(uint32_t *destination, const uint32_t new_value)
* *
*/ */
int get_unoccupied_x(Workspace *workspace) { int get_unoccupied_x(Workspace *workspace) {
int unoccupied = workspace->rect.width; double unoccupied = workspace->rect.width;
float default_factor = ((float)workspace->rect.width / workspace->cols) / workspace->rect.width; double default_factor = ((float)workspace->rect.width / workspace->cols) / workspace->rect.width;
LOG("get_unoccupied_x(), starting with %d, default_factor = %f\n", unoccupied, default_factor); LOG("get_unoccupied_x(), starting with %f, default_factor = %f\n", unoccupied, default_factor);
for (int cols = 0; cols < workspace->cols; cols++) { for (int cols = 0; cols < workspace->cols; cols++) {
LOG("width_factor[%d] = %f\n", cols, workspace->width_factor[cols]); LOG("width_factor[%d] = %f, unoccupied = %f\n", cols, workspace->width_factor[cols], unoccupied);
if (workspace->width_factor[cols] == 0) if (workspace->width_factor[cols] == 0)
unoccupied -= workspace->rect.width * default_factor; unoccupied -= workspace->rect.width * default_factor;
} }
LOG("unoccupied space: %d\n", unoccupied); LOG("unoccupied space: %f\n", unoccupied);
return unoccupied; return unoccupied;
} }
/* See get_unoccupied_x() */ /* See get_unoccupied_x() */
int get_unoccupied_y(Workspace *workspace) { int get_unoccupied_y(Workspace *workspace) {
int height = workspace_height(workspace); int height = workspace_height(workspace);
int unoccupied = height; double unoccupied = height;
float default_factor = ((float)height / workspace->rows) / height; double default_factor = ((float)height / workspace->rows) / height;
LOG("get_unoccupied_y(), starting with %d, default_factor = %f\n", unoccupied, default_factor); LOG("get_unoccupied_y(), starting with %f, default_factor = %f\n", unoccupied, default_factor);
for (int rows = 0; rows < workspace->rows; rows++) { for (int rows = 0; rows < workspace->rows; rows++) {
LOG("height_factor[%d] = %f\n", rows, workspace->height_factor[rows]); LOG("height_factor[%d] = %f, unoccupied = %f\n", rows, workspace->height_factor[rows], unoccupied);
if (workspace->height_factor[rows] == 0) if (workspace->height_factor[rows] == 0)
unoccupied -= height * default_factor; unoccupied -= height * default_factor;
} }
LOG("unoccupied space: %d\n", unoccupied); LOG("unoccupied space: %f\n", unoccupied);
return unoccupied; return unoccupied;
} }