xref: /minix3/external/bsd/tmux/dist/grid-view.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek 
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
5eda6f593SDavid van Moolenbroek  *
6eda6f593SDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek  *
10eda6f593SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek  */
18eda6f593SDavid van Moolenbroek 
19eda6f593SDavid van Moolenbroek #include <sys/types.h>
20eda6f593SDavid van Moolenbroek 
21eda6f593SDavid van Moolenbroek #include <string.h>
22eda6f593SDavid van Moolenbroek 
23eda6f593SDavid van Moolenbroek #include "tmux.h"
24eda6f593SDavid van Moolenbroek 
25eda6f593SDavid van Moolenbroek /*
26eda6f593SDavid van Moolenbroek  * Grid view functions. These work using coordinates relative to the visible
27eda6f593SDavid van Moolenbroek  * screen area.
28eda6f593SDavid van Moolenbroek  */
29eda6f593SDavid van Moolenbroek 
30eda6f593SDavid van Moolenbroek #define grid_view_x(gd, x) (x)
31eda6f593SDavid van Moolenbroek #define grid_view_y(gd, y) ((gd)->hsize + (y))
32eda6f593SDavid van Moolenbroek 
33eda6f593SDavid van Moolenbroek /* Get cell for reading. */
34eda6f593SDavid van Moolenbroek const struct grid_cell *
grid_view_peek_cell(struct grid * gd,u_int px,u_int py)35eda6f593SDavid van Moolenbroek grid_view_peek_cell(struct grid *gd, u_int px, u_int py)
36eda6f593SDavid van Moolenbroek {
37eda6f593SDavid van Moolenbroek 	return (grid_peek_cell(gd, grid_view_x(gd, px), grid_view_y(gd, py)));
38eda6f593SDavid van Moolenbroek }
39eda6f593SDavid van Moolenbroek 
40eda6f593SDavid van Moolenbroek /* Get cell for writing. */
41eda6f593SDavid van Moolenbroek struct grid_cell *
grid_view_get_cell(struct grid * gd,u_int px,u_int py)42eda6f593SDavid van Moolenbroek grid_view_get_cell(struct grid *gd, u_int px, u_int py)
43eda6f593SDavid van Moolenbroek {
44eda6f593SDavid van Moolenbroek 	return (grid_get_cell(gd, grid_view_x(gd, px), grid_view_y(gd, py)));
45eda6f593SDavid van Moolenbroek }
46eda6f593SDavid van Moolenbroek 
47eda6f593SDavid van Moolenbroek /* Set cell. */
48eda6f593SDavid van Moolenbroek void
grid_view_set_cell(struct grid * gd,u_int px,u_int py,const struct grid_cell * gc)49eda6f593SDavid van Moolenbroek grid_view_set_cell(
50eda6f593SDavid van Moolenbroek     struct grid *gd, u_int px, u_int py, const struct grid_cell *gc)
51eda6f593SDavid van Moolenbroek {
52eda6f593SDavid van Moolenbroek 	grid_set_cell(gd, grid_view_x(gd, px), grid_view_y(gd, py), gc);
53eda6f593SDavid van Moolenbroek }
54eda6f593SDavid van Moolenbroek 
55eda6f593SDavid van Moolenbroek /* Clear into history. */
56eda6f593SDavid van Moolenbroek void
grid_view_clear_history(struct grid * gd)57eda6f593SDavid van Moolenbroek grid_view_clear_history(struct grid *gd)
58eda6f593SDavid van Moolenbroek {
59eda6f593SDavid van Moolenbroek 	struct grid_line	*gl;
60eda6f593SDavid van Moolenbroek 	u_int			 yy, last;
61eda6f593SDavid van Moolenbroek 
62eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "");
63eda6f593SDavid van Moolenbroek 
64eda6f593SDavid van Moolenbroek 	/* Find the last used line. */
65eda6f593SDavid van Moolenbroek 	last = 0;
66eda6f593SDavid van Moolenbroek 	for (yy = 0; yy < gd->sy; yy++) {
67eda6f593SDavid van Moolenbroek 		gl = &gd->linedata[grid_view_y(gd, yy)];
68*0a6a1f1dSLionel Sambuc 		if (gl->cellsize != 0)
69eda6f593SDavid van Moolenbroek 			last = yy + 1;
70eda6f593SDavid van Moolenbroek 	}
71eda6f593SDavid van Moolenbroek 	if (last == 0)
72eda6f593SDavid van Moolenbroek 		return;
73eda6f593SDavid van Moolenbroek 
74eda6f593SDavid van Moolenbroek 	/* Scroll the lines into the history. */
75*0a6a1f1dSLionel Sambuc 	for (yy = 0; yy < last; yy++) {
76*0a6a1f1dSLionel Sambuc 		grid_collect_history(gd);
77eda6f593SDavid van Moolenbroek 		grid_scroll_history(gd);
78eda6f593SDavid van Moolenbroek 	}
79*0a6a1f1dSLionel Sambuc }
80eda6f593SDavid van Moolenbroek 
81eda6f593SDavid van Moolenbroek /* Clear area. */
82eda6f593SDavid van Moolenbroek void
grid_view_clear(struct grid * gd,u_int px,u_int py,u_int nx,u_int ny)83eda6f593SDavid van Moolenbroek grid_view_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny)
84eda6f593SDavid van Moolenbroek {
85eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "px=%u, py=%u, nx=%u, ny=%u", px, py, nx, ny);
86eda6f593SDavid van Moolenbroek 
87eda6f593SDavid van Moolenbroek 	px = grid_view_x(gd, px);
88eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
89eda6f593SDavid van Moolenbroek 
90eda6f593SDavid van Moolenbroek 	grid_clear(gd, px, py, nx, ny);
91eda6f593SDavid van Moolenbroek }
92eda6f593SDavid van Moolenbroek 
93eda6f593SDavid van Moolenbroek /* Scroll region up. */
94eda6f593SDavid van Moolenbroek void
grid_view_scroll_region_up(struct grid * gd,u_int rupper,u_int rlower)95eda6f593SDavid van Moolenbroek grid_view_scroll_region_up(struct grid *gd, u_int rupper, u_int rlower)
96eda6f593SDavid van Moolenbroek {
97eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "rupper=%u, rlower=%u", rupper, rlower);
98eda6f593SDavid van Moolenbroek 
99eda6f593SDavid van Moolenbroek 	if (gd->flags & GRID_HISTORY) {
100eda6f593SDavid van Moolenbroek 		grid_collect_history(gd);
101eda6f593SDavid van Moolenbroek 		if (rupper == 0 && rlower == gd->sy - 1)
102eda6f593SDavid van Moolenbroek 			grid_scroll_history(gd);
103eda6f593SDavid van Moolenbroek 		else {
104eda6f593SDavid van Moolenbroek 			rupper = grid_view_y(gd, rupper);
105eda6f593SDavid van Moolenbroek 			rlower = grid_view_y(gd, rlower);
106eda6f593SDavid van Moolenbroek 			grid_scroll_history_region(gd, rupper, rlower);
107eda6f593SDavid van Moolenbroek 		}
108eda6f593SDavid van Moolenbroek 	} else {
109eda6f593SDavid van Moolenbroek 		rupper = grid_view_y(gd, rupper);
110eda6f593SDavid van Moolenbroek 		rlower = grid_view_y(gd, rlower);
111eda6f593SDavid van Moolenbroek 		grid_move_lines(gd, rupper, rupper + 1, rlower - rupper);
112eda6f593SDavid van Moolenbroek 	}
113eda6f593SDavid van Moolenbroek }
114eda6f593SDavid van Moolenbroek 
115eda6f593SDavid van Moolenbroek /* Scroll region down. */
116eda6f593SDavid van Moolenbroek void
grid_view_scroll_region_down(struct grid * gd,u_int rupper,u_int rlower)117eda6f593SDavid van Moolenbroek grid_view_scroll_region_down(struct grid *gd, u_int rupper, u_int rlower)
118eda6f593SDavid van Moolenbroek {
119eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "rupper=%u, rlower=%u", rupper, rlower);
120eda6f593SDavid van Moolenbroek 
121eda6f593SDavid van Moolenbroek 	rupper = grid_view_y(gd, rupper);
122eda6f593SDavid van Moolenbroek 	rlower = grid_view_y(gd, rlower);
123eda6f593SDavid van Moolenbroek 
124eda6f593SDavid van Moolenbroek 	grid_move_lines(gd, rupper + 1, rupper, rlower - rupper);
125eda6f593SDavid van Moolenbroek }
126eda6f593SDavid van Moolenbroek 
127eda6f593SDavid van Moolenbroek /* Insert lines. */
128eda6f593SDavid van Moolenbroek void
grid_view_insert_lines(struct grid * gd,u_int py,u_int ny)129eda6f593SDavid van Moolenbroek grid_view_insert_lines(struct grid *gd, u_int py, u_int ny)
130eda6f593SDavid van Moolenbroek {
131eda6f593SDavid van Moolenbroek 	u_int	sy;
132eda6f593SDavid van Moolenbroek 
133eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "py=%u, ny=%u", py, ny);
134eda6f593SDavid van Moolenbroek 
135eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
136eda6f593SDavid van Moolenbroek 
137eda6f593SDavid van Moolenbroek 	sy = grid_view_y(gd, gd->sy);
138eda6f593SDavid van Moolenbroek 
139eda6f593SDavid van Moolenbroek 	grid_move_lines(gd, py + ny, py, sy - py - ny);
140eda6f593SDavid van Moolenbroek }
141eda6f593SDavid van Moolenbroek 
142eda6f593SDavid van Moolenbroek /* Insert lines in region. */
143eda6f593SDavid van Moolenbroek void
grid_view_insert_lines_region(struct grid * gd,u_int rlower,u_int py,u_int ny)144eda6f593SDavid van Moolenbroek grid_view_insert_lines_region(struct grid *gd, u_int rlower, u_int py, u_int ny)
145eda6f593SDavid van Moolenbroek {
146eda6f593SDavid van Moolenbroek 	u_int	ny2;
147eda6f593SDavid van Moolenbroek 
148eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "rlower=%u, py=%u, ny=%u", rlower, py, ny);
149eda6f593SDavid van Moolenbroek 
150eda6f593SDavid van Moolenbroek 	rlower = grid_view_y(gd, rlower);
151eda6f593SDavid van Moolenbroek 
152eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
153eda6f593SDavid van Moolenbroek 
154eda6f593SDavid van Moolenbroek 	ny2 = rlower + 1 - py - ny;
155eda6f593SDavid van Moolenbroek 	grid_move_lines(gd, rlower + 1 - ny2, py, ny2);
156eda6f593SDavid van Moolenbroek 	grid_clear(gd, 0, py + ny2, gd->sx, ny - ny2);
157eda6f593SDavid van Moolenbroek }
158eda6f593SDavid van Moolenbroek 
159eda6f593SDavid van Moolenbroek /* Delete lines. */
160eda6f593SDavid van Moolenbroek void
grid_view_delete_lines(struct grid * gd,u_int py,u_int ny)161eda6f593SDavid van Moolenbroek grid_view_delete_lines(struct grid *gd, u_int py, u_int ny)
162eda6f593SDavid van Moolenbroek {
163eda6f593SDavid van Moolenbroek 	u_int	sy;
164eda6f593SDavid van Moolenbroek 
165eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "py=%u, ny=%u", py, ny);
166eda6f593SDavid van Moolenbroek 
167eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
168eda6f593SDavid van Moolenbroek 
169eda6f593SDavid van Moolenbroek 	sy = grid_view_y(gd, gd->sy);
170eda6f593SDavid van Moolenbroek 
171eda6f593SDavid van Moolenbroek 	grid_move_lines(gd, py, py + ny, sy - py - ny);
172eda6f593SDavid van Moolenbroek 	grid_clear(gd, 0, sy - ny, gd->sx, py + ny - (sy - ny));
173eda6f593SDavid van Moolenbroek }
174eda6f593SDavid van Moolenbroek 
175eda6f593SDavid van Moolenbroek /* Delete lines inside scroll region. */
176eda6f593SDavid van Moolenbroek void
grid_view_delete_lines_region(struct grid * gd,u_int rlower,u_int py,u_int ny)177eda6f593SDavid van Moolenbroek grid_view_delete_lines_region(struct grid *gd, u_int rlower, u_int py, u_int ny)
178eda6f593SDavid van Moolenbroek {
179eda6f593SDavid van Moolenbroek 	u_int	ny2;
180eda6f593SDavid van Moolenbroek 
181eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "rlower=%u, py=%u, ny=%u", rlower, py, ny);
182eda6f593SDavid van Moolenbroek 
183eda6f593SDavid van Moolenbroek 	rlower = grid_view_y(gd, rlower);
184eda6f593SDavid van Moolenbroek 
185eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
186eda6f593SDavid van Moolenbroek 
187eda6f593SDavid van Moolenbroek 	ny2 = rlower + 1 - py - ny;
188eda6f593SDavid van Moolenbroek 	grid_move_lines(gd, py, py + ny, ny2);
189eda6f593SDavid van Moolenbroek 	grid_clear(gd, 0, py + ny2, gd->sx, ny - ny2);
190eda6f593SDavid van Moolenbroek }
191eda6f593SDavid van Moolenbroek 
192eda6f593SDavid van Moolenbroek /* Insert characters. */
193eda6f593SDavid van Moolenbroek void
grid_view_insert_cells(struct grid * gd,u_int px,u_int py,u_int nx)194eda6f593SDavid van Moolenbroek grid_view_insert_cells(struct grid *gd, u_int px, u_int py, u_int nx)
195eda6f593SDavid van Moolenbroek {
196eda6f593SDavid van Moolenbroek 	u_int	sx;
197eda6f593SDavid van Moolenbroek 
198eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "px=%u, py=%u, nx=%u", px, py, nx);
199eda6f593SDavid van Moolenbroek 
200eda6f593SDavid van Moolenbroek 	px = grid_view_x(gd, px);
201eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
202eda6f593SDavid van Moolenbroek 
203eda6f593SDavid van Moolenbroek 	sx = grid_view_x(gd, gd->sx);
204eda6f593SDavid van Moolenbroek 
205eda6f593SDavid van Moolenbroek 	if (px == sx - 1)
206eda6f593SDavid van Moolenbroek 		grid_clear(gd, px, py, 1, 1);
207eda6f593SDavid van Moolenbroek 	else
208eda6f593SDavid van Moolenbroek 		grid_move_cells(gd, px + nx, px, py, sx - px - nx);
209eda6f593SDavid van Moolenbroek }
210eda6f593SDavid van Moolenbroek 
211eda6f593SDavid van Moolenbroek /* Delete characters. */
212eda6f593SDavid van Moolenbroek void
grid_view_delete_cells(struct grid * gd,u_int px,u_int py,u_int nx)213eda6f593SDavid van Moolenbroek grid_view_delete_cells(struct grid *gd, u_int px, u_int py, u_int nx)
214eda6f593SDavid van Moolenbroek {
215eda6f593SDavid van Moolenbroek 	u_int	sx;
216eda6f593SDavid van Moolenbroek 
217eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "px=%u, py=%u, nx=%u", px, py, nx);
218eda6f593SDavid van Moolenbroek 
219eda6f593SDavid van Moolenbroek 	px = grid_view_x(gd, px);
220eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
221eda6f593SDavid van Moolenbroek 
222eda6f593SDavid van Moolenbroek 	sx = grid_view_x(gd, gd->sx);
223eda6f593SDavid van Moolenbroek 
224eda6f593SDavid van Moolenbroek 	grid_move_cells(gd, px, px + nx, py, sx - px - nx);
225eda6f593SDavid van Moolenbroek 	grid_clear(gd, sx - nx, py, px + nx - (sx - nx), 1);
226eda6f593SDavid van Moolenbroek }
227eda6f593SDavid van Moolenbroek 
228eda6f593SDavid van Moolenbroek /* Convert cells into a string. */
229eda6f593SDavid van Moolenbroek char *
grid_view_string_cells(struct grid * gd,u_int px,u_int py,u_int nx)230eda6f593SDavid van Moolenbroek grid_view_string_cells(struct grid *gd, u_int px, u_int py, u_int nx)
231eda6f593SDavid van Moolenbroek {
232eda6f593SDavid van Moolenbroek 	GRID_DEBUG(gd, "px=%u, py=%u, nx=%u", px, py, nx);
233eda6f593SDavid van Moolenbroek 
234eda6f593SDavid van Moolenbroek 	px = grid_view_x(gd, px);
235eda6f593SDavid van Moolenbroek 	py = grid_view_y(gd, py);
236eda6f593SDavid van Moolenbroek 
237*0a6a1f1dSLionel Sambuc 	return (grid_string_cells(gd, px, py, nx, NULL, 0, 0, 0));
238eda6f593SDavid van Moolenbroek }
239