/** simplednd.c **/ #include gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); void sendCallback(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection,guint info,guint time); void receiveCallback(GtkWidget *widget, GdkDragContext *context, gint x,gint y,GtkSelectionData *selection, guint info,guint time); void packSendingButton(GtkWidget *box,gchar *text); void packReceivingButton(GtkWidget *box,gchar *text); int main(int argc,char *argv[]) { GtkWidget *app; GtkWidget *box; gnome_init("simplednd","1.0",argc,argv); app = gnome_app_new("simplednd","Simple DND"); gtk_signal_connect(GTK_OBJECT(app),"delete_event", GTK_SIGNAL_FUNC(eventDelete),NULL); gtk_signal_connect(GTK_OBJECT(app),"destroy", GTK_SIGNAL_FUNC(eventDestroy), NULL); box = gtk_hbox_new(TRUE,0); gnome_app_set_contents(GNOME_APP(app),box); packSendingButton(box,"Left Source Text"); packReceivingButton(box,"Destination Window"); packSendingButton(box,"Right Source Text"); gtk_container_set_border_width(GTK_CONTAINER(app),25); gtk_widget_show_all(app); gtk_main(); exit(0); } void packSendingButton(GtkWidget *box,gchar *text) { GtkWidget *button; static GtkTargetEntry target = { "text/plain",0,0 }; button = gtk_button_new_with_label(text); gtk_box_pack_start(GTK_BOX(box),button,TRUE,FALSE,0); gtk_signal_connect(GTK_OBJECT(button),"drag_data_get", GTK_SIGNAL_FUNC(sendCallback),NULL); gtk_drag_source_set(button,GDK_BUTTON1_MASK,&target, 1,GDK_ACTION_COPY); } void packReceivingButton(GtkWidget *box,gchar *text) { GtkWidget *button; static GtkTargetEntry target = { "text/plain",0,0 }; button = gtk_button_new_with_label(text); gtk_box_pack_start(GTK_BOX(box),button,TRUE,FALSE,0); gtk_signal_connect(GTK_OBJECT(button), "drag_data_received", GTK_SIGNAL_FUNC(receiveCallback),NULL); gtk_drag_dest_set(button, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, &target,1, GDK_ACTION_COPY); } void sendCallback(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection,guint info,guint time) { gchar *ascii; GtkWidget *label; label = GTK_BUTTON(widget)->child; gtk_label_get(GTK_LABEL(label),&ascii); gtk_selection_data_set(selection,selection->target, 8,ascii,strlen(ascii)); } void receiveCallback(GtkWidget *widget, GdkDragContext *context, gint x,gint y,GtkSelectionData *selection, guint info,guint time) { GtkWidget *label; label = GTK_BUTTON(widget)->child; gtk_label_set_text(GTK_LABEL(label),selection->data); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }