+ if (g_isIdle) wxapp_install_idle_handler();
+
+ /* Owen Taylor: "if the drop is not in a drop zone,
+ return FALSE, otherwise, if you aren't accepting
+ the drop, call gtk_drag_finish() with success == FALSE
+ otherwise call gtk_drag_data_get()" */
+
+// printf( "drop.\n" );
+
+ /* this seems to make a difference between not accepting
+ due to wrong target area and due to wrong format. let
+ us hope that this is not required.. */
+
+ /* inform the wxDropTarget about the current GdkDragContext.
+ this is only valid for the duration of this call */
+ drop_target->SetDragContext( context );
+
+ /* inform the wxDropTarget about the current drag widget.
+ this is only valid for the duration of this call */
+ drop_target->SetDragWidget( widget );
+
+ /* inform the wxDropTarget about the current drag time.
+ this is only valid for the duration of this call */
+ drop_target->SetDragTime( time );
+
+/*
+ wxDragResult result = wxDragMove;
+ if (context->suggested_action == GDK_ACTION_COPY) result = wxDragCopy;
+*/
+
+ /* reset the block here as someone might very well
+ show a dialog as a reaction to a drop and this
+ wouldn't work without events */
+ g_blockEventsOnDrag = false;
+
+ bool ret = drop_target->OnDrop( x, y );
+
+ if (!ret)
+ {
+ wxLogTrace(TRACE_DND, wxT( "Drop target: OnDrop returned FALSE") );
+
+ /* cancel the whole thing */
+ gtk_drag_finish( context,
+ FALSE, /* no success */
+ FALSE, /* don't delete data on dropping side */
+ time );
+ }
+ else
+ {
+ wxLogTrace(TRACE_DND, wxT( "Drop target: OnDrop returned TRUE") );
+
+#if wxUSE_THREADS
+ /* disable GUI threads */
+#endif
+
+ GdkAtom format = drop_target->GetMatchingPair();
+
+ // this does happen somehow, see bug 555111
+ wxCHECK_MSG( format, FALSE, wxT("no matching GdkAtom for format?") );
+
+/*
+ GdkDragAction action = GDK_ACTION_MOVE;
+ if (result == wxDragCopy) action == GDK_ACTION_COPY;
+ context->action = action;
+*/
+ /* this should trigger an "drag_data_received" event */
+ gtk_drag_get_data( widget,
+ context,
+ format,
+ time );
+
+#if wxUSE_THREADS
+ /* re-enable GUI threads */
+#endif
+ }
+
+ /* after this, invalidate the drop_target's GdkDragContext */
+ drop_target->SetDragContext( NULL );
+
+ /* after this, invalidate the drop_target's drag widget */
+ drop_target->SetDragWidget( NULL );
+
+ /* this has to be done because GDK has no "drag_enter" event */
+ drop_target->m_firstMotion = true;
+
+ return ret;
+}