- if (gdk_dnd.dnd_grabbed) return (wxDragResult) wxDragNone;
- if (gdk_dnd.drag_really) return (wxDragResult) wxDragNone;
-
- wxASSERT_MSG( m_data, "wxDragSource: no data" );
-
- if (!m_data) return (wxDragResult) wxDragNone;
- if (m_data->GetDataSize() == 0) return (wxDragResult) wxDragNone;
-
- GdkWindowPrivate *wp = (GdkWindowPrivate*) m_widget->window;
-
- RegisterWindow();
-
- gdk_dnd.drag_perhaps = TRUE;
-
- gdk_dnd.dnd_drag_start.x = 5;
- gdk_dnd.dnd_drag_start.y = 5;
- gdk_dnd.real_sw = wp;
-
- if (gdk_dnd.drag_startwindows)
- {
- g_free( gdk_dnd.drag_startwindows );
- gdk_dnd.drag_startwindows = (GdkWindow **) NULL;
- }
- gdk_dnd.drag_numwindows = gdk_dnd.drag_really = 0;
-
- XWindowAttributes dnd_winattr;
- XGetWindowAttributes( gdk_display, wp->xwindow, &dnd_winattr );
- wp->dnd_drag_savedeventmask = dnd_winattr.your_event_mask;
-
- gdk_dnd_drag_addwindow( m_widget->window );
-
- GdkEventDragBegin ev;
- ev.type = GDK_DRAG_BEGIN;
- ev.window = m_widget->window;
- ev.u.allflags = 0;
- ev.u.flags.protocol_version = DND_PROTOCOL_VERSION;
-
- gdk_event_put( (GdkEvent*)&ev );
-
- XGrabPointer( gdk_display, wp->xwindow, False,
- ButtonMotionMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
- GrabModeAsync, GrabModeAsync, gdk_root_window, None, CurrentTime );
-
- gdk_dnd_set_drag_cursors( m_defaultCursor.GetCursor(), m_goaheadCursor.GetCursor() );
-
- gdk_dnd.dnd_grabbed = TRUE;
- gdk_dnd.drag_really = 1;
-
- int x = 0;
- int y = 0;
- gdk_window_get_pointer( m_widget->window, &x, &y, (GdkModifierType *) NULL );
-
- gdk_dnd_display_drag_cursor( x, y, FALSE, TRUE );
-
- while (gdk_dnd.drag_really || gdk_dnd.drag_perhaps) wxYield();
-
- UnregisterWindow();
-
- g_blockEventsOnDrag = FALSE;
-
- return m_retValue;
-}
-
-void wxDropSource::RegisterWindow(void)
+ m_waiting = true;
+
+ SetData( data );
+
+ m_iconWindow = NULL;
+
+ m_window = win;
+ m_widget = win->m_widget;
+ if (win->m_wxwindow) m_widget = win->m_wxwindow;
+
+ m_retValue = wxDragCancel;
+
+ 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 action, GdkDragContext *context )
+{
+ // 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 = NULL;
+
+ GdkPixmap *pixmap = icon->GetPixmap();
+
+ gint width,height;
+ gdk_window_get_size (pixmap, &width, &height);
+
+ GdkColormap *colormap = gtk_widget_get_colormap( m_widget );
+ gtk_widget_push_visual (gdk_colormap_get_visual (colormap));
+ 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);
+
+ gtk_widget_pop_visual ();
+ gtk_widget_pop_colormap ();
+
+ gtk_widget_set_usize (m_iconWindow, width, height);
+ gtk_widget_realize (m_iconWindow);
+
+ gtk_signal_connect( GTK_OBJECT(m_iconWindow), "configure_event",
+ GTK_SIGNAL_FUNC(gtk_dnd_window_configure_callback), (gpointer)this );
+
+ gdk_window_set_back_pixmap (m_iconWindow->window, pixmap, FALSE);
+
+ if (mask)
+ gtk_widget_shape_combine_mask (m_iconWindow, mask, 0, 0);
+
+ gtk_drag_set_icon_widget( context, m_iconWindow, 0, 0 );
+}
+
+wxDragResult wxDropSource::DoDragDrop(int flags)