Actually send selected text when pasting
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 21 Jan 2011 20:18:55 +0000 (15:18 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 21 Jan 2011 20:18:55 +0000 (15:18 -0500)
clients/terminal.c

index 8ede48a..1b36ba9 100644 (file)
@@ -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);