=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.92 retrieving revision 1.93 diff -c -r1.92 -r1.93 *** src/usr.bin/tmux/window.c 2013/03/24 09:25:04 1.92 --- src/usr.bin/tmux/window.c 2013/03/24 09:57:59 1.93 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.92 2013/03/24 09:25:04 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.93 2013/03/24 09:57:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 319,325 **** w = window_create1(sx, sy); wp = window_add_pane(w, hlimit); ! layout_init(w); if (*cmd != '\0') { prefix = options_get_string(&w->options, "command-prefix"); --- 319,325 ---- w = window_create1(sx, sy); wp = window_add_pane(w, hlimit); ! layout_init(w, wp); if (*cmd != '\0') { prefix = options_get_string(&w->options, "command-prefix"); *************** *** 348,353 **** --- 348,355 ---- { u_int i; + window_unzoom(w); + if (window_index(w, &i) != 0) fatalx("index not found"); ARRAY_SET(&windows, i, NULL); *************** *** 470,475 **** --- 472,525 ---- 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 (w->flags & WINDOW_ZOOMED) + return (-1); + + if (!window_pane_visible(wp)) + return (-1); + if (w->active != wp) + window_set_active_pane(w, wp); + + TAILQ_FOREACH(wp1, &w->panes, entry) { + wp1->saved_layout_cell = wp1->layout_cell; + wp1->layout_cell = NULL; + } + + w->saved_layout_root = w->layout_root; + layout_init(w, wp); + w->flags |= WINDOW_ZOOMED; + + return (0); + } + + int + window_unzoom(struct window *w) + { + struct window_pane *wp, *wp1; + + if (!(w->flags & WINDOW_ZOOMED)) + return (-1); + wp = w->active; + + w->flags &= ~WINDOW_ZOOMED; + layout_free(w); + w->layout_root = w->saved_layout_root; + + TAILQ_FOREACH(wp1, &w->panes, entry) { + wp1->layout_cell = wp1->saved_layout_cell; + wp1->saved_layout_cell = NULL; + } + layout_fix_panes(w, w->sx, w->sy); + + return (0); + } + struct window_pane * window_add_pane(struct window *w, u_int hlimit) { *************** *** 600,605 **** --- 650,657 ---- flags[pos++] = '*'; if (wl == TAILQ_FIRST(&s->lastw)) flags[pos++] = '-'; + if (wl->window->flags & WINDOW_ZOOMED) + flags[pos++] = 'Z'; if (pos == 0) flags[pos++] = ' '; flags[pos] = '\0'; *************** *** 1027,1032 **** --- 1079,1086 ---- { struct window *w = wp->window; + if (wp->layout_cell == NULL) + 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)