From 0749e3f470a9d1cb7ec78c199962b84dce72e1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 4 Sep 2013 20:41:06 -0700 Subject: [PATCH] terminal: Accept utf-8 text drop --- clients/terminal.c | 34 ++++++++++++++++++++++++++++++++++ clients/window.c | 10 ++++++++++ clients/window.h | 3 +++ 3 files changed, 47 insertions(+) diff --git a/clients/terminal.c b/clients/terminal.c index e298f9e5..c3bb1b0b 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -2128,6 +2128,37 @@ static const struct wl_data_source_listener data_source_listener = { data_source_cancelled }; +static const char text_mime_type[] = "text/plain;charset=utf-8"; + +static void +data_handler(struct window *window, + struct input *input, + float x, float y, const char **types, void *data) +{ + int i, has_text = 0; + + if (!types) + return; + for (i = 0; types[i]; i++) + if (strcmp(types[i], text_mime_type) == 0) + has_text = 1; + + if (!has_text) { + input_accept(input, NULL); + } else { + input_accept(input, text_mime_type); + } +} + +static void +drop_handler(struct window *window, struct input *input, + int32_t x, int32_t y, void *data) +{ + struct terminal *terminal = data; + + input_receive_drag_data_to_fd(input, text_mime_type, terminal->master); +} + static void fullscreen_handler(struct window *window, void *data) { @@ -2630,6 +2661,9 @@ terminal_create(struct display *display) window_set_output_handler(terminal->window, output_handler); window_set_close_handler(terminal->window, close_handler); + window_set_data_handler(terminal->window, data_handler); + window_set_drop_handler(terminal->window, drop_handler); + widget_set_redraw_handler(terminal->widget, redraw_handler); widget_set_resize_handler(terminal->widget, resize_handler); widget_set_button_handler(terminal->widget, button_handler); diff --git a/clients/window.c b/clients/window.c index c1fc3e74..68547452 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3796,6 +3796,16 @@ input_receive_drag_data(struct input *input, const char *mime_type, input->drag_offer->y = input->sy; } +int +input_receive_drag_data_to_fd(struct input *input, + const char *mime_type, int fd) +{ + if (input->drag_offer) + wl_data_offer_receive(input->drag_offer->offer, mime_type, fd); + + return 0; +} + int input_receive_selection_data(struct input *input, const char *mime_type, data_func_t func, void *data) diff --git a/clients/window.h b/clients/window.h index a2bab90f..4427ab5a 100644 --- a/clients/window.h +++ b/clients/window.h @@ -555,6 +555,9 @@ input_accept(struct input *input, const char *type); void input_receive_drag_data(struct input *input, const char *mime_type, data_func_t func, void *user_data); +int +input_receive_drag_data_to_fd(struct input *input, + const char *mime_type, int fd); int input_receive_selection_data(struct input *input, const char *mime_type,