Index: gtk/gtkwidget.c
===================================================================
--- gtk/gtkwidget.c	(revision 21631)
+++ gtk/gtkwidget.c	(working copy)
@@ -128,6 +128,7 @@
   KEYNAV_FAILED,
   DRAG_FAILED,
   DAMAGE_EVENT,
+  DRAG_DATA_BEFORE_SEND,
   LAST_SIGNAL
 };
 
@@ -465,6 +466,7 @@
   klass->drag_motion = NULL;
   klass->drag_drop = NULL;
   klass->drag_data_received = NULL;
+  klass->drag_data_before_send = NULL;
   klass->screen_changed = NULL;
   klass->can_activate_accel = gtk_widget_real_can_activate_accel;
   klass->grab_broken_event = NULL;
@@ -1916,7 +1918,33 @@
 		  GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
 		  G_TYPE_UINT,
 		  G_TYPE_UINT);
-  
+
+  /** 
+   * GtkWidget::drag-before-send:
+   * @widget: the object which received the signal
+   * @drag_context: the drag context
+   * @data: the #GtkSelectionData to be filled with the dragged data
+   * @info: the info that has been registered with the target in the 
+   *        #GtkTargetList
+   * @time: the timestamp at which the data was requested
+   *
+   * The ::drag-data-before-send signal is emitted on the drag source just before
+   * dragged data is going to be sent.
+   */
+  widget_signals[DRAG_DATA_BEFORE_SEND] =
+    g_signal_new (I_("drag-data-before-send"),
+		  G_TYPE_FROM_CLASS (gobject_class),
+		  G_SIGNAL_RUN_LAST,
+		  G_STRUCT_OFFSET (GtkWidgetClass, drag_data_before_send),
+		  NULL, NULL,
+		  _gtk_marshal_VOID__OBJECT_BOXED_UINT_UINT,
+		  G_TYPE_NONE, 4,
+		  GDK_TYPE_DRAG_CONTEXT,
+		  GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
+		  G_TYPE_UINT,
+		  G_TYPE_UINT);
+
+
   /**
    * GtkWidget::visibility-notify-event:
    * @widget: the object which received the signal
Index: gtk/gtkwidget.h
===================================================================
--- gtk/gtkwidget.h	(revision 21631)
+++ gtk/gtkwidget.h	(working copy)
@@ -388,6 +388,11 @@
 				    GtkSelectionData   *selection_data,
 				    guint               info,
 				    guint               time_);
+  void (* drag_data_before_send)   (GtkWidget          *widget,
+				    GdkDragContext     *context,
+				    GtkSelectionData   *selection_data,
+				    guint               info,
+				    guint               time_);
 
   /* Signals used only for keybindings */
   gboolean (* popup_menu)          (GtkWidget          *widget);
Index: gtk/gtkdnd.c
===================================================================
--- gtk/gtkdnd.c	(revision 21631)
+++ gtk/gtkdnd.c	(working copy)
@@ -3541,6 +3541,11 @@
 				     info->context, &selection_data,
 				     pair->info,
 				     time);
+
+	      g_signal_emit_by_name (info->widget, "drag-data-before-send",
+				     info->context, &selection_data,
+				     pair->info,
+				     time);
 	      
 	      /* FIXME: Should we check for length >= 0 here? */
 	      gtk_drag_drop_finished (info, GTK_DRAG_RESULT_SUCCESS, time);
