terminal: Just send the pty master fd to receive the selection.

LOL!!1
This commit is contained in:
Kristian Høgsberg 2011-01-21 16:23:09 -05:00
parent 31cce0533f
commit 6bccebee23
3 changed files with 10 additions and 42 deletions

View File

@ -391,7 +391,6 @@ struct terminal {
cairo_font_extents_t extents; cairo_font_extents_t extents;
cairo_scaled_font_t *font_normal, *font_bold; cairo_scaled_font_t *font_normal, *font_bold;
uint32_t tag;
struct wl_selection *selection; struct wl_selection *selection;
struct wl_selection_offer *selection_offer; struct wl_selection_offer *selection_offer;
uint32_t selection_offer_has_text; uint32_t selection_offer_has_text;
@ -1978,34 +1977,11 @@ static const struct wl_selection_listener selection_listener = {
selection_listener_cancelled 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 static int
handle_bound_key(struct terminal *terminal, handle_bound_key(struct terminal *terminal,
struct input *input, uint32_t sym, uint32_t time) struct input *input, uint32_t sym, uint32_t time)
{ {
struct wl_shell *shell; struct wl_shell *shell;
GIOChannel *channel;
int fd;
switch (sym) { switch (sym) {
case XK_C: case XK_C:
@ -2019,14 +1995,11 @@ handle_bound_key(struct terminal *terminal,
return 1; return 1;
case XK_V: case XK_V:
if (input_offers_mime_type(input, "text/plain")) { /* Just pass the master fd of the pty to receive the
fd = input_receive_mime_type(input, "text/plain"); * selection. */
channel = g_io_channel_unix_new(fd); if (input_offers_mime_type(input, "text/plain"))
terminal->tag = g_io_add_watch(channel, G_IO_IN, input_receive_mime_type(input, "text/plain",
selection_io_func, terminal->master);
terminal);
}
return 1; return 1;
case XK_X: case XK_X:
/* cut selection; terminal doesn't do cut */ /* cut selection; terminal doesn't do cut */

View File

@ -1323,23 +1323,18 @@ input_offers_mime_type(struct input *input, const char *type)
return 0; return 0;
} }
int void
input_receive_mime_type(struct input *input, const char *type) input_receive_mime_type(struct input *input, const char *type, int fd)
{ {
struct selection_offer *offer = input->offer; struct selection_offer *offer = input->offer;
int p[2];
pipe(p);
/* FIXME: A number of things can go wrong here: the object may /* FIXME: A number of things can go wrong here: the object may
* not be the current selection offer any more (which could * not be the current selection offer any more (which could
* still work, but the source may have gone away or just * still work, but the source may have gone away or just
* destroyed its wl_selection) or the offer may not have the * destroyed its wl_selection) or the offer may not have the
* requested type after all (programmer/client error, * requested type after all (programmer/client error,
* typically) */ * typically) */
wl_selection_offer_receive(offer->offer, type, p[1]); wl_selection_offer_receive(offer->offer, type, fd);
close(p[1]);
return p[0];
} }
static void static void

View File

@ -232,8 +232,8 @@ input_get_input_device(struct input *input);
int int
input_offers_mime_type(struct input *input, const char *type); input_offers_mime_type(struct input *input, const char *type);
int void
input_receive_mime_type(struct input *input, const char *type); input_receive_mime_type(struct input *input, const char *type, int fd);
#endif #endif