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