15494e770Schristos /* $OpenBSD$ */
2698d5317Sjmmv
3698d5317Sjmmv /*
4ed4e6cd4Schristos * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
5698d5317Sjmmv *
6698d5317Sjmmv * Permission to use, copy, modify, and distribute this software for any
7698d5317Sjmmv * purpose with or without fee is hereby granted, provided that the above
8698d5317Sjmmv * copyright notice and this permission notice appear in all copies.
9698d5317Sjmmv *
10698d5317Sjmmv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11698d5317Sjmmv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12698d5317Sjmmv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13698d5317Sjmmv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14698d5317Sjmmv * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15698d5317Sjmmv * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16698d5317Sjmmv * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17698d5317Sjmmv */
18698d5317Sjmmv
19698d5317Sjmmv #include <sys/types.h>
20698d5317Sjmmv
21698d5317Sjmmv #include <string.h>
22698d5317Sjmmv
23698d5317Sjmmv #include "tmux.h"
24698d5317Sjmmv
25698d5317Sjmmv /*
26698d5317Sjmmv * Grid view functions. These work using coordinates relative to the visible
27698d5317Sjmmv * screen area.
28698d5317Sjmmv */
29698d5317Sjmmv
30698d5317Sjmmv #define grid_view_x(gd, x) (x)
31698d5317Sjmmv #define grid_view_y(gd, y) ((gd)->hsize + (y))
32698d5317Sjmmv
33ed4e6cd4Schristos /* Get cell. */
34ed4e6cd4Schristos void
grid_view_get_cell(struct grid * gd,u_int px,u_int py,struct grid_cell * gc)35ed4e6cd4Schristos grid_view_get_cell(struct grid *gd, u_int px, u_int py, struct grid_cell *gc)
36698d5317Sjmmv {
37ed4e6cd4Schristos grid_get_cell(gd, grid_view_x(gd, px), grid_view_y(gd, py), gc);
38698d5317Sjmmv }
39698d5317Sjmmv
40698d5317Sjmmv /* Set cell. */
41698d5317Sjmmv void
grid_view_set_cell(struct grid * gd,u_int px,u_int py,const struct grid_cell * gc)42ed4e6cd4Schristos grid_view_set_cell(struct grid *gd, u_int px, u_int py,
43ed4e6cd4Schristos const struct grid_cell *gc)
44698d5317Sjmmv {
45698d5317Sjmmv grid_set_cell(gd, grid_view_x(gd, px), grid_view_y(gd, py), gc);
46698d5317Sjmmv }
47698d5317Sjmmv
489fb66d81Schristos /* Set padding. */
499fb66d81Schristos void
grid_view_set_padding(struct grid * gd,u_int px,u_int py)509fb66d81Schristos grid_view_set_padding(struct grid *gd, u_int px, u_int py)
519fb66d81Schristos {
529fb66d81Schristos grid_set_padding(gd, grid_view_x(gd, px), grid_view_y(gd, py));
539fb66d81Schristos }
549fb66d81Schristos
554e179ddaSchristos /* Set cells. */
564e179ddaSchristos void
grid_view_set_cells(struct grid * gd,u_int px,u_int py,const struct grid_cell * gc,const char * s,size_t slen)574e179ddaSchristos grid_view_set_cells(struct grid *gd, u_int px, u_int py,
584e179ddaSchristos const struct grid_cell *gc, const char *s, size_t slen)
594e179ddaSchristos {
604e179ddaSchristos grid_set_cells(gd, grid_view_x(gd, px), grid_view_y(gd, py), gc, s,
614e179ddaSchristos slen);
624e179ddaSchristos }
634e179ddaSchristos
64d530c4d0Sjmmv /* Clear into history. */
65d530c4d0Sjmmv void
grid_view_clear_history(struct grid * gd,u_int bg)664e179ddaSchristos grid_view_clear_history(struct grid *gd, u_int bg)
67d530c4d0Sjmmv {
68d530c4d0Sjmmv struct grid_line *gl;
69d530c4d0Sjmmv u_int yy, last;
70d530c4d0Sjmmv
71d530c4d0Sjmmv /* Find the last used line. */
72d530c4d0Sjmmv last = 0;
73d530c4d0Sjmmv for (yy = 0; yy < gd->sy; yy++) {
748f3b9483Schristos gl = grid_get_line(gd, grid_view_y(gd, yy));
754e179ddaSchristos if (gl->cellused != 0)
76d530c4d0Sjmmv last = yy + 1;
77d530c4d0Sjmmv }
784e179ddaSchristos if (last == 0) {
794e179ddaSchristos grid_view_clear(gd, 0, 0, gd->sx, gd->sy, bg);
80d530c4d0Sjmmv return;
814e179ddaSchristos }
82d530c4d0Sjmmv
83d530c4d0Sjmmv /* Scroll the lines into the history. */
84928fc495Schristos for (yy = 0; yy < last; yy++) {
85c9ad075bSchristos grid_collect_history(gd);
864e179ddaSchristos grid_scroll_history(gd, bg);
87d530c4d0Sjmmv }
884e179ddaSchristos if (last < gd->sy)
894e179ddaSchristos grid_view_clear(gd, 0, 0, gd->sx, gd->sy - last, bg);
904e179ddaSchristos gd->hscrolled = 0;
91928fc495Schristos }
92d530c4d0Sjmmv
93698d5317Sjmmv /* Clear area. */
94698d5317Sjmmv void
grid_view_clear(struct grid * gd,u_int px,u_int py,u_int nx,u_int ny,u_int bg)954e179ddaSchristos grid_view_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny,
964e179ddaSchristos u_int bg)
97698d5317Sjmmv {
98698d5317Sjmmv px = grid_view_x(gd, px);
99698d5317Sjmmv py = grid_view_y(gd, py);
100698d5317Sjmmv
1014e179ddaSchristos grid_clear(gd, px, py, nx, ny, bg);
102698d5317Sjmmv }
103698d5317Sjmmv
104698d5317Sjmmv /* Scroll region up. */
105698d5317Sjmmv void
grid_view_scroll_region_up(struct grid * gd,u_int rupper,u_int rlower,u_int bg)106c9ad075bSchristos grid_view_scroll_region_up(struct grid *gd, u_int rupper, u_int rlower,
107c9ad075bSchristos u_int bg)
108698d5317Sjmmv {
109698d5317Sjmmv if (gd->flags & GRID_HISTORY) {
110c9ad075bSchristos grid_collect_history(gd);
111698d5317Sjmmv if (rupper == 0 && rlower == gd->sy - 1)
112c9ad075bSchristos grid_scroll_history(gd, bg);
113698d5317Sjmmv else {
114698d5317Sjmmv rupper = grid_view_y(gd, rupper);
115698d5317Sjmmv rlower = grid_view_y(gd, rlower);
116c9ad075bSchristos grid_scroll_history_region(gd, rupper, rlower, bg);
117698d5317Sjmmv }
118698d5317Sjmmv } else {
119698d5317Sjmmv rupper = grid_view_y(gd, rupper);
120698d5317Sjmmv rlower = grid_view_y(gd, rlower);
121c9ad075bSchristos grid_move_lines(gd, rupper, rupper + 1, rlower - rupper, bg);
122698d5317Sjmmv }
123698d5317Sjmmv }
124698d5317Sjmmv
125698d5317Sjmmv /* Scroll region down. */
126698d5317Sjmmv void
grid_view_scroll_region_down(struct grid * gd,u_int rupper,u_int rlower,u_int bg)127c9ad075bSchristos grid_view_scroll_region_down(struct grid *gd, u_int rupper, u_int rlower,
128c9ad075bSchristos u_int bg)
129698d5317Sjmmv {
130698d5317Sjmmv rupper = grid_view_y(gd, rupper);
131698d5317Sjmmv rlower = grid_view_y(gd, rlower);
132698d5317Sjmmv
133c9ad075bSchristos grid_move_lines(gd, rupper + 1, rupper, rlower - rupper, bg);
134698d5317Sjmmv }
135698d5317Sjmmv
136698d5317Sjmmv /* Insert lines. */
137698d5317Sjmmv void
grid_view_insert_lines(struct grid * gd,u_int py,u_int ny,u_int bg)1384e179ddaSchristos grid_view_insert_lines(struct grid *gd, u_int py, u_int ny, u_int bg)
139698d5317Sjmmv {
140698d5317Sjmmv u_int sy;
141698d5317Sjmmv
142698d5317Sjmmv py = grid_view_y(gd, py);
143698d5317Sjmmv
144698d5317Sjmmv sy = grid_view_y(gd, gd->sy);
145698d5317Sjmmv
1464e179ddaSchristos grid_move_lines(gd, py + ny, py, sy - py - ny, bg);
147698d5317Sjmmv }
148698d5317Sjmmv
149698d5317Sjmmv /* Insert lines in region. */
150698d5317Sjmmv void
grid_view_insert_lines_region(struct grid * gd,u_int rlower,u_int py,u_int ny,u_int bg)1515494e770Schristos grid_view_insert_lines_region(struct grid *gd, u_int rlower, u_int py,
1524e179ddaSchristos u_int ny, u_int bg)
153698d5317Sjmmv {
154698d5317Sjmmv u_int ny2;
155698d5317Sjmmv
156698d5317Sjmmv rlower = grid_view_y(gd, rlower);
157698d5317Sjmmv
158698d5317Sjmmv py = grid_view_y(gd, py);
159698d5317Sjmmv
160698d5317Sjmmv ny2 = rlower + 1 - py - ny;
1614e179ddaSchristos grid_move_lines(gd, rlower + 1 - ny2, py, ny2, bg);
1624e179ddaSchristos grid_clear(gd, 0, py + ny2, gd->sx, ny - ny2, bg);
163698d5317Sjmmv }
164698d5317Sjmmv
165698d5317Sjmmv /* Delete lines. */
166698d5317Sjmmv void
grid_view_delete_lines(struct grid * gd,u_int py,u_int ny,u_int bg)1674e179ddaSchristos grid_view_delete_lines(struct grid *gd, u_int py, u_int ny, u_int bg)
168698d5317Sjmmv {
169698d5317Sjmmv u_int sy;
170698d5317Sjmmv
171698d5317Sjmmv py = grid_view_y(gd, py);
172698d5317Sjmmv
173698d5317Sjmmv sy = grid_view_y(gd, gd->sy);
174698d5317Sjmmv
1754e179ddaSchristos grid_move_lines(gd, py, py + ny, sy - py - ny, bg);
1764e179ddaSchristos grid_clear(gd, 0, sy - ny, gd->sx, py + ny - (sy - ny), bg);
177698d5317Sjmmv }
178698d5317Sjmmv
179698d5317Sjmmv /* Delete lines inside scroll region. */
180698d5317Sjmmv void
grid_view_delete_lines_region(struct grid * gd,u_int rlower,u_int py,u_int ny,u_int bg)1815494e770Schristos grid_view_delete_lines_region(struct grid *gd, u_int rlower, u_int py,
1824e179ddaSchristos u_int ny, u_int bg)
183698d5317Sjmmv {
184698d5317Sjmmv u_int ny2;
185698d5317Sjmmv
186698d5317Sjmmv rlower = grid_view_y(gd, rlower);
187698d5317Sjmmv
188698d5317Sjmmv py = grid_view_y(gd, py);
189698d5317Sjmmv
190698d5317Sjmmv ny2 = rlower + 1 - py - ny;
1914e179ddaSchristos grid_move_lines(gd, py, py + ny, ny2, bg);
1924e179ddaSchristos grid_clear(gd, 0, py + ny2, gd->sx, ny - ny2, bg);
193698d5317Sjmmv }
194698d5317Sjmmv
195698d5317Sjmmv /* Insert characters. */
196698d5317Sjmmv void
grid_view_insert_cells(struct grid * gd,u_int px,u_int py,u_int nx,u_int bg)1974e179ddaSchristos grid_view_insert_cells(struct grid *gd, u_int px, u_int py, u_int nx, u_int bg)
198698d5317Sjmmv {
199698d5317Sjmmv u_int sx;
200698d5317Sjmmv
201698d5317Sjmmv px = grid_view_x(gd, px);
202698d5317Sjmmv py = grid_view_y(gd, py);
203698d5317Sjmmv
204698d5317Sjmmv sx = grid_view_x(gd, gd->sx);
205698d5317Sjmmv
2064e179ddaSchristos if (px >= sx - 1)
2074e179ddaSchristos grid_clear(gd, px, py, 1, 1, bg);
208698d5317Sjmmv else
2094e179ddaSchristos grid_move_cells(gd, px + nx, px, py, sx - px - nx, bg);
210698d5317Sjmmv }
211698d5317Sjmmv
212698d5317Sjmmv /* Delete characters. */
213698d5317Sjmmv void
grid_view_delete_cells(struct grid * gd,u_int px,u_int py,u_int nx,u_int bg)2144e179ddaSchristos grid_view_delete_cells(struct grid *gd, u_int px, u_int py, u_int nx, u_int bg)
215698d5317Sjmmv {
216698d5317Sjmmv u_int sx;
217698d5317Sjmmv
218698d5317Sjmmv px = grid_view_x(gd, px);
219698d5317Sjmmv py = grid_view_y(gd, py);
220698d5317Sjmmv
221698d5317Sjmmv sx = grid_view_x(gd, gd->sx);
222698d5317Sjmmv
2234e179ddaSchristos grid_move_cells(gd, px, px + nx, py, sx - px - nx, bg);
2244e179ddaSchristos grid_clear(gd, sx - nx, py, px + nx - (sx - nx), 1, bg);
225698d5317Sjmmv }
226698d5317Sjmmv
227698d5317Sjmmv /* Convert cells into a string. */
228698d5317Sjmmv char *
grid_view_string_cells(struct grid * gd,u_int px,u_int py,u_int nx)229698d5317Sjmmv grid_view_string_cells(struct grid *gd, u_int px, u_int py, u_int nx)
230698d5317Sjmmv {
231698d5317Sjmmv px = grid_view_x(gd, px);
232698d5317Sjmmv py = grid_view_y(gd, py);
233698d5317Sjmmv
234*c23f9150Swiz return (grid_string_cells(gd, px, py, nx, NULL, 0, NULL));
235698d5317Sjmmv }
236