X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/10bd1f7d3bae0955cc7244c8c35d5e1151517c94..3201a1046ba71ba8e5ef2ed694fde34d12f743f3:/src/gtk/dnd.cpp?ds=sidebyside diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index c995a53350..2c54f0805d 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -23,6 +23,8 @@ #include "wx/gdicmn.h" #endif +#include "wx/scopeguard.h" + #include //---------------------------------------------------------------------------- @@ -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);