version 1.15, 2009/08/08 13:29:27 |
version 1.16, 2009/08/08 15:57:49 |
|
|
if (sy == ey) |
if (sy == ey) |
window_copy_copy_line(wp, &buf, &off, sy, sx, ex); |
window_copy_copy_line(wp, &buf, &off, sy, sx, ex); |
else { |
else { |
xx = window_copy_find_length(wp, sy); |
xx = screen_size_x(s); |
window_copy_copy_line(wp, &buf, &off, sy, sx, xx); |
window_copy_copy_line(wp, &buf, &off, sy, sx, xx); |
if (ey - sy > 1) { |
if (ey - sy > 1) { |
for (i = sy + 1; i < ey; i++) { |
for (i = sy + 1; i < ey; i++) |
xx = window_copy_find_length(wp, i); |
|
window_copy_copy_line(wp, &buf, &off, i, 0, xx); |
window_copy_copy_line(wp, &buf, &off, i, 0, xx); |
} |
|
} |
} |
window_copy_copy_line(wp, &buf, &off, ey, 0, ex); |
window_copy_copy_line(wp, &buf, &off, ey, 0, ex); |
} |
} |
|
|
window_copy_copy_line(struct window_pane *wp, |
window_copy_copy_line(struct window_pane *wp, |
char **buf, size_t *off, u_int sy, u_int sx, u_int ex) |
char **buf, size_t *off, u_int sy, u_int sx, u_int ex) |
{ |
{ |
|
struct grid *gd = wp->base.grid; |
const struct grid_cell *gc; |
const struct grid_cell *gc; |
const struct grid_utf8 *gu; |
const struct grid_utf8 *gu; |
u_int i, j, xx; |
struct grid_line *gl; |
|
u_int i, j, xx, wrapped = 0; |
|
|
if (sx > ex) |
if (sx > ex) |
return; |
return; |
|
|
xx = window_copy_find_length(wp, sy); |
/* |
|
* Work out if the line was wrapped at the screen edge and all of it is |
|
* on screen. |
|
*/ |
|
gl = &gd->linedata[sy]; |
|
if (gl->flags & GRID_LINE_WRAPPED && gl->cellsize <= gd->sx) |
|
wrapped = 1; |
|
|
|
/* If the line was wrapped, don't strip spaces (use the full length). */ |
|
if (wrapped) |
|
xx = gl->cellsize; |
|
else |
|
xx = window_copy_find_length(wp, sy); |
if (ex > xx) |
if (ex > xx) |
ex = xx; |
ex = xx; |
if (sx > xx) |
if (sx > xx) |
|
|
|
|
if (sx < ex) { |
if (sx < ex) { |
for (i = sx; i < ex; i++) { |
for (i = sx; i < ex; i++) { |
gc = grid_peek_cell(wp->base.grid, i, sy); |
gc = grid_peek_cell(gd, i, sy); |
if (gc->flags & GRID_FLAG_PADDING) |
if (gc->flags & GRID_FLAG_PADDING) |
continue; |
continue; |
if (!(gc->flags & GRID_FLAG_UTF8)) { |
if (!(gc->flags & GRID_FLAG_UTF8)) { |
*buf = xrealloc(*buf, 1, (*off) + 1); |
*buf = xrealloc(*buf, 1, (*off) + 1); |
(*buf)[(*off)++] = gc->data; |
(*buf)[(*off)++] = gc->data; |
} else { |
} else { |
gu = grid_peek_utf8(wp->base.grid, i, sy); |
gu = grid_peek_utf8(gd, i, sy); |
*buf = xrealloc(*buf, 1, (*off) + UTF8_SIZE); |
*buf = xrealloc(*buf, 1, (*off) + UTF8_SIZE); |
for (j = 0; j < UTF8_SIZE; j++) { |
for (j = 0; j < UTF8_SIZE; j++) { |
if (gu->data[j] == 0xff) |
if (gu->data[j] == 0xff) |
|
|
} |
} |
} |
} |
|
|
*buf = xrealloc(*buf, 1, (*off) + 1); |
/* Only add a newline if the line wasn't wrapped. */ |
(*buf)[*off] = '\n'; |
if (!wrapped) { |
(*off)++; |
*buf = xrealloc(*buf, 1, (*off) + 1); |
|
(*buf)[(*off)++] = '\n'; |
|
} |
} |
} |
|
|
int |
int |