terminal: Accept utf-8 text drop
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Sep 2013 03:41:06 +0000 (20:41 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Sep 2013 03:41:06 +0000 (20:41 -0700)
clients/terminal.c
clients/window.c
clients/window.h

index e298f9e..c3bb1b0 100644 (file)
@@ -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);
index c1fc3e7..6854745 100644 (file)
@@ -3797,6 +3797,16 @@ input_receive_drag_data(struct input *input, const char *mime_type,
 }
 
 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)
 {
index a2bab90..4427ab5 100644 (file)
@@ -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,