version 1.95, 2013/10/23 11:31:03 |
version 1.96, 2013/11/08 12:39:20 |
|
|
void window_copy_goto_line(struct window_pane *, const char *); |
void window_copy_goto_line(struct window_pane *, const char *); |
void window_copy_update_cursor(struct window_pane *, u_int, u_int); |
void window_copy_update_cursor(struct window_pane *, u_int, u_int); |
void window_copy_start_selection(struct window_pane *); |
void window_copy_start_selection(struct window_pane *); |
int window_copy_update_selection(struct window_pane *); |
int window_copy_update_selection(struct window_pane *, int); |
void *window_copy_get_selection(struct window_pane *, size_t *); |
void *window_copy_get_selection(struct window_pane *, size_t *); |
void window_copy_copy_buffer(struct window_pane *, int, void *, size_t); |
void window_copy_copy_buffer(struct window_pane *, int, void *, size_t); |
void window_copy_copy_pipe( |
void window_copy_copy_pipe( |
|
|
data->oy = screen_hsize(data->backing); |
data->oy = screen_hsize(data->backing); |
else |
else |
data->oy += n; |
data->oy += n; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
} |
} |
|
|
|
|
else |
else |
data->oy -= n; |
data->oy -= n; |
} |
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HALFPAGEUP: |
case MODEKEYCOPY_HALFPAGEUP: |
|
|
else |
else |
data->oy += n; |
data->oy += n; |
} |
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HALFPAGEDOWN: |
case MODEKEYCOPY_HALFPAGEDOWN: |
|
|
else |
else |
data->oy -= n; |
data->oy -= n; |
} |
} |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_TOPLINE: |
case MODEKEYCOPY_TOPLINE: |
data->cx = 0; |
data->cx = 0; |
data->cy = 0; |
data->cy = 0; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_MIDDLELINE: |
case MODEKEYCOPY_MIDDLELINE: |
data->cx = 0; |
data->cx = 0; |
data->cy = (screen_size_y(s) - 1) / 2; |
data->cy = (screen_size_y(s) - 1) / 2; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_BOTTOMLINE: |
case MODEKEYCOPY_BOTTOMLINE: |
data->cx = 0; |
data->cx = 0; |
data->cy = screen_size_y(s) - 1; |
data->cy = screen_size_y(s) - 1; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HISTORYTOP: |
case MODEKEYCOPY_HISTORYTOP: |
data->cx = 0; |
data->cx = 0; |
data->cy = 0; |
data->cy = 0; |
data->oy = screen_hsize(data->backing); |
data->oy = screen_hsize(data->backing); |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_HISTORYBOTTOM: |
case MODEKEYCOPY_HISTORYBOTTOM: |
data->cx = 0; |
data->cx = 0; |
data->cy = screen_size_y(s) - 1; |
data->cy = screen_size_y(s) - 1; |
data->oy = 0; |
data->oy = 0; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
break; |
break; |
case MODEKEYCOPY_STARTSELECTION: |
case MODEKEYCOPY_STARTSELECTION: |
|
|
if (s->mode & MODE_MOUSE_BUTTON) { |
if (s->mode & MODE_MOUSE_BUTTON) { |
if (~m->event & MOUSE_EVENT_UP) { |
if (~m->event & MOUSE_EVENT_UP) { |
window_copy_update_cursor(wp, m->x, m->y); |
window_copy_update_cursor(wp, m->x, m->y); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
return; |
return; |
} |
} |
|
|
} |
} |
data->oy = gd->hsize - offset; |
data->oy = gd->hsize - offset; |
|
|
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
} |
} |
|
|
|
|
return; |
return; |
|
|
data->oy = lineno; |
data->oy = lineno; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
} |
} |
|
|
|
|
data->sely = screen_hsize(data->backing) + data->cy - data->oy; |
data->sely = screen_hsize(data->backing) + data->cy - data->oy; |
|
|
s->sel.flag = 1; |
s->sel.flag = 1; |
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
} |
} |
|
|
int |
int |
window_copy_update_selection(struct window_pane *wp) |
window_copy_update_selection(struct window_pane *wp, int may_redraw) |
{ |
{ |
struct window_copy_mode_data *data = wp->modedata; |
struct window_copy_mode_data *data = wp->modedata; |
struct screen *s = &data->screen; |
struct screen *s = &data->screen; |
|
|
screen_set_selection(s, |
screen_set_selection(s, |
sx, sy, data->cx, screen_hsize(s) + data->cy, data->rectflag, &gc); |
sx, sy, data->cx, screen_hsize(s) + data->cy, data->rectflag, &gc); |
|
|
if (data->rectflag) { |
if (data->rectflag && may_redraw) { |
/* |
/* |
* Can't rely on the caller to redraw the right lines for |
* Can't rely on the caller to redraw the right lines for |
* rectangle selection - find the highest line and the number |
* rectangle selection - find the highest line and the number |
|
|
} |
} |
} |
} |
window_copy_update_cursor(wp, 0, data->cy); |
window_copy_update_cursor(wp, 0, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
} |
} |
|
|
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
} |
} |
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
|
|
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
window_copy_cursor_end_of_line(wp); |
window_copy_cursor_end_of_line(wp); |
} else { |
} else { |
window_copy_update_cursor(wp, data->cx - 1, data->cy); |
window_copy_update_cursor(wp, data->cx - 1, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
} |
} |
|
|
window_copy_cursor_down(wp, 0); |
window_copy_cursor_down(wp, 0); |
} else { |
} else { |
window_copy_update_cursor(wp, data->cx + 1, data->cy); |
window_copy_update_cursor(wp, data->cx + 1, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
} |
} |
|
|
} |
} |
} else { |
} else { |
window_copy_update_cursor(wp, data->cx, data->cy - 1); |
window_copy_update_cursor(wp, data->cx, data->cy - 1); |
if (window_copy_update_selection(wp)) { |
if (window_copy_update_selection(wp, 1)) { |
if (data->cy == screen_size_y(s) - 1) |
if (data->cy == screen_size_y(s) - 1) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
else |
else |
|
|
window_copy_redraw_lines(wp, data->cy - 1, 2); |
window_copy_redraw_lines(wp, data->cy - 1, 2); |
} else { |
} else { |
window_copy_update_cursor(wp, data->cx, data->cy + 1); |
window_copy_update_cursor(wp, data->cx, data->cy + 1); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy - 1, 2); |
window_copy_redraw_lines(wp, data->cy - 1, 2); |
} |
} |
|
|
|
|
if (!(gc->flags & GRID_FLAG_PADDING) && |
if (!(gc->flags & GRID_FLAG_PADDING) && |
ud.size == 1 && *ud.data == data->jumpchar) { |
ud.size == 1 && *ud.data == data->jumpchar) { |
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
return; |
return; |
} |
} |
|
|
if (!(gc->flags & GRID_FLAG_PADDING) && |
if (!(gc->flags & GRID_FLAG_PADDING) && |
ud.size == 1 && *ud.data == data->jumpchar) { |
ud.size == 1 && *ud.data == data->jumpchar) { |
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
return; |
return; |
} |
} |
|
|
if (!(gc->flags & GRID_FLAG_PADDING) && |
if (!(gc->flags & GRID_FLAG_PADDING) && |
ud.size == 1 && *ud.data == data->jumpchar) { |
ud.size == 1 && *ud.data == data->jumpchar) { |
window_copy_update_cursor(wp, px - 1, data->cy); |
window_copy_update_cursor(wp, px - 1, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
return; |
return; |
} |
} |
|
|
if (!(gc->flags & GRID_FLAG_PADDING) && |
if (!(gc->flags & GRID_FLAG_PADDING) && |
ud.size == 1 && *ud.data == data->jumpchar) { |
ud.size == 1 && *ud.data == data->jumpchar) { |
window_copy_update_cursor(wp, px + 1, data->cy); |
window_copy_update_cursor(wp, px + 1, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
return; |
return; |
} |
} |
|
|
} while (expected == 1); |
} while (expected == 1); |
|
|
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
px--; |
px--; |
|
|
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
|
|
out: |
out: |
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
if (window_copy_update_selection(wp)) |
if (window_copy_update_selection(wp, 1)) |
window_copy_redraw_lines(wp, data->cy, 1); |
window_copy_redraw_lines(wp, data->cy, 1); |
} |
} |
|
|
|
|
return; |
return; |
data->oy -= ny; |
data->oy -= ny; |
|
|
|
window_copy_update_selection(wp, 0); |
|
|
screen_write_start(&ctx, wp, NULL); |
screen_write_start(&ctx, wp, NULL); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_deleteline(&ctx, ny); |
screen_write_deleteline(&ctx, ny); |
|
|
window_copy_write_line(wp, &ctx, 1); |
window_copy_write_line(wp, &ctx, 1); |
if (screen_size_y(s) > 3) |
if (screen_size_y(s) > 3) |
window_copy_write_line(wp, &ctx, screen_size_y(s) - 2); |
window_copy_write_line(wp, &ctx, screen_size_y(s) - 2); |
if (s->sel.flag && screen_size_y(s) > ny) { |
if (s->sel.flag && screen_size_y(s) > ny) |
window_copy_update_selection(wp); |
|
window_copy_write_line(wp, &ctx, screen_size_y(s) - ny - 1); |
window_copy_write_line(wp, &ctx, screen_size_y(s) - ny - 1); |
} |
|
screen_write_cursormove(&ctx, data->cx, data->cy); |
screen_write_cursormove(&ctx, data->cx, data->cy); |
window_copy_update_selection(wp); |
|
screen_write_stop(&ctx); |
screen_write_stop(&ctx); |
} |
} |
|
|
|
|
return; |
return; |
data->oy += ny; |
data->oy += ny; |
|
|
|
window_copy_update_selection(wp, 0); |
|
|
screen_write_start(&ctx, wp, NULL); |
screen_write_start(&ctx, wp, NULL); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_insertline(&ctx, ny); |
screen_write_insertline(&ctx, ny); |
window_copy_write_lines(wp, &ctx, 0, ny); |
window_copy_write_lines(wp, &ctx, 0, ny); |
if (s->sel.flag && screen_size_y(s) > ny) { |
if (s->sel.flag && screen_size_y(s) > ny) |
window_copy_update_selection(wp); |
|
window_copy_write_line(wp, &ctx, ny); |
window_copy_write_line(wp, &ctx, ny); |
} else if (ny == 1) /* nuke position */ |
else if (ny == 1) /* nuke position */ |
window_copy_write_line(wp, &ctx, 1); |
window_copy_write_line(wp, &ctx, 1); |
screen_write_cursormove(&ctx, data->cx, data->cy); |
screen_write_cursormove(&ctx, data->cx, data->cy); |
window_copy_update_selection(wp); |
|
screen_write_stop(&ctx); |
screen_write_stop(&ctx); |
} |
} |
|
|
|
|
if (data->cx > px) |
if (data->cx > px) |
window_copy_update_cursor(wp, px, data->cy); |
window_copy_update_cursor(wp, px, data->cy); |
|
|
window_copy_update_selection(wp); |
window_copy_update_selection(wp, 1); |
window_copy_redraw_screen(wp); |
window_copy_redraw_screen(wp); |
} |
} |