terminal: Just send the pty master fd to receive the selection.
LOL!!1
This commit is contained in:
parent
31cce0533f
commit
6bccebee23
|
@ -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…
Reference in New Issue