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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users