X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommands.c;h=ab41ec97f4ac70d27023b618fda1c76f2b3b4830;hb=23c1c13d3479098aabf768cf83be4b6b70cfd7f0;hp=1b05d672b8f3d8ac5002ec11a99427a68a097b23;hpb=51d230ad4ca1bc4202ffb1b7e9157944542e3596;p=i3%2Fi3 diff --git a/src/commands.c b/src/commands.c index 1b05d672..ab41ec97 100644 --- a/src/commands.c +++ b/src/commands.c @@ -516,7 +516,7 @@ static bool cmd_resize_tiling_direction(I3_CMD, Con *current, const char *direct return resize_neighboring_cons(first, second, px, ppt); } -static bool cmd_resize_tiling_width_height(I3_CMD, Con *current, const char *direction, int px, int _ppt) { +static bool cmd_resize_tiling_width_height(I3_CMD, Con *current, const char *direction, int px, double ppt) { LOG("width/height resize\n"); /* get the appropriate current container (skip stacked/tabbed cons) */ @@ -542,34 +542,34 @@ static bool cmd_resize_tiling_width_height(I3_CMD, Con *current, const char *dir child->percent = percentage; } - double ppt = (double)_ppt / 100.0; double new_current_percent; double subtract_percent; - if (_ppt) { + if (ppt != 0.0) { new_current_percent = current->percent + ppt; } else { new_current_percent = px_resize_to_percent(current, px); 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); @@ -611,9 +611,10 @@ void cmd_resize(I3_CMD, const char *way, const char *direction, long resize_px, } else { if (strcmp(direction, "width") == 0 || strcmp(direction, "height") == 0) { + const double ppt = (double)resize_ppt / 100.0; if (!cmd_resize_tiling_width_height(current_match, cmd_output, current->con, direction, - resize_px, resize_ppt)) + resize_px, ppt)) return; } else { if (!cmd_resize_tiling_direction(current_match, cmd_output, @@ -645,10 +646,10 @@ static bool resize_set_tiling(I3_CMD, Con *target, orientation_t resize_orientat resize_find_tiling_participants(&target, &dummy, search_direction, true); /* Calculate new size for the target container */ - int ppt = 0; + double ppt = 0.0; int px = 0; if (is_ppt) { - ppt = target_size - target->percent * 100; + ppt = (double)target_size / 100.0 - target->percent; } else { px = target_size - (resize_orientation == HORIZ ? target->rect.width : target->rect.height); } @@ -1272,7 +1273,7 @@ void cmd_focus_direction(I3_CMD, const char *direction) { static void cmd_focus_force_focus(Con *con) { /* Disable fullscreen container in workspace with container to be focused. */ Con *ws = con_get_workspace(con); - Con *fullscreen_on_ws = (focused && focused->fullscreen_mode == CF_GLOBAL) ? focused : con_get_fullscreen_con(ws, CF_OUTPUT); + Con *fullscreen_on_ws = con_get_fullscreen_covering_ws(ws); if (fullscreen_on_ws && fullscreen_on_ws != con && !con_has_parent(con, fullscreen_on_ws)) { con_disable_fullscreen(fullscreen_on_ws); }