mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-31 22:25:25 -04:00
Actually send selected text when pasting
This commit is contained in:
parent
e164e4ef72
commit
31cce0533f
1 changed files with 33 additions and 8 deletions
|
|
@ -319,7 +319,7 @@ struct attr {
|
|||
char a; /* attributes format:
|
||||
* 76543210
|
||||
* cilub */
|
||||
char r; /* reserved */
|
||||
char s; /* in selection */
|
||||
};
|
||||
struct color_scheme {
|
||||
struct terminal_color palette[16];
|
||||
|
|
@ -530,7 +530,7 @@ terminal_decode_attr(struct terminal *terminal, int row, int col,
|
|||
{
|
||||
struct attr attr;
|
||||
int foreground, background, tmp;
|
||||
int inverse = 0, start_cmp, end_cmp;
|
||||
int start_cmp, end_cmp;
|
||||
|
||||
start_cmp =
|
||||
terminal_compare_position(terminal,
|
||||
|
|
@ -542,15 +542,16 @@ terminal_decode_attr(struct terminal *terminal, int row, int col,
|
|||
terminal->selection_end_x,
|
||||
terminal->selection_end_y,
|
||||
row, col);
|
||||
decoded->attr.s = 0;
|
||||
if (start_cmp < 0 && end_cmp > 0)
|
||||
inverse = 1;
|
||||
decoded->attr.s = 1;
|
||||
else if (end_cmp < 0 && start_cmp > 0)
|
||||
inverse = 1;
|
||||
decoded->attr.s = 1;
|
||||
|
||||
/* get the attributes for this character cell */
|
||||
attr = terminal_get_attr_row(terminal, row)[col];
|
||||
if ((attr.a & ATTRMASK_INVERSE) ||
|
||||
inverse ||
|
||||
decoded->attr.s ||
|
||||
((terminal->mode & MODE_SHOW_CURSOR) &&
|
||||
terminal->focused && terminal->row == row &&
|
||||
terminal->column == col)) {
|
||||
|
|
@ -580,6 +581,7 @@ terminal_decode_attr(struct terminal *terminal, int row, int col,
|
|||
decoded->attr.a = attr.a;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
terminal_scroll_buffer(struct terminal *terminal, int d)
|
||||
{
|
||||
|
|
@ -816,6 +818,30 @@ terminal_set_color(struct terminal *terminal, cairo_t *cr, int index)
|
|||
terminal->color_table[index].a);
|
||||
}
|
||||
|
||||
static void
|
||||
terminal_send_selection(struct terminal *terminal, int fd)
|
||||
{
|
||||
int row, col;
|
||||
union utf8_char *p_row;
|
||||
union decoded_attr attr;
|
||||
FILE *fp;
|
||||
int len;
|
||||
|
||||
fp = fdopen(fd, "w");
|
||||
for (row = 0; row < terminal->height; row++) {
|
||||
p_row = terminal_get_row(terminal, row);
|
||||
for (col = 0; col < terminal->width; col++) {
|
||||
/* get the attributes for this character cell */
|
||||
terminal_decode_attr(terminal, row, col, &attr);
|
||||
if (!attr.attr.s)
|
||||
continue;
|
||||
len = strnlen((char *) p_row[col].byte, 4);
|
||||
fwrite(p_row[col].byte, 1, len, fp);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
struct glyph_run {
|
||||
struct terminal *terminal;
|
||||
cairo_t *cr;
|
||||
|
|
@ -1933,10 +1959,10 @@ static void
|
|||
selection_listener_send(void *data, struct wl_selection *selection,
|
||||
const char *mime_type, int fd)
|
||||
{
|
||||
static const char msg[] = "selection data";
|
||||
struct terminal *terminal = data;
|
||||
|
||||
fprintf(stderr, "selection send, fd is %d\n", fd);
|
||||
write(fd, msg, sizeof msg - 1);
|
||||
terminal_send_selection(terminal, fd);
|
||||
close(fd);
|
||||
}
|
||||
|
||||
|
|
@ -1962,7 +1988,6 @@ selection_io_func(GIOChannel *source, GIOCondition condition, gpointer data)
|
|||
|
||||
fd = g_io_channel_unix_get_fd(source);
|
||||
len = read(fd, buffer, sizeof buffer);
|
||||
fprintf(stderr, "read %d bytes: %.*s\n", len, len, buffer);
|
||||
|
||||
write(terminal->master, buffer, len);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue