terminal: Just send the pty master fd to receive the selection.
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 21 Jan 2011 21:23:09 +0000 (16:23 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 21 Jan 2011 21:26:28 +0000 (16:26 -0500)
LOL!!1

clients/terminal.c
clients/window.c
clients/window.h

index 1b36ba9..9254907 100644 (file)
@@ -391,7 +391,6 @@ struct terminal {
        cairo_font_extents_t extents;
        cairo_scaled_font_t *font_normal, *font_bold;
 
-       uint32_t tag;
        struct wl_selection *selection;
        struct wl_selection_offer *selection_offer;
        uint32_t selection_offer_has_text;
@@ -1978,34 +1977,11 @@ static const struct wl_selection_listener selection_listener = {
        selection_listener_cancelled
 };
 
-static gboolean
-selection_io_func(GIOChannel *source, GIOCondition condition, gpointer data)
-{
-       struct terminal *terminal = data;
-       char buffer[256];
-       unsigned int len;
-       int fd;
-
-       fd = g_io_channel_unix_get_fd(source);
-       len = read(fd, buffer, sizeof buffer);
-
-       write(terminal->master, buffer, len);
-
-       close(fd);
-       g_source_remove(terminal->tag);
-
-       g_io_channel_unref(source);
-
-       return TRUE;
-}
-
 static int
 handle_bound_key(struct terminal *terminal,
                 struct input *input, uint32_t sym, uint32_t time)
 {
        struct wl_shell *shell;
-       GIOChannel *channel;
-       int fd;
 
        switch (sym) {
        case XK_C:
@@ -2019,14 +1995,11 @@ handle_bound_key(struct terminal *terminal,
 
                return 1;
        case XK_V:
-               if (input_offers_mime_type(input, "text/plain")) {
-                       fd = input_receive_mime_type(input, "text/plain");
-                       channel = g_io_channel_unix_new(fd);
-                       terminal->tag = g_io_add_watch(channel, G_IO_IN,
-                                                      selection_io_func,
-                                                      terminal);
-               }
-
+               /* Just pass the master fd of the pty to receive the
+                * selection. */
+               if (input_offers_mime_type(input, "text/plain"))
+                       input_receive_mime_type(input, "text/plain",
+                                               terminal->master);
                return 1;
        case XK_X:
                /* cut selection; terminal doesn't do cut */
index f598bcd..e2e59d1 100644 (file)
@@ -1323,23 +1323,18 @@ input_offers_mime_type(struct input *input, const char *type)
        return 0;
 }
 
-int
-input_receive_mime_type(struct input *input, const char *type)
+void
+input_receive_mime_type(struct input *input, const char *type, int fd)
 {
        struct selection_offer *offer = input->offer;
-       int p[2];
 
-       pipe(p);
        /* FIXME: A number of things can go wrong here: the object may
         * not be the current selection offer any more (which could
         * still work, but the source may have gone away or just
         * destroyed its wl_selection) or the offer may not have the
         * requested type after all (programmer/client error,
         * typically) */
-       wl_selection_offer_receive(offer->offer, type, p[1]);
-       close(p[1]);
-
-       return p[0];
+       wl_selection_offer_receive(offer->offer, type, fd);
 }
 
 static void
index 7d6afdc..27811f3 100644 (file)
@@ -232,8 +232,8 @@ input_get_input_device(struct input *input);
 
 int
 input_offers_mime_type(struct input *input, const char *type);
-int
-input_receive_mime_type(struct input *input, const char *type);
+void
+input_receive_mime_type(struct input *input, const char *type, int fd);
 
 
 #endif