Actually send selected text when pasting

dev
Kristian Høgsberg 14 years ago
parent e164e4ef72
commit 31cce0533f
  1. 41
      clients/terminal.c

@ -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…
Cancel
Save