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