version 1.51, 2018/07/04 09:44:07 |
version 1.52, 2018/07/31 11:49:26 |
|
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
|
/* Selected area in screen. */ |
|
struct screen_sel { |
|
int hidden; |
|
int rectangle; |
|
int modekeys; |
|
|
|
u_int sx; |
|
u_int sy; |
|
|
|
u_int ex; |
|
u_int ey; |
|
|
|
struct grid_cell cell; |
|
}; |
|
|
|
/* Entry on title stack. */ |
struct screen_title_entry { |
struct screen_title_entry { |
char *text; |
char *text; |
|
|
|
|
s->cstyle = 0; |
s->cstyle = 0; |
s->ccolour = xstrdup(""); |
s->ccolour = xstrdup(""); |
s->tabs = NULL; |
s->tabs = NULL; |
|
s->sel = NULL; |
|
|
screen_reinit(s); |
screen_reinit(s); |
} |
} |
|
|
void |
void |
screen_free(struct screen *s) |
screen_free(struct screen *s) |
{ |
{ |
|
free(s->sel); |
free(s->tabs); |
free(s->tabs); |
free(s->title); |
free(s->title); |
free(s->ccolour); |
free(s->ccolour); |
|
|
/* Set selection. */ |
/* Set selection. */ |
void |
void |
screen_set_selection(struct screen *s, u_int sx, u_int sy, |
screen_set_selection(struct screen *s, u_int sx, u_int sy, |
u_int ex, u_int ey, u_int rectflag, struct grid_cell *gc) |
u_int ex, u_int ey, u_int rectangle, int modekeys, struct grid_cell *gc) |
{ |
{ |
struct screen_sel *sel = &s->sel; |
if (s->sel == NULL) |
|
s->sel = xcalloc(1, sizeof *s->sel); |
|
|
memcpy(&sel->cell, gc, sizeof sel->cell); |
memcpy(&s->sel->cell, gc, sizeof s->sel->cell); |
sel->flag = 1; |
s->sel->hidden = 0; |
sel->hidden = 0; |
s->sel->rectangle = rectangle; |
|
s->sel->modekeys = modekeys; |
|
|
sel->rectflag = rectflag; |
s->sel->sx = sx; |
|
s->sel->sy = sy; |
sel->sx = sx; sel->sy = sy; |
s->sel->ex = ex; |
sel->ex = ex; sel->ey = ey; |
s->sel->ey = ey; |
} |
} |
|
|
/* Clear selection. */ |
/* Clear selection. */ |
void |
void |
screen_clear_selection(struct screen *s) |
screen_clear_selection(struct screen *s) |
{ |
{ |
struct screen_sel *sel = &s->sel; |
free(s->sel); |
|
s->sel = NULL; |
sel->flag = 0; |
|
sel->hidden = 0; |
|
sel->lineflag = LINE_SEL_NONE; |
|
} |
} |
|
|
/* Hide selection. */ |
/* Hide selection. */ |
void |
void |
screen_hide_selection(struct screen *s) |
screen_hide_selection(struct screen *s) |
{ |
{ |
struct screen_sel *sel = &s->sel; |
if (s->sel != NULL) |
|
s->sel->hidden = 1; |
sel->hidden = 1; |
|
} |
} |
|
|
/* Check if cell in selection. */ |
/* Check if cell in selection. */ |
int |
int |
screen_check_selection(struct screen *s, u_int px, u_int py) |
screen_check_selection(struct screen *s, u_int px, u_int py) |
{ |
{ |
struct screen_sel *sel = &s->sel; |
struct screen_sel *sel = s->sel; |
u_int xx; |
u_int xx; |
|
|
if (!sel->flag || sel->hidden) |
if (sel == NULL || sel->hidden) |
return (0); |
return (0); |
|
|
if (sel->rectflag) { |
if (sel->rectangle) { |
if (sel->sy < sel->ey) { |
if (sel->sy < sel->ey) { |
/* start line < end line -- downward selection. */ |
/* start line < end line -- downward selection. */ |
if (py < sel->sy || py > sel->ey) |
if (py < sel->sy || py > sel->ey) |
|
|
screen_select_cell(struct screen *s, struct grid_cell *dst, |
screen_select_cell(struct screen *s, struct grid_cell *dst, |
const struct grid_cell *src) |
const struct grid_cell *src) |
{ |
{ |
if (!s->sel.flag || s->sel.hidden) |
if (s->sel == NULL || s->sel->hidden) |
return; |
return; |
|
|
memcpy(dst, &s->sel.cell, sizeof *dst); |
memcpy(dst, &s->sel->cell, sizeof *dst); |
|
|
utf8_copy(&dst->data, &src->data); |
utf8_copy(&dst->data, &src->data); |
dst->attr = dst->attr & ~GRID_ATTR_CHARSET; |
dst->attr = dst->attr & ~GRID_ATTR_CHARSET; |