X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/510fc784c0c7002488bcaad881901176554f7c32..d52e91c98083f6ec9d7c4a9e392240e6fad5ed04:/src/gtk/dnd.cpp diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index 272530603b..e9db01eda4 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -226,6 +226,11 @@ 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) @@ -500,11 +505,11 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), wxDataFormat format( selection_data->target ); wxLogDebug( wxT("Drop source: format requested: %s"), format.GetId().c_str() ); - + drop_source->m_retValue = wxDragCancel; wxDataObject *data = drop_source->GetDataObject(); - + if (!data) { wxLogDebug( wxT("Drop source: no data object") ); @@ -562,7 +567,7 @@ static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_data_delete\n" ); @@ -576,7 +581,7 @@ static void source_drag_begin( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { - if (g_isIdle) + if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_begin.\n" ); @@ -620,7 +625,10 @@ gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigur // wxDropSource //--------------------------------------------------------------------------- -wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -632,11 +640,14 @@ wxDropSource::wxDropSource( wxWindow *win, const wxIcon &icon ) m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); } -wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &icon ) +wxDropSource::wxDropSource(wxDataObject& data, + wxWindow *win, + const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) { m_waiting = TRUE; @@ -650,32 +661,64 @@ wxDropSource::wxDropSource( wxDataObject& data, wxWindow *win, const wxIcon &ico m_retValue = wxDragCancel; - m_icon = icon; - if (wxNullIcon == icon) m_icon = wxIcon( page_xpm ); + SetIcons(iconCopy, iconMove, iconNone); +} + +void wxDropSource::SetIcons(const wxIcon &iconCopy, + const wxIcon &iconMove, + const wxIcon &iconNone) +{ + m_iconCopy = iconCopy; + m_iconMove = iconMove; + m_iconNone = iconNone; + + if ( !m_iconCopy.Ok() ) + m_iconCopy = wxIcon(page_xpm); + if ( !m_iconMove.Ok() ) + m_iconMove = m_iconCopy; + if ( !m_iconNone.Ok() ) + m_iconNone = m_iconCopy; } wxDropSource::~wxDropSource() { } -void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) +void wxDropSource::PrepareIcon( int action, GdkDragContext *context ) { - GdkBitmap *mask = (GdkBitmap *) NULL; - if (m_icon.GetMask()) mask = m_icon.GetMask()->GetBitmap(); - GdkPixmap *pixmap = m_icon.GetPixmap(); + // get the right icon to display + wxIcon *icon = NULL; + if ( action & GDK_ACTION_MOVE ) + icon = &m_iconMove; + else if ( action & GDK_ACTION_COPY ) + icon = &m_iconCopy; + else + icon = &m_iconNone; + + GdkBitmap *mask; + if ( icon->GetMask() ) + mask = icon->GetMask()->GetBitmap(); + else + mask = (GdkBitmap *)NULL; + + GdkPixmap *pixmap = icon->GetPixmap(); gint width,height; gdk_window_get_size (pixmap, &width, &height); GdkColormap *colormap = gtk_widget_get_colormap( m_widget ); +#ifndef __WXGTK20__ gtk_widget_push_visual (gdk_colormap_get_visual (colormap)); +#endif gtk_widget_push_colormap (colormap); m_iconWindow = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_events (m_iconWindow, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_widget_set_app_paintable (GTK_WIDGET (m_iconWindow), TRUE); +#ifndef __WXGTK20__ gtk_widget_pop_visual (); +#endif gtk_widget_pop_colormap (); gtk_widget_set_usize (m_iconWindow, width, height); @@ -689,7 +732,7 @@ void wxDropSource::PrepareIcon( int hot_x, int hot_y, GdkDragContext *context ) if (mask) gtk_widget_shape_combine_mask (m_iconWindow, mask, 0, 0); - gtk_drag_set_icon_widget( context, m_iconWindow, hot_x, hot_y ); + gtk_drag_set_icon_widget( context, m_iconWindow, 0, 0 ); } wxDragResult wxDropSource::DoDragDrop( bool allowMove ) @@ -702,6 +745,11 @@ 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 = TRUE; RegisterWindow(); @@ -746,22 +794,22 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) if (button_number) { GdkDragAction action = GDK_ACTION_COPY; - if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); + if (allowMove) action = (GdkDragAction)(GDK_ACTION_MOVE|GDK_ACTION_COPY); GdkDragContext *context = gtk_drag_begin( m_widget, - target_list, - action, - button_number, /* number of mouse button which started drag */ - (GdkEvent*) &event ); + target_list, + action, + button_number, /* number of mouse button which started drag */ + (GdkEvent*) &event ); m_dragContext = context; - PrepareIcon( 0, 0, context ); + PrepareIcon( action, context ); while (m_waiting) gtk_main_iteration(); - - if (context->action == GDK_ACTION_COPY) + + if (context->action == GDK_ACTION_COPY) m_retValue = wxDragCopy; - if (context->action == GDK_ACTION_MOVE) + if (context->action == GDK_ACTION_MOVE) m_retValue = wxDragMove; } @@ -780,7 +828,7 @@ wxDragResult wxDropSource::DoDragDrop( bool allowMove ) void wxDropSource::RegisterWindow() { if (!m_widget) return; - + gtk_signal_connect( GTK_OBJECT(m_widget), "drag_data_get", GTK_SIGNAL_FUNC (source_drag_data_get), (gpointer) this); gtk_signal_connect (GTK_OBJECT(m_widget), "drag_data_delete",