#endif
#include "wx/dnd.h"
+
+#if wxUSE_DRAG_AND_DROP
+
#include "wx/window.h"
#include "wx/app.h"
#include "wx/gdicmn.h"
-#include <wx/intl.h>
+#include "wx/intl.h"
+#include "wx/utils.h"
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
#include "gdk/gdkprivate.h"
#include <X11/Xlib.h>
// wxDropSource
//-------------------------------------------------------------------------
+static void
+shape_motion (GtkWidget *widget,
+ GdkEventMotion */*event*/);
+
//-----------------------------------------------------------------------------
// drag request
void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDropSource *source )
{
- wxDataObject *data = source->m_data;
-
- size_t size = data->GetDataSize();
- char *ptr = new char[size];
- data->GetDataHere( ptr );
-
- gtk_widget_dnd_data_set( widget, event, ptr, size );
-
- delete ptr;
+ wxDataObject *data = source->m_data;
+
+ switch (data->GetFormat())
+ {
+ case wxDF_TEXT:
+ {
+ wxTextDataObject *text_object = (wxTextDataObject*) data;
+
+ wxString text = text_object->GetText();
+
+ char *s = WXSTRINGCAST text;
+
+ gtk_widget_dnd_data_set( widget,
+ event,
+ (unsigned char*) s,
+ (int) text.Length()+1 );
+
+ break;
+ }
+
+ case wxDF_FILENAME:
+ {
+ wxFileDataObject *file_object = (wxFileDataObject*) data;
+
+ wxString text = file_object->GetFiles();
+
+ char *s = WXSTRINGCAST text;
+
+ gtk_widget_dnd_data_set( widget,
+ event,
+ (unsigned char*) s,
+ (int) text.Length()+1 );
+
+ break;
+ }
+
+ default:
+ {
+ return;
+ }
+ }
source->m_retValue = wxDragCopy;
}
wxASSERT_MSG( m_data, "wxDragSource: no data" );
if (!m_data) return (wxDragResult) wxDragNone;
- if (m_data->GetDataSize() == 0) return (wxDragResult) wxDragNone;
- static GtkWidget *drag_icon = NULL;
- static GtkWidget *drop_icon = NULL;
+ static GtkWidget *drag_icon = (GtkWidget*) NULL;
+ static GtkWidget *drop_icon = (GtkWidget*) NULL;
GdkPoint hotspot_1 = {0,-5 };
gtk_widget_hide (drop_icon);
}
+
- gdk_dnd_set_drag_shape(drag_icon->window,
+ gdk_dnd_set_drag_shape( drag_icon->window,
&hotspot_1,
drop_icon->window,
&hotspot_2);
int x = 0;
int y = 0;
- gdk_window_get_pointer( m_widget->window, &x, &y, (GdkModifierType *) NULL );
+ wxGetMousePosition( &x, &y );
gdk_dnd_display_drag_cursor( x, y, FALSE, TRUE );
+/*
+ shape_motion( drag_icon, (GdkEventMotion *)NULL );
+ shape_motion( drop_icon, (GdkEventMotion *)NULL );
+*/
+
while (gdk_dnd.drag_really || gdk_dnd.drag_perhaps) wxYield();
UnregisterWindow();
wxString formats;
- wxDataFormat df = m_data->GetPreferredFormat();
+ wxDataFormat df = m_data->GetFormat();
switch (df)
{
/*
* Shaped Windows
*/
-static GdkWindow *root_win = NULL;
+static GdkWindow *root_win = (GdkWindow*) NULL;
typedef struct _cursoroffset {gint x,y;} CursorOffset;
if (event->type != GDK_BUTTON_PRESS)
return;
- p = gtk_object_get_user_data (GTK_OBJECT(widget));
+ p = (CursorOffset *)gtk_object_get_user_data (GTK_OBJECT(widget));
p->x = (int) event->x;
p->y = (int) event->y;
gtk_grab_add (widget);
gdk_pointer_grab (widget->window, TRUE,
- GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK,
- NULL, NULL, 0);
+ (GdkEventMask)
+ (GDK_BUTTON_RELEASE_MASK |
+ GDK_BUTTON_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK),
+ (GdkWindow*)NULL,
+ (GdkCursor*) NULL, 0);
}
static void
shape_motion (GtkWidget *widget,
- GdkEventMotion *event)
+ GdkEventMotion */*event*/)
{
gint xp, yp;
CursorOffset * p;
GdkModifierType mask;
- p = gtk_object_get_user_data (GTK_OBJECT (widget));
+ p = (CursorOffset *)gtk_object_get_user_data (GTK_OBJECT (widget));
/*
* Can't use event->x / event->y here
/*
* GDK_WINDOW_TOPLEVEL works also, giving you a title border
*/
- window = gtk_window_new (window_type);
+ window = gtk_window_new ((GtkWindowType)window_type);
fixed = gtk_fixed_new ();
gtk_widget_set_usize (fixed, 100,100);
return window;
}
-
-
-
#endif
// NEW_GTK_DND_CODE
+#endif
+
+ // wxUSE_DRAG_AND_DROP
\ No newline at end of file