diff -up evolution-3.22.6/composer/e-msg-composer.c.composer-dnd evolution-3.22.6/composer/e-msg-composer.c --- evolution-3.22.6/composer/e-msg-composer.c.composer-dnd 2017-04-13 14:06:08.863067766 +0200 +++ evolution-3.22.6/composer/e-msg-composer.c 2017-04-13 14:06:08.878067765 +0200 @@ -1867,6 +1867,16 @@ msg_composer_drag_drop_cb (GtkWidget *wi } static void +msg_composer_drop_handled_cb (EContentEditor *cnt_editor, + EMsgComposer *composer) +{ + if (composer->priv->drag_data_received_handler_id != 0) { + g_signal_handler_disconnect (cnt_editor, composer->priv->drag_data_received_handler_id); + composer->priv->drag_data_received_handler_id = 0; + } +} + +static void msg_composer_drag_begin_cb (GtkWidget *widget, GdkDragContext *context, EMsgComposer *composer) @@ -2272,6 +2282,10 @@ msg_composer_constructed (GObject *objec G_CALLBACK (msg_composer_drag_begin_cb), composer); g_signal_connect ( + cnt_editor, "drop-handled", + G_CALLBACK (msg_composer_drop_handled_cb), composer); + + g_signal_connect ( composer->priv->gallery_icon_view, "drag-data-get", G_CALLBACK (msg_composer_gallery_drag_data_get), NULL); diff -up evolution-3.22.6/e-util/e-content-editor.c.composer-dnd evolution-3.22.6/e-util/e-content-editor.c --- evolution-3.22.6/e-util/e-content-editor.c.composer-dnd 2016-11-30 20:06:07.000000000 +0100 +++ evolution-3.22.6/e-util/e-content-editor.c 2017-04-13 14:06:08.878067765 +0200 @@ -36,6 +36,7 @@ enum { CONTEXT_MENU_REQUESTED, FIND_DONE, REPLACE_ALL_DONE, + DROP_HANDLED, LAST_SIGNAL }; @@ -509,6 +510,20 @@ e_content_editor_default_init (EContentE NULL, G_TYPE_NONE, 1, G_TYPE_UINT); + + /** + * EContentEditor:drop-handled + * + * Emitted when the content editor successfully handled the drop operation. + */ + signals[DROP_HANDLED] = g_signal_new ( + "drop-handled", + E_TYPE_CONTENT_EDITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EContentEditorInterface, drop_handled), + NULL, NULL, + NULL, + G_TYPE_NONE, 0); } ESpellChecker * @@ -3581,3 +3596,11 @@ e_content_editor_emit_replace_all_done ( g_signal_emit (editor, signals[REPLACE_ALL_DONE], 0, replaced_count); } + +void +e_content_editor_emit_drop_handled (EContentEditor *editor) +{ + g_return_if_fail (E_IS_CONTENT_EDITOR (editor)); + + g_signal_emit (editor, signals[DROP_HANDLED], 0); +} diff -up evolution-3.22.6/e-util/e-content-editor.h.composer-dnd evolution-3.22.6/e-util/e-content-editor.h --- evolution-3.22.6/e-util/e-content-editor.h.composer-dnd 2016-09-19 10:22:58.000000000 +0200 +++ evolution-3.22.6/e-util/e-content-editor.h 2017-04-13 14:06:08.878067765 +0200 @@ -437,6 +437,7 @@ struct _EContentEditorInterface { guint match_count); void (*replace_all_done) (EContentEditor *editor, guint replaced_count); + void (*drop_handled) (EContentEditor *editor); }; /* Properties */ @@ -1015,6 +1016,8 @@ void e_content_editor_emit_find_done (E void e_content_editor_emit_replace_all_done (EContentEditor *editor, guint replaced_count); +void e_content_editor_emit_drop_handled + (EContentEditor *editor); G_END_DECLS diff -up evolution-3.22.6/modules/webkit-editor/e-webkit-editor.c.composer-dnd evolution-3.22.6/modules/webkit-editor/e-webkit-editor.c --- evolution-3.22.6/modules/webkit-editor/e-webkit-editor.c.composer-dnd 2017-04-13 14:06:08.875067765 +0200 +++ evolution-3.22.6/modules/webkit-editor/e-webkit-editor.c 2017-04-13 14:06:28.256067497 +0200 @@ -5913,10 +5913,16 @@ webkit_editor_drag_data_received_cb (Gtk info == E_DND_TARGET_TYPE_UTF8_STRING || info == E_DND_TARGET_TYPE_STRING || info == E_DND_TARGET_TYPE_TEXT_PLAIN || info == E_DND_TARGET_TYPE_TEXT_PLAIN_UTF8) { gdk_drag_status (context, gdk_drag_context_get_selected_action(context), time); - GTK_WIDGET_CLASS (e_webkit_editor_parent_class)->drag_drop (widget, context, x, y, time); - g_signal_stop_emission_by_name (widget, "drag-data-received"); - if (!is_move) - webkit_editor_call_simple_extension_function (wk_editor, "DOMLastDropOperationDidCopy"); + if (!GTK_WIDGET_CLASS (e_webkit_editor_parent_class)->drag_drop (widget, context, x, y, time)) { + g_warning ("Drop failed in WebKit"); + goto process_ourselves; + } else { + GTK_WIDGET_CLASS (e_webkit_editor_parent_class)->drag_leave(widget, context, time); + g_signal_stop_emission_by_name (widget, "drag-data-received"); + if (!is_move) + webkit_editor_call_simple_extension_function (wk_editor, "DOMLastDropOperationDidCopy"); + e_content_editor_emit_drop_handled (E_CONTENT_EDITOR (widget)); + } return; } @@ -5926,6 +5932,7 @@ webkit_editor_drag_data_received_cb (Gtk gint list_len, len; gchar *text; + process_ourselves: data = gtk_selection_data_get_data (selection); length = gtk_selection_data_get_length (selection); @@ -5949,10 +5956,21 @@ webkit_editor_drag_data_received_cb (Gtk gtk_drag_finish (context, TRUE, is_move, time); g_signal_stop_emission_by_name (widget, "drag-data-received"); + e_content_editor_emit_drop_handled (E_CONTENT_EDITOR (widget)); return; } } +static void +webkit_editor_drag_leave_cb (EWebKitEditor *wk_editor, + GdkDragContext *context, + guint time) +{ + /* Don't pass drag-leave to WebKit otherwise the drop won't be handled by it. + * We will emit it later when WebKit is expecting it. */ + g_signal_stop_emission_by_name (GTK_WIDGET (wk_editor), "drag-leave"); +} + static gboolean webkit_editor_drag_drop_cb (EWebKitEditor *wk_editor, GdkDragContext *context, @@ -6255,6 +6273,10 @@ e_webkit_editor_init (EWebKitEditor *wk_ G_CALLBACK (webkit_editor_drag_end_cb), NULL); g_signal_connect ( + wk_editor, "drag-leave", + G_CALLBACK (webkit_editor_drag_leave_cb), NULL); + + g_signal_connect ( wk_editor, "drag-drop", G_CALLBACK (webkit_editor_drag_drop_cb), NULL);