handle failure of gtk_drag_begin() (which can happen e.g. because gdk_pointer_grab() failed) in DoDragDrop() (patch 1825237) + minor cleanup in trunk version of the code
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49608 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -80,10 +80,6 @@ public:
 | 
			
		||||
    // start drag action
 | 
			
		||||
    virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly);
 | 
			
		||||
 | 
			
		||||
    // GTK implementation
 | 
			
		||||
    void RegisterWindow();
 | 
			
		||||
    void UnregisterWindow();
 | 
			
		||||
 | 
			
		||||
    void PrepareIcon( int action, GdkDragContext *context );
 | 
			
		||||
 | 
			
		||||
    GtkWidget       *m_widget;
 | 
			
		||||
@@ -103,6 +99,11 @@ private:
 | 
			
		||||
    void SetIcons(const wxIcon& copy,
 | 
			
		||||
                  const wxIcon& move,
 | 
			
		||||
                  const wxIcon& none);
 | 
			
		||||
 | 
			
		||||
    // GTK implementation
 | 
			
		||||
    void GTKConnectDragSignals();
 | 
			
		||||
    void GTKDisconnectDragSignals();
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // _WX_GTK_DND_H_
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,8 @@
 | 
			
		||||
    #include "wx/gdicmn.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "wx/scopeguard.h"
 | 
			
		||||
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
@@ -813,10 +815,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 +850,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 +867,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 +884,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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user