]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dnd.cpp
use IMPLEMENT_APP_CONSOLE and not IMPLEMENT_APP for console apps
[wxWidgets.git] / src / gtk / dnd.cpp
index c995a53350540539662f9447732e92b362aee5e8..2c54f0805d376a51b24b3ca900e63924cd20af6b 100644 (file)
@@ -23,6 +23,8 @@
     #include "wx/gdicmn.h"
 #endif
 
+#include "wx/scopeguard.h"
+
 #include <gtk/gtk.h>
 
 //----------------------------------------------------------------------------
@@ -194,6 +196,16 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
        return FALSE, otherwise call gtk_drag_status() and
        return TRUE" */
 
+#if 0
+    wxPrintf( "motion\n" );
+    GList *tmp_list;
+    for (tmp_list = context->targets; tmp_list; tmp_list = tmp_list->next)
+    {
+        wxString atom = wxString::FromAscii( gdk_atom_name (GDK_POINTER_TO_ATOM (tmp_list->data)) );
+        wxPrintf( "Atom: %s\n", atom );
+    }
+#endif
+
     /* inform the wxDropTarget about the current GdkDragContext.
        this is only valid for the duration of this call */
     drop_target->SetDragContext( context );
@@ -206,27 +218,28 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     if (drop_target->GetDefaultAction() == wxDragNone)
     {
         // use default action set by wxDropSource::DoDragDrop()
-    if ( (gs_flagsForDrag & wxDrag_DefaultMove) == wxDrag_DefaultMove &&
+        if ( (gs_flagsForDrag & wxDrag_DefaultMove) == wxDrag_DefaultMove &&
             (context->actions & GDK_ACTION_MOVE ) )
-    {
-        // move is requested by the program and allowed by GTK+ - do it, even
-        // though suggested_action may be currently wxDragCopy
-        result = wxDragMove;
-    }
-    else // use whatever GTK+ says we should
-    {
-        result = ConvertFromGTK(context->suggested_action);
-
-        if ( (result == wxDragMove) && !(gs_flagsForDrag & wxDrag_AllowMove) )
         {
-            // we're requested to move but we can't
-            result = wxDragCopy;
+             // move is requested by the program and allowed by GTK+ - do it, even
+            // though suggested_action may be currently wxDragCopy
+            result = wxDragMove;
+        }
+        else // use whatever GTK+ says we should
+        {
+            result = ConvertFromGTK(context->suggested_action);
+
+            if ( (result == wxDragMove) && !(gs_flagsForDrag & wxDrag_AllowMove) )
+            {
+                // we're requested to move but we can't
+                result = wxDragCopy;
+            }
         }
-    }
     }
     else if (drop_target->GetDefaultAction() == wxDragMove &&
                 (context->actions & GDK_ACTION_MOVE))
     {
+        
        result = wxDragMove;
     }
     else
@@ -291,8 +304,6 @@ static gboolean target_drag_drop( GtkWidget *widget,
        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.. */
@@ -813,10 +824,8 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
     if (g_lastMouseEvent == NULL)
         return wxDragNone;
 
-    // disabled for now
-    g_blockEventsOnDrag = true;
-
-    RegisterWindow();
+    GTKConnectDragSignals();
+    wxON_BLOCK_EXIT_OBJ0(*this, wxDropSource::GTKDisconnectDragSignals);
 
     m_waiting = true;
 
@@ -850,6 +859,12 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
                 g_lastButtonNumber,  // number of mouse button which started drag
                 (GdkEvent*) g_lastMouseEvent );
 
+    if ( !context )
+    {
+        // this can happen e.g. if gdk_pointer_grab() failed
+        return wxDragError;
+    }
+
     m_dragContext = context;
 
     PrepareIcon( action, context );
@@ -861,16 +876,15 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
     if ( m_retValue == wxDragNone )
          m_retValue = wxDragCancel;
 
-    g_blockEventsOnDrag = false;
-
-    UnregisterWindow();
-
     return m_retValue;
 }
 
-void wxDropSource::RegisterWindow()
+void wxDropSource::GTKConnectDragSignals()
 {
-    if (!m_widget) return;
+    if (!m_widget)
+        return;
+
+    g_blockEventsOnDrag = true;
 
     g_signal_connect (m_widget, "drag_data_get",
                       G_CALLBACK (source_drag_data_get), this);
@@ -879,11 +893,13 @@ void wxDropSource::RegisterWindow()
 
 }
 
-void wxDropSource::UnregisterWindow()
+void wxDropSource::GTKDisconnectDragSignals()
 {
     if (!m_widget)
         return;
 
+    g_blockEventsOnDrag = false;
+
     g_signal_handlers_disconnect_by_func (m_widget,
                                           (gpointer) source_drag_data_get,
                                           this);