X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d084560f84305e281fc00f9c2c68720312c1e73..c40ce5ce77b63f669f44e35f4f71418ae90d6291:/src/gtk/dnd.cpp diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index 745dec2fdb..a95bf1c889 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -50,6 +50,11 @@ extern void wxapp_uninstall_thread_wakeup(); extern bool g_blockEventsOnDrag; +// the trace mask we use with wxLogTrace() - call +// wxLog::AddTraceMask(TRACE_DND) to enable the trace messages from here +// (there are quite a few of them, so don't enable this by default) +static const wxChar *TRACE_DND = _T("dnd"); + //---------------------------------------------------------------------------- // standard icons //---------------------------------------------------------------------------- @@ -226,11 +231,16 @@ static gboolean target_drag_drop( GtkWidget *widget, 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) { - wxLogDebug( wxT( "Drop target: OnDrop returned FALSE") ); + wxLogTrace(TRACE_DND, wxT( "Drop target: OnDrop returned FALSE") ); /* cancel the whole thing */ gtk_drag_finish( context, @@ -240,7 +250,7 @@ static gboolean target_drag_drop( GtkWidget *widget, } else { - wxLogDebug( wxT( "Drop target: OnDrop returned TRUE") ); + wxLogTrace(TRACE_DND, wxT( "Drop target: OnDrop returned TRUE") ); #if wxUSE_THREADS /* disable GUI threads */ @@ -306,7 +316,7 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget), return; } - wxLogDebug( wxT( "Drop target: data received event") ); + wxLogTrace(TRACE_DND, wxT( "Drop target: data received event") ); /* inform the wxDropTarget about the current GtkSelectionData. this is only valid for the duration of this call */ @@ -320,14 +330,14 @@ static void target_drag_data_received( GtkWidget *WXUNUSED(widget), if ( wxIsDragResultOk( drop_target->OnData( x, y, result ) ) ) { - wxLogDebug( wxT( "Drop target: OnData returned TRUE") ); + wxLogTrace(TRACE_DND, wxT( "Drop target: OnData returned TRUE") ); /* tell GTK that data transfer was successfull */ gtk_drag_finish( context, TRUE, FALSE, time ); } else { - wxLogDebug( wxT( "Drop target: OnData returned FALSE") ); + wxLogTrace(TRACE_DND, wxT( "Drop target: OnData returned FALSE") ); /* tell GTK that data transfer was not successfull */ gtk_drag_finish( context, FALSE, FALSE, time ); @@ -401,7 +411,8 @@ GdkAtom wxDropTarget::GetMatchingPair() wxDataFormat format( formatAtom ); #ifdef __WXDEBUG__ - wxLogDebug( wxT("Drop target: drag has format: %s"), format.GetId().c_str() ); + wxLogTrace(TRACE_DND, wxT("Drop target: drag has format: %s"), + format.GetId().c_str()); #endif // Debug if (m_dataObject->IsSupportedFormat( format )) @@ -499,7 +510,8 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), wxDataFormat format( selection_data->target ); - wxLogDebug( wxT("Drop source: format requested: %s"), format.GetId().c_str() ); + wxLogTrace(TRACE_DND, wxT("Drop source: format requested: %s"), + format.GetId().c_str()); drop_source->m_retValue = wxDragCancel; @@ -507,19 +519,19 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), if (!data) { - wxLogDebug( wxT("Drop source: no data object") ); + wxLogTrace(TRACE_DND, wxT("Drop source: no data object") ); return; } if (!data->IsSupportedFormat(format)) { - wxLogDebug( wxT("Drop source: unsupported format") ); + wxLogTrace(TRACE_DND, wxT("Drop source: unsupported format") ); return; } if (data->GetDataSize(format) == 0) { - wxLogDebug( wxT("Drop source: empty data") ); + wxLogTrace(TRACE_DND, wxT("Drop source: empty data") ); return; } @@ -558,9 +570,9 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), // "drag_data_delete" //---------------------------------------------------------------------------- -static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), - GdkDragContext *WXUNUSED(context), - wxDropSource *WXUNUSED(drop_source) ) +static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), + GdkDragContext *context, + wxDropSource *WXUNUSED(drop_source) ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -740,8 +752,12 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) if (m_data->GetFormatCount() == 0) return (wxDragResult) wxDragNone; + // still in drag + if (g_blockEventsOnDrag) + return (wxDragResult) wxDragNone; + // disabled for now - g_blockEventsOnDrag = FALSE; + g_blockEventsOnDrag = TRUE; RegisterWindow(); @@ -754,7 +770,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) for (size_t i = 0; i < m_data->GetFormatCount(); i++) { GdkAtom atom = array[i]; - wxLogDebug( wxT("Drop source: Supported atom %s"), gdk_atom_name( atom ) ); + wxLogTrace(TRACE_DND, wxT("Drop source: Supported atom %s"), gdk_atom_name( atom )); gtk_target_list_add( target_list, atom, 0, 0 ); } delete[] array; @@ -784,11 +800,12 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) /* don't start dragging if no button is down */ if (button_number) { - GdkDragAction action = GDK_ACTION_COPY; - if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); + int action = GDK_ACTION_COPY; + if ( allowMove ) + action |= GDK_ACTION_MOVE; GdkDragContext *context = gtk_drag_begin( m_widget, target_list, - action, + (GdkDragAction)action, button_number, /* number of mouse button which started drag */ (GdkEvent*) &event );