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