This may be unrelated, can you reproduce this by having a small terminal in tmux with 1 pane and then resizing the terminal instead of zooming?
On Fri, Feb 22, 2013 at 09:45:48AM -0800, Aaron Jensen wrote: > I'm not getting the bleed through, but the resize causes some problems > with rendering the prompt, it plops part of my fairly long prompt on top > of where i should be typing when i zoom > > [1]http://dl.dropbox.com/u/113468811/Screenshots/nafczt3h0xb_.png > > On Fri, Feb 22, 2013 at 9:29 AM, Nicholas Marriott > <[2]nicholas.marri...@gmail.com> wrote: > > Try this instead please which should fix that: > diff --git a/cmd-break-pane.c b/cmd-break-pane.c > index a4350fe..4f329e5 100644 > --- a/cmd-break-pane.c > +++ b/cmd-break-pane.c > @@ -63,6 +63,8 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > * * * * } > > * * * * w = wl->window; > + * * * server_unzoom_window(w); > + > * * * * TAILQ_REMOVE(&w->panes, wp, entry); > * * * * if (wp == w->active) { > * * * * * * * * w->active = w->last; > diff --git a/cmd-join-pane.c b/cmd-join-pane.c > index a2e7a2d..41b532c 100644 > --- a/cmd-join-pane.c > +++ b/cmd-join-pane.c > @@ -91,11 +91,13 @@ join_pane(struct cmd *self, struct cmd_ctx *ctx, int > not_same_window) > * * * * * * * * return (CMD_RETURN_ERROR); > * * * * dst_w = dst_wl->window; > * * * * dst_idx = dst_wl->idx; > + * * * server_unzoom_window(dst_w); > > * * * * src_wl = cmd_find_pane(ctx, args_get(args, 's'), NULL, &src_wp); > * * * * if (src_wl == NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > * * * * src_w = src_wl->window; > + * * * server_unzoom_window(src_w); > > * * * * if (not_same_window && src_w == dst_w) { > * * * * * * * * ctx->error(ctx, "can't join a pane to its own window"); > diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c > index 4f7af2e..f0a17ad 100644 > --- a/cmd-kill-pane.c > +++ b/cmd-kill-pane.c > @@ -47,6 +47,7 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > > * * * * if ((wl = cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp)) == > NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > + * * * server_unzoom_window(wl->window); > > * * * * if (window_count_panes(wl->window) == 1) { > * * * * * * * * /* Only one pane, kill the window. */ > diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c > index 328e1b4..b056b8f 100644 > --- a/cmd-resize-pane.c > +++ b/cmd-resize-pane.c > @@ -31,8 +31,8 @@ enum cmd_retval * * * *cmd_resize_pane_exec(struct cmd > *, struct cmd_ctx *); > > *const struct cmd_entry cmd_resize_pane_entry = { > * * * * "resize-pane", "resizep", > - * * * "DLRt:Ux:y:", 0, 1, > - * * * "[-DLRU] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " > [adjustment]", > + * * * "DLRt:Ux:y:Z", 0, 1, > + * * * "[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " > [adjustment]", > * * * * 0, > * * * * cmd_resize_pane_key_binding, > * * * * NULL, > @@ -75,6 +75,10 @@ cmd_resize_pane_key_binding(struct cmd *self, int > key) > * * * * * * * * self->args = args_create(1, "5"); > * * * * * * * * args_set(self->args, 'R', NULL); > * * * * * * * * break; > + * * * case 'z': > + * * * * * * * self->args = args_create(0); > + * * * * * * * args_set(self->args, 'Z', NULL); > + * * * * * * * break; > * * * * default: > * * * * * * * * self->args = args_create(0); > * * * * * * * * break; > @@ -86,6 +90,7 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > *{ > * * * * struct args * * * * * * *args = self->args; > * * * * struct winlink * * * * **wl; > + * * * struct window * * * * * *w; > * * * * const char * * * * * * **errstr; > * * * * char * * * * * * * * * **cause; > * * * * struct window_pane * * **wp; > @@ -94,6 +99,18 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > > * * * * if ((wl = cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp)) == > NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > + * * * w = wl->window; > + > + * * * if (args_has(args, 'Z')) { > + * * * * * * * if (TAILQ_EMPTY(&w->saved_panes)) > + * * * * * * * * * * * window_zoom(wp); > + * * * * * * * else > + * * * * * * * * * * * window_unzoom(w); > + * * * * * * * server_redraw_window(w); > + * * * * * * * server_status_window(w); > + * * * * * * * return (CMD_RETURN_NORMAL); > + * * * } > + * * * server_unzoom_window(w); > > * * * * if (args->argc == 0) > * * * * * * * * adjust = 1; > diff --git a/cmd-select-layout.c b/cmd-select-layout.c > index b2423e9..7e7e35e 100644 > --- a/cmd-select-layout.c > +++ b/cmd-select-layout.c > @@ -92,6 +92,7 @@ cmd_select_layout_exec(struct cmd *self, struct > cmd_ctx *ctx) > > * * * * if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == > NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > + * * * server_unzoom_window(wl->window); > > * * * * next = self->entry == &cmd_next_layout_entry; > * * * * if (args_has(self->args, 'n')) > diff --git a/cmd-select-pane.c b/cmd-select-pane.c > index 8ebae5f..71882e4 100644 > --- a/cmd-select-pane.c > +++ b/cmd-select-pane.c > @@ -94,6 +94,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > * * * * * * * * ctx->error(ctx, "pane not visible"); > * * * * * * * * return (CMD_RETURN_ERROR); > * * * * } > + * * * server_unzoom_window(wp->window); > > * * * * if (args_has(self->args, 'L')) > * * * * * * * * wp = window_pane_find_left(wp); > diff --git a/cmd-split-window.c b/cmd-split-window.c > index cac8095..a21ff77 100644 > --- a/cmd-split-window.c > +++ b/cmd-split-window.c > @@ -72,6 +72,7 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx > *ctx) > * * * * if ((wl = cmd_find_pane(ctx, args_get(args, 't'), &s, &wp)) == > NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > * * * * w = wl->window; > + * * * server_unzoom_window(w); > > * * * * environ_init(&env); > * * * * environ_copy(&global_environ, &env); > diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c > index 42fe2fc..cc9e7df 100644 > --- a/cmd-swap-pane.c > +++ b/cmd-swap-pane.c > @@ -63,6 +63,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > * * * * if (dst_wl == NULL) > * * * * * * * * return (CMD_RETURN_ERROR); > * * * * dst_w = dst_wl->window; > + * * * server_unzoom_window(dst_w); > > * * * * if (!args_has(args, 's')) { > * * * * * * * * src_w = dst_w; > @@ -82,6 +83,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx > *ctx) > * * * * * * * * * * * * return (CMD_RETURN_ERROR); > * * * * * * * * src_w = src_wl->window; > * * * * } > + * * * server_unzoom_window(src_w); > > * * * * if (src_wp == dst_wp) > * * * * * * * * return (CMD_RETURN_NORMAL); > diff --git a/key-bindings.c b/key-bindings.c > index 9e5a729..bf9ff31 100644 > --- a/key-bindings.c > +++ b/key-bindings.c > @@ -150,6 +150,7 @@ key_bindings_init(void) > * * * * * * * * { 't', * * * * * * * * * *0, &cmd_clock_mode_entry }, > * * * * * * * * { 'w', * * * * * * * * * *0, &cmd_choose_window_entry }, > * * * * * * * * { 'x', * * * * * * * * * *0, &cmd_confirm_before_entry > }, > + * * * * * * * { 'z', * * * * * * * * * *0, &cmd_resize_pane_entry }, > * * * * * * * * { '{', * * * * * * * * * *0, &cmd_swap_pane_entry }, > * * * * * * * * { '}', * * * * * * * * * *0, &cmd_swap_pane_entry }, > * * * * * * * * { '~', * * * * * * * * * *0, &cmd_show_messages_entry }, > diff --git a/server-fn.c b/server-fn.c > index 26f93d9..f17c3b1 100644 > --- a/server-fn.c > +++ b/server-fn.c > @@ -377,6 +377,7 @@ server_destroy_pane(struct window_pane *wp) > * * * * * * * * return; > * * * * } > > + * * * server_unzoom_window(w); > * * * * layout_close_pane(wp); > * * * * window_remove_pane(w, wp); > > @@ -588,3 +589,11 @@ server_set_stdin_callback(struct client *c, void > (*cb)(struct client *, int, > > * * * * return (0); > *} > + > +void > +server_unzoom_window(struct window *w) > +{ > + * * * window_unzoom(w); > + * * * server_redraw_window(w); > + * * * server_status_window(w); > +} > diff --git a/tmux.1 b/tmux.1 > index 8731efb..2f85a35 100644 > --- a/tmux.1 > +++ b/tmux.1 > @@ -1572,7 +1572,7 @@ Rename the current window, or the window at > *if specified, to > *.Ar new-name . > *.It Xo Ic resize-pane > -.Op Fl DLRU > +.Op Fl DLRUZ > *.Op Fl t Ar target-pane > *.Op Fl x Ar width > *.Op Fl y Ar height > @@ -1596,6 +1596,11 @@ or > *The > *.Ar adjustment > *is given in lines or cells (the default is 1). > +.Pp > +With > +.Fl Z , > +the active pane is toggled between occupying the whole of the window > and it's > +normal position in the layout. > *.It Xo Ic respawn-pane > *.Op Fl k > *.Op Fl t Ar target-pane > diff --git a/tmux.h b/tmux.h > index 8c06197..4d01a72 100644 > --- a/tmux.h > +++ b/tmux.h > @@ -928,6 +928,7 @@ struct window_pane { > *#define PANE_REDRAW 0x1 > *#define PANE_DROP 0x2 > *#define PANE_FOCUSED 0x4 > +#define PANE_HIDDEN 0x8 > > * * * * char * * * * * **cmd; > * * * * char * * * * * **shell; > @@ -978,6 +979,12 @@ struct window { > * * * * struct window_pane *last; > * * * * struct window_panes panes; > > + * * * struct window_pane *saved_before; > + * * * struct window_pane *saved_last; > + * * * struct window_panes saved_panes; > + * * * struct layout_cell *saved_layout; > + * * * struct layout_cell *saved_cell; > + > * * * * int * * * * * * *lastlayout; > * * * * struct layout_cell *layout_root; > > @@ -1910,6 +1917,7 @@ void * * * server_push_stdout(struct client *); > *void * *server_push_stderr(struct client *); > *int * * server_set_stdin_callback(struct client *, void (*)(struct > client *, > * * * * * * *int, void *), void *, char **); > +void * *server_unzoom_window(struct window *); > > */* status.c */ > *int * * status_out_cmp(struct status_out *, struct status_out *); > @@ -2113,6 +2121,8 @@ struct window_pane *window_find_string(struct > window *, const char *); > *void * * * * * *window_set_active_pane(struct window *, struct > window_pane *); > *struct window_pane *window_add_pane(struct window *, u_int); > *void * * * * * *window_resize(struct window *, u_int, u_int); > +int * * * * * * window_zoom(struct window_pane *); > +int * * * * * * window_unzoom(struct window *); > *void * * * * * *window_remove_pane(struct window *, struct window_pane > *); > *struct window_pane *window_pane_at_index(struct window *, u_int); > *struct window_pane *window_pane_next_by_number(struct window *, > diff --git a/window.c b/window.c > index 77f06f8..2170b07 100644 > --- a/window.c > +++ b/window.c > @@ -278,6 +278,7 @@ window_create1(u_int sx, u_int sy) > * * * * w->name = NULL; > * * * * w->flags = 0; > > + * * * TAILQ_INIT(&w->saved_panes); > * * * * TAILQ_INIT(&w->panes); > * * * * w->active = NULL; > > @@ -333,6 +334,8 @@ window_destroy(struct window *w) > *{ > * * * * u_int * i; > > + * * * window_unzoom(w); > + > * * * * if (window_index(w, &i) != 0) > * * * * * * * * fatalx("index not found"); > * * * * ARRAY_SET(&windows, i, NULL); > @@ -455,6 +458,75 @@ window_find_string(struct window *w, const char *s) > * * * * return (window_get_active_at(w, x, y)); > *} > > +int > +window_zoom(struct window_pane *wp) > +{ > + * * * struct window * * * * * *w = wp->window; > + * * * struct window_pane * * **wp1; > + > + * * * if (!TAILQ_EMPTY(&w->saved_panes)) > + * * * * * * * return (-1); > + > + * * * if (!window_pane_visible(wp)) > + * * * * * * * return (-1); > + * * * if (w->active != wp) > + * * * * * * * window_set_active_pane(w, wp); > + > + * * * w->saved_before = TAILQ_NEXT(wp, entry); > + * * * TAILQ_REMOVE(&w->panes, wp, entry); > + > + * * * w->saved_last = w->last; > + * * * w->last = NULL; > + > + * * * memcpy(&w->saved_panes, &w->panes, sizeof w->saved_panes); > + * * * TAILQ_INIT(&w->panes); > + * * * TAILQ_INSERT_HEAD(&w->panes, wp, entry); > + > + * * * TAILQ_FOREACH(wp1, &w->saved_panes, entry) { > + * * * * * * * wp1->flags |= PANE_HIDDEN; > + * * * * * * * RB_REMOVE(window_pane_tree, &all_window_panes, wp1); > + * * * } > + > + * * * w->saved_cell = wp->layout_cell; > + * * * w->saved_layout = w->layout_root; > + * * * layout_init(w); > + > + * * * return (0); > +} > + > +int > +window_unzoom(struct window *w) > +{ > + * * * struct window_pane * * **wp, *wp1; > + > + * * * if (TAILQ_EMPTY(&w->saved_panes)) > + * * * * * * * return (-1); > + * * * wp = w->active; > + > + * * * TAILQ_FOREACH(wp1, &w->saved_panes, entry) { > + * * * * * * * wp1->flags &= ~PANE_HIDDEN; > + * * * * * * * RB_INSERT(window_pane_tree, &all_window_panes, wp1); > + * * * } > + > + * * * TAILQ_REMOVE(&w->panes, wp, entry); > + * * * memcpy(&w->panes, &w->saved_panes, sizeof w->panes); > + * * * TAILQ_INIT(&w->saved_panes); > + > + * * * if (w->saved_before == NULL) > + * * * * * * * TAILQ_INSERT_TAIL(&w->panes, wp, entry); > + * * * else > + * * * * * * * TAILQ_INSERT_BEFORE(w->saved_before, wp, entry); > + > + * * * w->last = w->saved_last; > + > + * * * layout_free(w); > + * * * wp->layout_cell = w->saved_cell; > + * * * w->layout_root = w->saved_layout; > + * * * layout_fix_panes(w, w->sx, w->sy); > + > + * * * return (0); > +} > + > *struct window_pane * > *window_add_pane(struct window *w, u_int hlimit) > *{ > @@ -585,6 +657,8 @@ window_printable_flags(struct session *s, struct > winlink *wl) > * * * * * * * * flags[pos++] = '*'; > * * * * if (wl == TAILQ_FIRST(&s->lastw)) > * * * * * * * * flags[pos++] = '-'; > + * * * if (!TAILQ_EMPTY(&wl->window->saved_panes)) > + * * * * * * * flags[pos++] = 'Z'; > * * * * if (pos == 0) > * * * * * * * * flags[pos++] = ' '; > * * * * flags[pos] = '\0'; > @@ -1032,6 +1106,8 @@ window_pane_visible(struct window_pane *wp) > *{ > * * * * struct window * *w = wp->window; > > + * * * if (wp->flags & PANE_HIDDEN) > + * * * * * * * return (0); > * * * * if (wp->xoff >= w->sx || wp->yoff >= w->sy) > * * * * * * * * return (0); > * * * * if (wp->xoff + wp->sx > w->sx || wp->yoff + wp->sy > w->sy) > > On Fri, Feb 22, 2013 at 09:16:36AM -0800, Aaron Jensen wrote: > > * *I may have misunderstood what this is intending to do, but I'm > seeing pane > > * *updates even though the panes are "hidden". In other words, my > zoom'd pane > > * *is getting overwritten when the other panes change. Is that > intended? > > > > * *On Fri, Feb 22, 2013 at 9:10 AM, Aaron Jensen > <[1][3]aaronjen...@gmail.com> > > * *wrote: > > > > * * *I'm trying it today too. So far so good. Also, I was able to > apply your > > * * *patch :) > > > > * * *On Fri, Feb 22, 2013 at 8:21 AM, Nicholas Marriott > > * * *<[2][4]nicholas.marri...@gmail.com> wrote: > > > > * * * *not convinced about the way it works, need to think about it. > also it > > * * * *needs testing > > > > * * * *On Fri, Feb 22, 2013 at 01:10:09PM -0300, Thiago Padilha wrote: > > * * * *> On Fri, Feb 22, 2013 at 12:57 PM, Nicholas Marriott > > * * * *> <[3][5]nicholas.marri...@gmail.com> wrote: > > * * * *> > Here is the latest in case anyone wants to run with it for > a while > > * * * *> > before I decide whether or not to commit it :-). > > * * * *> > > > * * * *> > > * * * *> What's wrong with it? > > > > * * * > > *------------------------------------------------------------------------------ > > * * * *Everyone hates slow websites. So do we. > > * * * *Make your web apps faster with AppDynamics > > * * * *Download AppDynamics Lite for free today: > > * * * *[4][6]http://p.sf.net/sfu/appdyn_d2d_feb > > * * * *_______________________________________________ > > * * * *tmux-users mailing list > > * * * *[5][7]tmux-users@lists.sourceforge.net > > * * * *[6][8]https://lists.sourceforge.net/lists/listinfo/tmux-users > > > > References > > > > * *Visible links > > * *1. mailto:[9]aaronjen...@gmail.com > > * *2. mailto:[10]nicholas.marri...@gmail.com > > * *3. mailto:[11]nicholas.marri...@gmail.com > > * *4. [12]http://p.sf.net/sfu/appdyn_d2d_feb > > * *5. mailto:[13]tmux-users@lists.sourceforge.net > > * *6. [14]https://lists.sourceforge.net/lists/listinfo/tmux-users > > References > > Visible links > 1. http://dl.dropbox.com/u/113468811/Screenshots/nafczt3h0xb_.png > 2. mailto:nicholas.marri...@gmail.com > 3. mailto:aaronjen...@gmail.com > 4. mailto:nicholas.marri...@gmail.com > 5. mailto:nicholas.marri...@gmail.com > 6. http://p.sf.net/sfu/appdyn_d2d_feb > 7. mailto:tmux-users@lists.sourceforge.net > 8. https://lists.sourceforge.net/lists/listinfo/tmux-users > 9. mailto:aaronjen...@gmail.com > 10. mailto:nicholas.marri...@gmail.com > 11. mailto:nicholas.marri...@gmail.com > 12. http://p.sf.net/sfu/appdyn_d2d_feb > 13. mailto:tmux-users@lists.sourceforge.net > 14. https://lists.sourceforge.net/lists/listinfo/tmux-users ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users