aboutsummaryrefslogtreecommitdiff
path: root/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'window.c')
-rw-r--r--window.c77
1 files changed, 72 insertions, 5 deletions
diff --git a/window.c b/window.c
index 254ccc83..242ad48d 100644
--- a/window.c
+++ b/window.c
@@ -306,12 +306,17 @@ window_update_activity(struct window *w)
}
struct window *
-window_create(u_int sx, u_int sy)
+window_create(u_int sx, u_int sy, u_int xpixel, u_int ypixel)
{
struct window *w;
+ if (xpixel == 0)
+ xpixel = DEFAULT_XPIXEL;
+ if (ypixel == 0)
+ ypixel = DEFAULT_YPIXEL;
+
w = xcalloc(1, sizeof *w);
- w->name = NULL;
+ w->name = xstrdup("");
w->flags = 0;
TAILQ_INIT(&w->panes);
@@ -322,6 +327,8 @@ window_create(u_int sx, u_int sy)
w->sx = sx;
w->sy = sy;
+ w->xpixel = xpixel;
+ w->ypixel = ypixel;
w->options = options_create(global_w_options);
@@ -408,11 +415,49 @@ window_set_name(struct window *w, const char *new_name)
}
void
-window_resize(struct window *w, u_int sx, u_int sy)
+window_resize(struct window *w, u_int sx, u_int sy, int xpixel, int ypixel)
{
- log_debug("%s: @%u resize %ux%u", __func__, w->id, sx, sy);
+ if (xpixel == 0)
+ xpixel = DEFAULT_XPIXEL;
+ if (ypixel == 0)
+ ypixel = DEFAULT_YPIXEL;
+
+ log_debug("%s: @%u resize %ux%u (%ux%u)", __func__, w->id, sx, sy,
+ xpixel == -1 ? w->xpixel : xpixel,
+ ypixel == -1 ? w->ypixel : ypixel);
w->sx = sx;
w->sy = sy;
+ if (xpixel != -1)
+ w->xpixel = xpixel;
+ if (ypixel != -1)
+ w->ypixel = ypixel;
+}
+
+void
+window_pane_send_resize(struct window_pane *wp, int yadjust)
+{
+ struct window *w = wp->window;
+ struct winsize ws;
+
+ if (wp->fd == -1)
+ return;
+
+ memset(&ws, 0, sizeof ws);
+ ws.ws_col = wp->sx;
+ ws.ws_row = wp->sy + yadjust;
+ ws.ws_xpixel = w->xpixel * ws.ws_col;
+ ws.ws_ypixel = w->ypixel * ws.ws_row;
+ if (ioctl(wp->fd, TIOCSWINSZ, &ws) == -1)
+#ifdef __sun
+ /*
+ * Some versions of Solaris apparently can return an error when
+ * resizing; don't know why this happens, can't reproduce on
+ * other platforms and ignoring it doesn't seem to cause any
+ * issues.
+ */
+ if (errno != EINVAL && errno != ENXIO)
+#endif
+ fatal("ioctl failed");
}
int
@@ -585,6 +630,28 @@ window_unzoom(struct window *w)
return (0);
}
+int
+window_push_zoom(struct window *w, int flag)
+{
+ log_debug("%s: @%u %d", __func__, w->id,
+ flag && (w->flags & WINDOW_ZOOMED));
+ if (flag && (w->flags & WINDOW_ZOOMED))
+ w->flags |= WINDOW_WASZOOMED;
+ else
+ w->flags &= ~WINDOW_WASZOOMED;
+ return (window_unzoom(w) == 0);
+}
+
+int
+window_pop_zoom(struct window *w)
+{
+ log_debug("%s: @%u %d", __func__, w->id,
+ !!(w->flags & WINDOW_WASZOOMED));
+ if (w->flags & WINDOW_WASZOOMED)
+ return (window_zoom(w->active) == 0);
+ return (0);
+}
+
struct window_pane *
window_add_pane(struct window *w, struct window_pane *other, u_int hlimit,
int flags)
@@ -932,7 +999,7 @@ window_pane_resize(struct window_pane *wp, u_int sx, u_int sy)
if (wme != NULL && wme->mode->resize != NULL)
wme->mode->resize(wme, sx, sy);
- wp->flags |= PANE_RESIZE;
+ wp->flags |= (PANE_RESIZE|PANE_RESIZED);
}
/*