Hi I tweaked this a bit, think it fixes the problems, does this seem okay, please test.
Index: cmd-select-layout.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/cmd-select-layout.c,v retrieving revision 1.8 diff -u -p -r1.8 cmd-select-layout.c --- cmd-select-layout.c 3 Dec 2009 22:50:10 -0000 1.8 +++ cmd-select-layout.c 18 Apr 2010 08:35:07 -0000 @@ -59,6 +59,9 @@ cmd_select_layout_init(struct cmd *self, case ('4' | KEYC_ESCAPE): data->arg = xstrdup("main-vertical"); break; + case ('5' | KEYC_ESCAPE): + data->arg = xstrdup("tiled"); + break; } } Index: key-bindings.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/key-bindings.c,v retrieving revision 1.19 diff -u -p -r1.19 key-bindings.c --- key-bindings.c 6 Apr 2010 21:35:44 -0000 1.19 +++ key-bindings.c 18 Apr 2010 08:35:07 -0000 @@ -151,6 +151,7 @@ key_bindings_init(void) { '2' | KEYC_ESCAPE, 0, &cmd_select_layout_entry }, { '3' | KEYC_ESCAPE, 0, &cmd_select_layout_entry }, { '4' | KEYC_ESCAPE, 0, &cmd_select_layout_entry }, + { '5' | KEYC_ESCAPE, 0, &cmd_select_layout_entry }, { KEYC_PPAGE, 0, &cmd_copy_mode_entry }, { 'n' | KEYC_ESCAPE, 0, &cmd_next_window_entry }, { 'o' | KEYC_ESCAPE, 0, &cmd_rotate_window_entry }, Index: layout-set.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/layout-set.c,v retrieving revision 1.5 diff -u -p -r1.5 layout-set.c --- layout-set.c 3 Feb 2010 22:24:34 -0000 1.5 +++ layout-set.c 18 Apr 2010 08:35:07 -0000 @@ -31,6 +31,7 @@ void layout_set_even_h(struct window *); void layout_set_even_v(struct window *); void layout_set_main_h(struct window *); void layout_set_main_v(struct window *); +void layout_set_tiled(struct window *); const struct { const char *name; @@ -40,6 +41,7 @@ const struct { { "even-vertical", layout_set_even_v }, { "main-horizontal", layout_set_main_h }, { "main-vertical", layout_set_main_v }, + { "tiled", layout_set_tiled }, }; const char * @@ -437,6 +439,105 @@ layout_set_main_v(struct window *w) if (w->sx > used) { lccolumn = TAILQ_LAST(&lc->cells, layout_cells); layout_resize_adjust(lccolumn, LAYOUT_LEFTRIGHT, w->sx - used); + } + + /* Fix cell offsets. */ + layout_fix_offsets(lc); + layout_fix_panes(w, w->sx, w->sy); + + layout_print_cell(w->layout_root, __func__, 1); + + server_redraw_window(w); +} + +void +layout_set_tiled(struct window *w) +{ + struct window_pane *wp; + struct layout_cell *lc, *lcrow, *lcchild; + u_int n, width, height, used; + u_int i, j, columns, rows; + + layout_print_cell(w->layout_root, __func__, 1); + + /* Get number of panes. */ + n = window_count_panes(w); + if (n <= 1) + return; + + /* How many rows and columns are wanted? */ + rows = columns = 1; + while (rows * columns < n) { + rows++; + if (rows * columns < n) + columns++; + } + + /* What width and height should they be? */ + width = w->sx / columns; + if (width < PANE_MINIMUM + 1) + width = PANE_MINIMUM + 1; + height = w->sy / rows; + if (width < PANE_MINIMUM + 1) + width = PANE_MINIMUM + 1; + + /* Free old tree and create a new root. */ + layout_free(w); + lc = w->layout_root = layout_create_cell(NULL); + layout_set_size(lc, width * columns, height * rows, 0, 0); + layout_make_node(lc, LAYOUT_TOPBOTTOM); + + /* Create a grid of the cells. */ + wp = TAILQ_FIRST(&w->panes); + for (j = 0; j < rows; j++) { + /* If this is the last cell, all done. */ + if (wp == NULL) + break; + + /* Create the new row. */ + lcrow = layout_create_cell(lc); + layout_set_size(lcrow, w->sx, height - 1, 0, 0); + TAILQ_INSERT_TAIL(&lc->cells, lcrow, entry); + + /* If only one column, just use the row directly. */ + if (n - (j * columns) == 1) { + layout_make_leaf(lcrow, wp); + wp = TAILQ_NEXT(wp, entry); + continue; + } + + /* Add in the columns. */ + layout_make_node(lcrow, LAYOUT_LEFTRIGHT); + for (i = 0; i < columns; i++) { + /* Create and add a pane cell. */ + lcchild = layout_create_cell(lcrow); + layout_set_size(lcchild, width - 1, height - 1, 0, 0); + layout_make_leaf(lcchild, wp); + TAILQ_INSERT_TAIL(&lcrow->cells, lcchild, entry); + + /* Move to the next cell. */ + if ((wp = TAILQ_NEXT(wp, entry)) == NULL) + break; + } + + /* + * Adjust the row and columns to fit the full width if + * necessary. + */ + if (i == columns) + i--; + used = ((i + 1) * width) - 1; + if (w->sx <= used) + continue; + lcchild = TAILQ_LAST(&lcrow->cells, layout_cells); + layout_resize_adjust(lcchild, LAYOUT_LEFTRIGHT, w->sx - used); + } + + /* Adjust the last row height to fit if necessary. */ + used = (rows * height) - 1; + if (w->sy > used) { + lcrow = TAILQ_LAST(&lc->cells, layout_cells); + layout_resize_adjust(lcrow, LAYOUT_TOPBOTTOM, w->sy - used); } /* Fix cell offsets. */ Index: tmux.1 =================================================================== RCS file: /cvs/src/usr.bin/tmux/tmux.1,v retrieving revision 1.164 diff -u -p -r1.164 tmux.1 --- tmux.1 6 Apr 2010 21:35:44 -0000 1.164 +++ tmux.1 18 Apr 2010 08:35:08 -0000 @@ -784,6 +784,9 @@ bottom along the right. See the .Em main-pane-width window option. +.It Ic tiled +Panes are spread out as evenly as possible over the window in both rows and +columns. .El .Pp Commands related to windows and panes are as follows: On Tue, Feb 02, 2010 at 04:41:13PM -0800, Liam Bedford wrote: > Not sure if this fits with what you're trying to do, but it seems > useful to me :) > > This patch adds another layout mode, called tiled, which tries > to tile the panes in a number of rows. It could do with a slightly > better algorithm to figure out how many cells to put per row, > but it works for me at the moment. > > I tried to keep the style the same, but let me know if anything > is not right and I'll tidy it up. > > L. > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the business > Choose flexible plans and management services without long-term contracts > Personal 24x7 support from experience hosting pros just a phone call away. > http://p.sf.net/sfu/theplanet-com > _______________________________________________ > tmux-users mailing list > tmux-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/tmux-users ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users