terminal: Accept utf-8 text drop
diff --git a/clients/terminal.c b/clients/terminal.c
index e298f9e..c3bb1b0 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -2128,6 +2128,37 @@
 	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 @@
 	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 c1fc3e7..6854745 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -3797,6 +3797,16 @@
 }
 
 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 a2bab90..4427ab5 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -555,6 +555,9 @@
 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,