#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>
#else // NEW_CODE
-
-
+GtkWidget *shape_create_icon (char **data,
+ gint x,
+ gint y,
+ gint px,
+ gint py,
+ gint window_type);
+
+/* XPM */
+static char * gv_xpm[] = {
+"40 34 3 1",
+" s None c None",
+". c black",
+"X c white",
+" ",
+" ",
+" ...... ",
+" ..XXXXXX.. ",
+" .XXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXX. ",
+" .XXX..XXXX..XXX. ",
+" ....XX....XX....XX. ",
+" .XXX.XXX..XXXX..XXX.... ",
+" .XXXXXXXXXXXXXXXXXXX.XXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXXX. ",
+" ..XXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXX... ",
+" ..XXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXX.XXXXXXX. ",
+" .XXXXXXX.XXXXXXX.XXXXXXX. ",
+" .XXXXXXXX.XXXXXXX.XXXXXXX. ",
+" .XXXXXXX...XXXXX...XXXXX. ",
+" .XXXXXXX. ..... ..... ",
+" ..XXXX.. ",
+" .... ",
+" ",
+" ",
+" "};
+
+/* XPM */
+static char * page_xpm[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 5 1",
+/* colors */
+" s None c None",
+". c black",
+"X c wheat",
+"o c tan",
+"O c #6699FF",
+/* pixels */
+" ................... ",
+" .XXXXXXXXXXXXXXXXX.. ",
+" .XXXXXXXXXXXXXXXXX.o. ",
+" .XXXXXXXXXXXXXXXXX.oo. ",
+" .XXXXXXXXXXXXXXXXX.ooo. ",
+" .XXXXXXXXXXXXXXXXX.oooo. ",
+" .XXXXXXXXXXXXXXXXX....... ",
+" .XXXXXOOOOOOOOOOXXXooooo. ",
+" .XXXXXXXXXXXXXXXXXXooooo. ",
+" .XXXXXOOOOOOOOOOXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXOOOOOOOOOXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXOOOOOOOOOOXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXOOOOOOOOOOXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXOOOOOOOOOXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXOOOOOOOOOOXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXOOOOOOOOOOXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXOOOOOOOOOOXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXOOOOOOOXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXXXXXXXXXXXX. ",
+" ......................... "};
+
+
//-----------------------------------------------------------------------------
// "drop_data_available_event"
//-----------------------------------------------------------------------------
int y = 0;
gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL );
- printf( "Drop data is of type %s.\n", event->data_type );
+// printf( "Drop data is of type %s.\n", event->data_type );
target->OnDrop( x, y, (const void*)event->data, (size_t)event->data_numbytes );
}
// wxDropSource
//-------------------------------------------------------------------------
+static void
+shape_motion (GtkWidget *widget,
+ GdkEventMotion */*event*/);
+
//-----------------------------------------------------------------------------
// drag request
void gtk_drag_callback( GtkWidget *widget, GdkEvent *event, wxDropSource *source )
{
- printf( "Data requested for dropping.\n" );
-
- 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 = (GtkWidget*) NULL;
+ static GtkWidget *drop_icon = (GtkWidget*) NULL;
+
+ GdkPoint hotspot_1 = {0,-5 };
+
+ if (!drag_icon)
+ {
+ drag_icon = shape_create_icon ( gv_xpm,
+ 440, 140, 0,0, GTK_WINDOW_POPUP);
+
+ gtk_signal_connect (GTK_OBJECT (drag_icon), "destroy",
+ GTK_SIGNAL_FUNC(gtk_widget_destroyed),
+ &drag_icon);
+
+ gtk_widget_hide (drag_icon);
+ }
+
+ GdkPoint hotspot_2 = {-5,-5};
+
+ if (!drop_icon)
+ {
+ drop_icon = shape_create_icon ( page_xpm,
+ 440, 140, 0,0, GTK_WINDOW_POPUP);
+
+ gtk_signal_connect (GTK_OBJECT (drop_icon), "destroy",
+ GTK_SIGNAL_FUNC(gtk_widget_destroyed),
+ &drop_icon);
+
+ gtk_widget_hide (drop_icon);
+ }
+
+
+ gdk_dnd_set_drag_shape( drag_icon->window,
+ &hotspot_1,
+ drop_icon->window,
+ &hotspot_2);
+
GdkWindowPrivate *wp = (GdkWindowPrivate*) m_widget->window;
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)
{
gtk_signal_disconnect_by_data( GTK_OBJECT(m_widget), (gpointer)this );
}
+
+/*
+ * Shaped Windows
+ */
+static GdkWindow *root_win = (GdkWindow*) NULL;
+
+typedef struct _cursoroffset {gint x,y;} CursorOffset;
+
+static void
+shape_pressed (GtkWidget *widget, GdkEventButton *event)
+{
+ CursorOffset *p;
+
+ /* ignore double and triple click */
+ if (event->type != GDK_BUTTON_PRESS)
+ return;
+
+ 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,
+ (GdkEventMask)
+ (GDK_BUTTON_RELEASE_MASK |
+ GDK_BUTTON_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK),
+ (GdkWindow*)NULL,
+ (GdkCursor*) NULL, 0);
+}
+
+
+static void
+shape_released (GtkWidget *widget)
+{
+ gtk_grab_remove (widget);
+ gdk_pointer_ungrab (0);
+}
+
+static void
+shape_motion (GtkWidget *widget,
+ GdkEventMotion */*event*/)
+{
+ gint xp, yp;
+ CursorOffset * p;
+ GdkModifierType mask;
+
+ p = (CursorOffset *)gtk_object_get_user_data (GTK_OBJECT (widget));
+
+ /*
+ * Can't use event->x / event->y here
+ * because I need absolute coordinates.
+ */
+ gdk_window_get_pointer (root_win, &xp, &yp, &mask);
+ gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
+}
+
+GtkWidget *
+shape_create_icon (char **data,
+ gint x,
+ gint y,
+ gint px,
+ gint py,
+ gint window_type)
+{
+ GtkWidget *window;
+ GtkWidget *pixmap;
+ GtkWidget *fixed;
+ CursorOffset* icon_pos;
+ GdkGC* gc;
+ GdkBitmap *gdk_pixmap_mask;
+ GdkPixmap *gdk_pixmap;
+ GtkStyle *style;
+
+ style = gtk_widget_get_default_style ();
+ gc = style->black_gc;
+
+ /*
+ * GDK_WINDOW_TOPLEVEL works also, giving you a title border
+ */
+ window = gtk_window_new ((GtkWindowType)window_type);
+
+ fixed = gtk_fixed_new ();
+ gtk_widget_set_usize (fixed, 100,100);
+ gtk_container_add (GTK_CONTAINER (window), fixed);
+ gtk_widget_show (fixed);
+
+ gtk_widget_set_events (window,
+ gtk_widget_get_events (window) |
+ GDK_BUTTON_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON_PRESS_MASK);
+
+ gtk_widget_realize (window);
+
+ gdk_pixmap = gdk_pixmap_create_from_xpm_d (window->window, &gdk_pixmap_mask,
+ &style->bg[GTK_STATE_NORMAL],
+ (gchar**) data );
+
+ pixmap = gtk_pixmap_new (gdk_pixmap, gdk_pixmap_mask);
+ gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
+ gtk_widget_show (pixmap);
+
+ gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px,py);
+
+
+ gtk_signal_connect (GTK_OBJECT (window), "button_press_event",
+ GTK_SIGNAL_FUNC (shape_pressed),NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "button_release_event",
+ GTK_SIGNAL_FUNC (shape_released),NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "motion_notify_event",
+ GTK_SIGNAL_FUNC (shape_motion),NULL);
+
+ icon_pos = g_new (CursorOffset, 1);
+ gtk_object_set_user_data(GTK_OBJECT(window), icon_pos);
+
+ gtk_widget_set_uposition (window, x, y);
+ gtk_widget_show (window);
+
+ return window;
+}
+
#endif
// NEW_GTK_DND_CODE
+#endif
+
+ // wxUSE_DRAG_AND_DROP
\ No newline at end of file