Hello everyone! I'm having troubles getting drag and drop working between 2GtkIconViews. Actually, the DND works for me most of the time, theproblems arise when one of the GtkIconViews displays an empty model.During my testing I discovered that "drag-drop" signal doesn't getemitted when I try to drag something on an GtkIconView with emptymodel. I wrote minimalistic sample code that demonstrates thebehavior. Does anyone knows what am I doing wrong or how can I make this work? Thanks. ------------ CODE -------------/* * icon.c - GtkIconView DnD sample (non-working) application * * For non-working example compile with: * gcc -o icon icon.c $(pkg-config --cflags --libs gtk+-2.0) * else * gcc -DNONEMPTY -o icon icon.c $(pkg-config --cflags --libs gtk+-2.0) * */ #include <gtk/gtk.h> enum{ COL_TEXT = 0, COL_PICT, N_COLS}; static GtkTreeModel *create_model( gboolean populate ); static GtkWidget *create_icon_view( gboolean populate ); static gboolean cb_drag_drop( GtkWidget *icon, GdkDragContext *context, gint x, gint y, guint time, gpointer data ); intmain( int argc, char **argv ){ GtkWidget *window; GtkWidget *hbox; GtkWidget *icon1; GtkWidget *icon2; gtk_init( &argc, &argv ); window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_window_set_default_size( GTK_WINDOW( window ), 400, 300 ); gtk_container_set_border_width( GTK_CONTAINER( window ), 6 ); g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); hbox = gtk_hbox_new( TRUE, 6 ); gtk_container_add( GTK_CONTAINER( window ), hbox ); icon1 = create_icon_view( TRUE ); gtk_widget_set_name( icon1, "Left iconview" ); gtk_box_pack_start( GTK_BOX( hbox ), icon1, TRUE, TRUE, 0 ); icon2 = create_icon_view( FALSE ); gtk_widget_set_name( icon2, "Right iconview" ); gtk_box_pack_start( GTK_BOX( hbox ), icon2, TRUE, TRUE, 0 ); gtk_widget_show_all( window ); gtk_main(); return( 0 );} static GtkWidget *create_icon_view( gboolean populate ){ GtkWidget *icon; GtkTreeModel *model; static GtkTargetEntry *target = NULL; if( ! target ) { target = g_slice_new(GtkTargetEntry); target->target = "InternalTarget"; target->flags = GTK_TARGET_SAME_APP; target->info = 0; } model = create_model( populate ); icon = gtk_icon_view_new_with_model( model ); g_object_unref( G_OBJECT( model ) ); gtk_icon_view_set_text_column( GTK_ICON_VIEW( icon ), COL_TEXT ); gtk_icon_view_set_pixbuf_column( GTK_ICON_VIEW( icon ), COL_PICT ); /* DnD setup */ gtk_icon_view_enable_model_drag_source( GTK_ICON_VIEW( icon ), GDK_BUTTON1_MASK, target, 1, GDK_ACTION_MOVE ); gtk_icon_view_enable_model_drag_dest( GTK_ICON_VIEW( icon ), target, 1, GDK_ACTION_MOVE ); g_signal_connect( G_OBJECT( icon ), "drag-drop", G_CALLBACK( cb_drag_drop ), NULL ); return( icon );} static GtkTreeModel *create_model( gboolean populate ){ GtkListStore *store; GtkTreeIter iter; GdkPixbuf *pix; store = gtk_list_store_new( N_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF ); if( ! populate ) { /* This piece of code makes all the difference */#ifdef NONEMPTY pix = gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, 50, 50 ); gdk_pixbuf_fill( pix, 0xff000000 ); /* Red */ gtk_list_store_append( store, &iter ); gtk_list_store_set( store, &iter, COL_TEXT, "R 4", COL_PICT, pix, -1 ); g_object_unref( G_OBJECT( pix ) );#endif /* NONEMPTY */ } else { pix = gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, 50, 50 ); gdk_pixbuf_fill( pix, 0x00000000 ); /* Black */ gtk_list_store_append( store, &iter ); gtk_list_store_set( store, &iter, COL_TEXT, "R 1", COL_PICT, pix, -1 ); g_object_unref( G_OBJECT( pix ) ); pix = gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, 50, 50 ); gdk_pixbuf_fill( pix, 0x0000ff00 ); /* Blue */ gtk_list_store_append( store, &iter ); gtk_list_store_set( store, &iter, COL_TEXT, "R 2", COL_PICT, pix, -1 ); g_object_unref( G_OBJECT( pix ) ); pix = gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, 50, 50 ); gdk_pixbuf_fill( pix, 0x00ff0000 ); /* Green */ gtk_list_store_append( store, &iter ); gtk_list_store_set( store, &iter, COL_TEXT, "R 3", COL_PICT, pix, -1 ); g_object_unref( G_OBJECT( pix ) ); } return( GTK_TREE_MODEL( store ) );} static gbooleancb_drag_drop( GtkWidget *icon, GdkDragContext *context, gint x, gint y, guint time, gpointer data ){ GdkAtom target_type; g_print( "Detected drop on %s\n", gtk_widget_get_name( icon ) ); target_type = GDK_POINTER_TO_ATOM( context->targets->data ); gtk_drag_get_data( icon, context, target_type, time ); return( TRUE );} ---------- CODE -------------- -- Tadej Borovšaktadeboro@xxxxxxxxxxxxxxxxxxxxxxx@gmail.com_______________________________________________gtk-list mailing listgtk-list@xxxxxxxxxxxxx://mail.gnome.org/mailman/listinfo/gtk-list