]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dnd.cpp
Applied dir control token patch.
[wxWidgets.git] / src / gtk / dnd.cpp
index ca8a96f4b620c6c7ef9ff146ab1f9f721b99cfa4..b8b6ecfb7f76de4eb897a2fd6da1e91eb4675b87 100644 (file)
@@ -7,12 +7,17 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "dnd.h"
 #endif
 
-#include "wx/dnd.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
+#include "wx/dnd.h"
+#include "wx/log.h"
+                                                                              
+                                                                               
 #if wxUSE_DRAG_AND_DROP
 
 #include "wx/window.h"
@@ -110,7 +115,7 @@ static const char * page_xpm[] = {
 // ============================================================================
 
 // ----------------------------------------------------------------------------
-// convert between GTK+ and wxWindows DND constants
+// convert between GTK+ and wxWidgets DND constants
 // ----------------------------------------------------------------------------
 
 static wxDragResult ConvertFromGTK(long action)
@@ -182,6 +187,9 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     // only good if we don't have our own preferences - but also the actions
     // field
     wxDragResult result;
+    if (drop_target->GetDefaultAction() == wxDragNone)
+    {
+        // use default action set by wxDropSource::DoDragDrop()
     if ( (gs_flagsForDrag & wxDrag_DefaultMove) == wxDrag_DefaultMove &&
             (context->actions & GDK_ACTION_MOVE ) )
     {
@@ -199,6 +207,21 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
             result = wxDragCopy;
         }
     }
+    }
+    else if (drop_target->GetDefaultAction() == wxDragMove &&
+                (context->actions & GDK_ACTION_MOVE))
+    {
+       result = wxDragMove;
+    }
+    else
+    {
+        if (context->actions & GDK_ACTION_COPY)
+            result = wxDragCopy;
+        else if (context->actions & GDK_ACTION_MOVE)
+            result = wxDragMove;
+        else
+            result = wxDragNone;
+    }
 
     if (drop_target->m_firstMotion)
     {
@@ -301,7 +324,9 @@ static gboolean target_drag_drop( GtkWidget *widget,
 #endif
 
         GdkAtom format = drop_target->GetMatchingPair();
-        wxASSERT( format );
+
+        // this does happen somehow, see bug 555111
+        wxCHECK_MSG( format, FALSE, _T("no matching GdkAtom for format?") )
 
 /*
         GdkDragAction action = GDK_ACTION_MOVE;
@@ -364,7 +389,7 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget),
        this is only valid for the duration of this call */
     drop_target->SetDragData( data );
 
-    wxDragResult result = ConvertFromGTK(context->suggested_action);
+    wxDragResult result = ConvertFromGTK(context->action);
 
     if ( wxIsDragResultOk( drop_target->OnData( x, y, result ) ) )
     {