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_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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue