With -f use percentages of window size not pane size, GitHub issue 2866.
authornicm <nicm@openbsd.org>
Tue, 8 Mar 2022 22:14:25 +0000 (22:14 +0000)
committernicm <nicm@openbsd.org>
Tue, 8 Mar 2022 22:14:25 +0000 (22:14 +0000)
usr.bin/tmux/cmd-split-window.c

index fbe1f6d..0e33748 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-split-window.c,v 1.111 2021/10/07 07:52:13 nicm Exp $ */
+/* $OpenBSD: cmd-split-window.c,v 1.112 2022/03/08 22:14:25 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -61,6 +61,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
        struct client           *tc = cmdq_get_target_client(item);
        struct session          *s = target->s;
        struct winlink          *wl = target->wl;
+       struct window           *w = wl->window;
        struct window_pane      *wp = target->wp, *new_wp;
        enum layout_type         type;
        struct layout_cell      *lc;
@@ -87,10 +88,17 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
                                cmdq_error(item, "percentage %s", errstr);
                                return (CMD_RETURN_ERROR);
                        }
-                       if (type == LAYOUT_TOPBOTTOM)
-                               size = (wp->sy * percentage) / 100;
-                       else
-                               size = (wp->sx * percentage) / 100;
+                       if (args_has(args, 'f')) {
+                               if (type == LAYOUT_TOPBOTTOM)
+                                       size = (w->sy * percentage) / 100;
+                               else
+                                       size = (w->sx * percentage) / 100;
+                       } else {
+                               if (type == LAYOUT_TOPBOTTOM)
+                                       size = (wp->sy * percentage) / 100;
+                               else
+                                       size = (wp->sx * percentage) / 100;
+                       }
                } else {
                        size = args_strtonum(args, 'l', 0, INT_MAX, &cause);
                        if (cause != NULL) {
@@ -106,10 +114,17 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
                        free(cause);
                        return (CMD_RETURN_ERROR);
                }
-               if (type == LAYOUT_TOPBOTTOM)
-                       size = (wp->sy * percentage) / 100;
-               else
-                       size = (wp->sx * percentage) / 100;
+               if (args_has(args, 'f')) {
+                       if (type == LAYOUT_TOPBOTTOM)
+                               size = (w->sy * percentage) / 100;
+                       else
+                               size = (w->sx * percentage) / 100;
+               } else {
+                       if (type == LAYOUT_TOPBOTTOM)
+                               size = (wp->sy * percentage) / 100;
+                       else
+                               size = (wp->sx * percentage) / 100;
+               }
        } else
                size = -1;