mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:17:31 +00:00 
			
		
		
		
	New window options: force-width and force-height. This will force a window to
an arbitrary width and height (0 for the default unlimited). This is neat for emacs which doesn't have a sensible way to force hard wrapping at 80 columns. Also, don't try to be clever and use clr_eol when redrawing the whole screen, it causes trouble since the redraw functions are used to draw the blank areas too.
This commit is contained in:
		
							
								
								
									
										10
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								CHANGES
									
									
									
									
									
								
							@@ -1,5 +1,13 @@
 | 
			
		||||
14 June 2008
 | 
			
		||||
 | 
			
		||||
* New window options: force-width and force-height. This will force a window
 | 
			
		||||
  to an arbitrary width and height (0 for the default unlimited). This is
 | 
			
		||||
  neat for emacs which doesn't have a sensible way to force hard wrapping at 80
 | 
			
		||||
  columns. Also, don't try to be clever and use clr_eol when redrawing the
 | 
			
		||||
  whole screen, it causes trouble since the redraw functions are used to draw
 | 
			
		||||
  the blank areas too.
 | 
			
		||||
* Clear the blank area below windows properly when they are smaller than client,
 | 
			
		||||
  also add an indicator line to show the vertical limit.
 | 
			
		||||
* Don't die on empty strings in config file, reported by Will Maier.
 | 
			
		||||
 | 
			
		||||
08 June 2008
 | 
			
		||||
@@ -464,4 +472,4 @@
 | 
			
		||||
  (including mutt, emacs). No status bar yet and no key remapping or other
 | 
			
		||||
  customisation.
 | 
			
		||||
 | 
			
		||||
$Id: CHANGES,v 1.118 2008-06-14 08:11:16 nicm Exp $
 | 
			
		||||
$Id: CHANGES,v 1.119 2008-06-14 16:47:20 nicm Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								TODO
									
									
									
									
									
								
							@@ -75,4 +75,7 @@
 | 
			
		||||
- test and fix wsvt25
 | 
			
		||||
- activity/bell should be per-window not per-link? what if it is cur win in
 | 
			
		||||
  session not being watched?
 | 
			
		||||
- empty strings in config causes crash (lt_kije)
 | 
			
		||||
- man page:
 | 
			
		||||
      set-window-option
 | 
			
		||||
      explanation of -t format
 | 
			
		||||
      config file
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: cmd-set-window-option.c,v 1.6 2008-06-06 20:02:27 nicm Exp $ */
 | 
			
		||||
/* $Id: cmd-set-window-option.c,v 1.7 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -166,6 +166,34 @@ cmd_set_window_option_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		recalculate_sizes();
 | 
			
		||||
	} else if (strcmp(data->option, "force-width") == 0) {
 | 
			
		||||
		if (data->value == NULL || number == -1) {
 | 
			
		||||
			ctx->error(ctx, "invalid value");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (errstr != NULL) {
 | 
			
		||||
			ctx->error(ctx, "force-width %s", errstr);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (number == 0)
 | 
			
		||||
			wl->window->limitx = UINT_MAX;
 | 
			
		||||
		else
 | 
			
		||||
			wl->window->limitx = number;
 | 
			
		||||
		recalculate_sizes();
 | 
			
		||||
	} else if (strcmp(data->option, "force-height") == 0) {
 | 
			
		||||
		if (data->value == NULL || number == -1) {
 | 
			
		||||
			ctx->error(ctx, "invalid value");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (errstr != NULL) {
 | 
			
		||||
			ctx->error(ctx, "force-height %s", errstr);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (number == 0)
 | 
			
		||||
			wl->window->limity = UINT_MAX;
 | 
			
		||||
		else
 | 
			
		||||
			wl->window->limity = number;
 | 
			
		||||
		recalculate_sizes();
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx->error(ctx, "unknown option: %s", data->option);
 | 
			
		||||
		return;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								resize.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								resize.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: resize.c,v 1.14 2008-06-14 12:05:06 nicm Exp $ */
 | 
			
		||||
/* $Id: resize.c,v 1.15 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -114,6 +114,11 @@ recalculate_sizes(void)
 | 
			
		||||
		}
 | 
			
		||||
		w->flags &= ~WINDOW_HIDDEN;
 | 
			
		||||
 | 
			
		||||
		if (ssx > w->limitx)
 | 
			
		||||
			ssx = w->limitx;
 | 
			
		||||
		if (ssy > w->limity)
 | 
			
		||||
			ssy = w->limity;
 | 
			
		||||
 | 
			
		||||
		if (screen_size_x(&w->base) == ssx &&
 | 
			
		||||
		    screen_size_y(&w->base) == ssy)
 | 
			
		||||
			continue;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: screen-redraw.c,v 1.5 2008-06-14 12:05:06 nicm Exp $ */
 | 
			
		||||
/* $Id: screen-redraw.c,v 1.6 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -181,19 +181,12 @@ screen_redraw_area(
 | 
			
		||||
void
 | 
			
		||||
screen_redraw_lines(struct screen_redraw_ctx *ctx, u_int py, u_int ny)
 | 
			
		||||
{
 | 
			
		||||
	u_int	i, cx, sx;
 | 
			
		||||
 | 
			
		||||
	sx = screen_size_x(ctx->s);
 | 
			
		||||
	for (i = py; i < py + ny; i++) {
 | 
			
		||||
		cx = ctx->s->grid_size[screen_y(ctx->s, i)];
 | 
			
		||||
		if (ctx->s->sel.flag || sx < 5 || cx >= sx - 5) {
 | 
			
		||||
			screen_redraw_area(ctx, 0, i, screen_size_x(ctx->s), 1);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		screen_redraw_area(ctx, 0, i, cx, 1);
 | 
			
		||||
		screen_redraw_move_cursor(ctx, cx, i);
 | 
			
		||||
		screen_redraw_set_attributes(
 | 
			
		||||
		    ctx, SCREEN_DEFATTR, SCREEN_DEFCOLR);
 | 
			
		||||
		ctx->write(ctx->data, TTY_CLEARENDOFLINE);
 | 
			
		||||
	}
 | 
			
		||||
	screen_redraw_area(ctx, 0, py, screen_size_x(ctx->s), py + ny);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Draw set of columns. */
 | 
			
		||||
void
 | 
			
		||||
screen_redraw_columns(struct screen_redraw_ctx *ctx, u_int px, u_int nx)
 | 
			
		||||
{
 | 
			
		||||
	screen_redraw_area(ctx, px, 0, px + nx, screen_size_y(ctx->s));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: server-fn.c,v 1.40 2008-06-07 07:13:08 nicm Exp $ */
 | 
			
		||||
/* $Id: server-fn.c,v 1.41 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -183,6 +183,6 @@ server_write_message(struct client *c, const char *fmt, ...)
 | 
			
		||||
		screen_redraw_stop(&ctx);
 | 
			
		||||
	} else {
 | 
			
		||||
		screen_redraw_stop(&ctx);
 | 
			
		||||
		status_write_client(c);
 | 
			
		||||
		server_status_client(c);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								server.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: server.c,v 1.62 2008-06-14 12:05:06 nicm Exp $ */
 | 
			
		||||
/* $Id: server.c,v 1.63 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -312,31 +312,34 @@ server_check_redraw(struct client *c)
 | 
			
		||||
	if (c->flags & CLIENT_REDRAW) {
 | 
			
		||||
		sx = screen_size_x(c->session->curw->window->screen);
 | 
			
		||||
		sy = screen_size_y(c->session->curw->window->screen);
 | 
			
		||||
		if (sy < yy) {
 | 
			
		||||
		if (sx < xx || sy < yy) {
 | 
			
		||||
			/*
 | 
			
		||||
			 * Fake up a blank(ish) screen and use it. NOTE: because
 | 
			
		||||
			 * this uses tty_write_client but doesn't write the
 | 
			
		||||
			 * client's screen, this can't use anything which
 | 
			
		||||
			 * relies on cursor position. This is icky and might
 | 
			
		||||
			 * break if we try to optimise redrawing later :-/.
 | 
			
		||||
			 * Fake up a blank(ish) screen and use it to draw the 
 | 
			
		||||
			 * empty regions. NOTE: because this uses
 | 
			
		||||
			 * tty_write_client but doesn't write the client's
 | 
			
		||||
			 * screen, this can't use anything which relies on
 | 
			
		||||
			 * cursor position.
 | 
			
		||||
			 */
 | 
			
		||||
			screen_create(&screen, xx, yy, 0);
 | 
			
		||||
			screen_fill_area(&screen, 0, 0, xx, yy, ' ', 0, 0x70);
 | 
			
		||||
			screen_fill_area(&screen, 0, sy, sx, 1, '-', 0, 0x70);
 | 
			
		||||
 | 
			
		||||
			screen_redraw_start(&ctx, &screen, tty_write_client, c);
 | 
			
		||||
			screen_redraw_lines(&ctx, sy, yy - sy);
 | 
			
		||||
			if (sx < xx)
 | 
			
		||||
				screen_redraw_columns(&ctx, sx, xx - sx);
 | 
			
		||||
			if (sy < yy)  {
 | 
			
		||||
				screen_fill_area(&screen, 
 | 
			
		||||
				    0, sy, xx, 1, '-', 0, 0x70);
 | 
			
		||||
				screen_redraw_lines(&ctx, sy, yy - sy);
 | 
			
		||||
			}
 | 
			
		||||
			screen_redraw_stop(&ctx);
 | 
			
		||||
 | 
			
		||||
			screen_destroy(&screen);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		screen_redraw_start_client(&ctx, c);
 | 
			
		||||
		screen_redraw_lines(&ctx, 0, screen_size_y(ctx.s));
 | 
			
		||||
		screen_redraw_stop(&ctx);
 | 
			
		||||
		status_write_client(c);	
 | 
			
		||||
 | 
			
		||||
		status_redraw(c);
 | 
			
		||||
	} else if (c->flags & CLIENT_STATUS)
 | 
			
		||||
		status_write_client(c);	
 | 
			
		||||
		status_redraw(c);
 | 
			
		||||
 | 
			
		||||
	c->flags &= ~(CLIENT_CLEAR|CLIENT_REDRAW|CLIENT_STATUS);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								status.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: status.c,v 1.24 2008-06-07 07:27:28 nicm Exp $ */
 | 
			
		||||
/* $Id: status.c,v 1.25 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -24,18 +24,17 @@
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
void printflike3 status_print(struct buffer *, size_t *, const char *, ...);
 | 
			
		||||
 | 
			
		||||
/* Draw status for client on the last lines of given context. */
 | 
			
		||||
void
 | 
			
		||||
status_write_client(struct client *c)
 | 
			
		||||
status_redraw(struct client *c)
 | 
			
		||||
{
 | 
			
		||||
	struct screen_redraw_ctx	ctx;
 | 
			
		||||
	struct winlink	       	       *wl;
 | 
			
		||||
	char				flag, *left, *right;
 | 
			
		||||
	char			        lbuf[BUFSIZ], rbuf[BUFSIZ];
 | 
			
		||||
	struct winlink		       *wl;
 | 
			
		||||
	char		 		flag, *left, *right;
 | 
			
		||||
	char				lbuf[BUFSIZ], rbuf[BUFSIZ];
 | 
			
		||||
	size_t				llen, rlen;
 | 
			
		||||
	u_char				scolour;
 | 
			
		||||
	u_int				slines;
 | 
			
		||||
	u_char		 		scolour;
 | 
			
		||||
	u_int		 		slines;
 | 
			
		||||
 | 
			
		||||
	scolour = options_get_number(&c->session->options, "status-colour");
 | 
			
		||||
	slines = options_get_number(&c->session->options, "status-lines");
 | 
			
		||||
@@ -78,10 +77,10 @@ status_write_client(struct client *c)
 | 
			
		||||
			screen_redraw_set_attributes(&ctx, 0, scolour);
 | 
			
		||||
		screen_redraw_write_string(&ctx, " ");
 | 
			
		||||
		
 | 
			
		||||
		if (ctx.s->cx > screen_size_x(ctx.s) - rlen)
 | 
			
		||||
		if (ctx.s->cx > c->sx - rlen)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	while (ctx.s->cx < screen_size_x(ctx.s) - rlen) {
 | 
			
		||||
	while (ctx.s->cx < c->sx - rlen) {
 | 
			
		||||
		ctx.write(ctx.data, TTY_CHARACTER, ' ');
 | 
			
		||||
		ctx.s->cx++;
 | 
			
		||||
	}
 | 
			
		||||
@@ -89,46 +88,8 @@ status_write_client(struct client *c)
 | 
			
		||||
	screen_redraw_move_cursor(&ctx, 0, c->sy - slines);
 | 
			
		||||
	screen_redraw_write_string(&ctx, "%s ", lbuf);
 | 
			
		||||
 | 
			
		||||
	screen_redraw_move_cursor(
 | 
			
		||||
	    &ctx, screen_size_x(ctx.s) - rlen, c->sy - slines);
 | 
			
		||||
	screen_redraw_move_cursor(&ctx, c->sx - rlen, c->sy - slines);
 | 
			
		||||
	screen_redraw_write_string(&ctx, " %s", rbuf);
 | 
			
		||||
 | 
			
		||||
	screen_redraw_stop(&ctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
status_write_window(struct window *w)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	if (w->flags & WINDOW_HIDDEN)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
		c = ARRAY_ITEM(&clients, i);
 | 
			
		||||
		if (c == NULL || c->session == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (c->session->curw->window != w)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		status_write_client(c);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
status_write_session(struct session *s)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	if (s->flags & SESSION_UNATTACHED)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
		c = ARRAY_ITEM(&clients, i);
 | 
			
		||||
		if (c == NULL || c->session != s)
 | 
			
		||||
			continue;
 | 
			
		||||
		status_write_client(c);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tmux.h,v 1.140 2008-06-14 12:05:06 nicm Exp $ */
 | 
			
		||||
/* $Id: tmux.h,v 1.141 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -529,6 +529,9 @@ struct window {
 | 
			
		||||
#define WINDOW_MONITOR 0x8
 | 
			
		||||
#define WINDOW_AGGRESSIVE 0x10
 | 
			
		||||
 | 
			
		||||
	u_int		 limitx;
 | 
			
		||||
	u_int		 limity;
 | 
			
		||||
 | 
			
		||||
	struct screen	*screen;
 | 
			
		||||
	struct screen	 base;
 | 
			
		||||
 | 
			
		||||
@@ -918,9 +921,7 @@ void	 server_status_window(struct window *);
 | 
			
		||||
void printflike2 server_write_message(struct client *, const char *, ...);
 | 
			
		||||
 | 
			
		||||
/* status.c */
 | 
			
		||||
void	 status_write_client(struct client *);
 | 
			
		||||
void	 status_write_session(struct session *);
 | 
			
		||||
void	 status_write_window(struct window *);
 | 
			
		||||
void	 status_redraw(struct client *c);
 | 
			
		||||
 | 
			
		||||
/* resize.c */
 | 
			
		||||
void	 recalculate_sizes(void);
 | 
			
		||||
@@ -1005,6 +1006,7 @@ void	screen_redraw_cell(struct screen_redraw_ctx *, u_int, u_int);
 | 
			
		||||
void	screen_redraw_area(
 | 
			
		||||
    	    struct screen_redraw_ctx *, u_int, u_int, u_int, u_int);
 | 
			
		||||
void	screen_redraw_lines(struct screen_redraw_ctx *, u_int, u_int);
 | 
			
		||||
void	screen_redraw_columns(struct screen_redraw_ctx *, u_int, u_int);
 | 
			
		||||
 | 
			
		||||
/* screen.c */
 | 
			
		||||
const char *screen_colourstring(u_char);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								window.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: window.c,v 1.40 2008-06-04 20:17:25 nicm Exp $ */
 | 
			
		||||
/* $Id: window.c,v 1.41 2008-06-14 16:47:20 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -202,6 +202,7 @@ window_create(const char *name,
 | 
			
		||||
	w->out = buffer_create(BUFSIZ);
 | 
			
		||||
	w->mode = NULL;
 | 
			
		||||
	w->flags = 0;
 | 
			
		||||
	w->limitx = w->limity = UINT_MAX;
 | 
			
		||||
	screen_create(&w->base, sx, sy, hlimit);
 | 
			
		||||
	w->screen = &w->base;
 | 
			
		||||
	input_init(w);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user