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;
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:
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 */
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