diff --git a/clients/terminal.c b/clients/terminal.c index 1b36ba9d..92549071 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -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 */ diff --git a/clients/window.c b/clients/window.c index f598bcd2..e2e59d10 100644 --- a/clients/window.c +++ b/clients/window.c @@ -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 diff --git a/clients/window.h b/clients/window.h index 7d6afdc5..27811f3f 100644 --- a/clients/window.h +++ b/clients/window.h @@ -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