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

LOL!!1
dev
Kristian Høgsberg 14 years ago
parent 31cce0533f
commit 6bccebee23
  1. 37
      clients/terminal.c
  2. 11
      clients/window.c
  3. 4
      clients/window.h

@ -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 */

@ -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

@ -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

Loading…
Cancel
Save