*/
bool resize_neighboring_cons(Con *first, Con *second, int px, int ppt);
+/**
+ * Calculate the minimum percent needed for the given container to be at least 1
+ * pixel.
+ *
+ */
+double percent_for_1px(Con *con);
+
/**
* Calculate the given container's new percent given a change in pixels.
*
ppt = new_current_percent - current->percent;
}
subtract_percent = ppt / (children - 1);
+ if (ppt < 0.0 && new_current_percent < percent_for_1px(current)) {
+ yerror("Not resizing, container would end with less than 1px\n");
+ return false;
+ }
LOG("new_current_percent = %f\n", new_current_percent);
LOG("subtract_percent = %f\n", subtract_percent);
/* Ensure that the new percentages are positive. */
- TAILQ_FOREACH(child, &(current->parent->nodes_head), nodes) {
- if (child == current)
- continue;
- if (child->percent - subtract_percent <= 0.0) {
- LOG("Not resizing, already at minimum size (child %p would end up with a size of %.f\n", child, child->percent - subtract_percent);
- ysuccess(false);
- return false;
+ if (subtract_percent >= 0.0) {
+ TAILQ_FOREACH(child, &(current->parent->nodes_head), nodes) {
+ if (child == current) {
+ continue;
+ }
+ if (child->percent - subtract_percent < percent_for_1px(child)) {
+ yerror("Not resizing, already at minimum size (child %p would end up with a size of %.f\n", child, child->percent - subtract_percent);
+ return false;
+ }
}
}
- if (new_current_percent <= 0.0) {
- LOG("Not resizing, already at minimum size\n");
- ysuccess(false);
- return false;
- }
current->percent = new_current_percent;
LOG("current->percent after = %f\n", current->percent);
return ((double)target / (double)total);
}
+/*
+ * Calculate the minimum percent needed for the given container to be at least 1
+ * pixel.
+ *
+ */
+double percent_for_1px(Con *con) {
+ Con *parent = con->parent;
+ const orientation_t o = con_orientation(parent);
+ const int total = (o == HORIZ ? parent->rect.width : parent->rect.height);
+ const int target = (o == HORIZ ? 1 : 1 + con->deco_rect.height);
+ return ((double)target / (double)total);
+}
+
/*
* Resize the two given containers using the given amount of pixels or
* percentage points. One of the two needs to be 0. A positive amount means
assert(px * ppt == 0);
Con *parent = first->parent;
- orientation_t orientation = con_orientation(parent);
- const int total = (orientation == HORIZ ? parent->rect.width : parent->rect.height);
double new_first_percent;
double new_second_percent;
if (ppt) {
}
/* Ensure that no container will be less than 1 pixel in the resizing
* direction. */
- if (lround(new_first_percent * total) <= 0 || lround(new_second_percent * total) <= 0) {
+ if (new_first_percent < percent_for_1px(first) || new_second_percent < percent_for_1px(second)) {
return false;
}