--- dnd-list-1.1/dndlist.c 2004-08-09 06:12:01.000000000 +0200 +++ dndlist.c 2005-05-02 00:14:44.388185856 +0200 @@ -30,13 +30,15 @@ /* Ensure we only report the data once. */ gboolean item_handled = FALSE; +gboolean show_data = FALSE; -GtkTextBuffer * textbuffer; +GtkTextBuffer * textbuffer, *data_textbuffer; void clear_cb (GtkWidget *widget, gpointer data) { item_handled = FALSE; gtk_text_buffer_set_text(textbuffer, "", 0); + gtk_text_buffer_set_text(data_textbuffer, "", 0); } void quit_cb (GtkWidget *widget, gpointer data) @@ -44,10 +46,46 @@ gtk_main_quit (); } +void drag_data_received_cb (GtkWidget *widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *data, + guint info, guint time) +{ + if (data->length >= 0 && data->format == 8) { + char *text, *string, *freeme = NULL, *format = "unknown encoding"; + if (g_utf8_validate ((char *) data->data, data->length, NULL)) { + string = (char *) data->data; + format = "UTF-8"; + } else { + /* try to convert from UTF-16 */ + string = freeme = g_utf16_to_utf8 ((gunichar2*) data->data, data->length, NULL, NULL, NULL); + if (string != NULL) { + format = "UTF-16"; + } else { + /* try to convert from locale encoding */ + string = g_locale_to_utf8 ((char *) data->data, data->length, NULL, NULL, NULL); + if (string != NULL) { + format = "locale encoding"; + } + } + } + + text = g_strdup_printf ("Data for target '%s' (%s):\n", gdk_atom_name (data->target), format); + gtk_text_buffer_insert_at_cursor (data_textbuffer, text, -1); + if (string != NULL) + gtk_text_buffer_insert_at_cursor (data_textbuffer, string, -1); + gtk_text_buffer_insert_at_cursor (data_textbuffer, "\n", 1); + + g_free (text); + g_free (freeme); + } + + gdk_drag_status (context, GDK_ACTION_PRIVATE, time); +} + gboolean drag_motion_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, gpointer user) { - GList * targets; + GList * target; gchar * string; gboolean add_nl = FALSE; @@ -56,14 +94,14 @@ gtk_text_buffer_set_text (textbuffer, "", 0); - targets = context->targets; - while (targets) { + for (target = context->targets; target != NULL; target = target->next) { if (add_nl) gtk_text_buffer_insert_at_cursor (textbuffer, "\n", 1); add_nl = TRUE; - string = gdk_atom_name (GDK_POINTER_TO_ATOM (targets->data)); + string = gdk_atom_name (GDK_POINTER_TO_ATOM (target->data)); gtk_text_buffer_insert_at_cursor (textbuffer, string, -1); - targets = g_list_next (targets); + if (show_data) + gtk_drag_get_data (widget, context, GDK_POINTER_TO_ATOM (target->data), time); } gdk_drag_status (context, GDK_ACTION_PRIVATE, time); @@ -79,6 +117,11 @@ item_handled = FALSE; } +void data_button_toggled_cb (GtkToggleButton *button) +{ + show_data = gtk_toggle_button_get_active (button); +} + gboolean keypress_cb (GtkWidget *widget, GdkEventKey *event, gpointer data) { GtkTextIter start; @@ -117,8 +160,10 @@ GtkWidget *vbox; GtkWidget *textview; GtkWidget *frame; + GtkWidget *scroller; GtkWidget *buttonbox; GtkWidget *button; + GtkWidget *toggle; gtk_init (&argc, &argv); @@ -131,6 +176,8 @@ G_CALLBACK (drag_motion_cb), NULL); g_signal_connect (G_OBJECT (window), "drag-leave", G_CALLBACK (drag_leave_cb), NULL); + g_signal_connect (G_OBJECT (window), "drag-data-received", + G_CALLBACK (drag_data_received_cb), NULL); g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (keypress_cb), NULL); gtk_window_set_default_size (GTK_WINDOW (window), 128, 256); @@ -142,14 +189,40 @@ label = gtk_label_new ("Drag objects over this window to get a list of targets"); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 5); + toggle = gtk_check_button_new_with_label ("Show data"); + gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 5); + g_signal_connect (toggle, "toggled", + G_CALLBACK (data_button_toggled_cb), NULL); + frame = gtk_frame_new ("Types"); gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 5); + scroller = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (frame), scroller); + textbuffer = gtk_text_buffer_new (NULL); textview = gtk_text_view_new_with_buffer (textbuffer); gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE); - gtk_container_add (GTK_CONTAINER (frame), textview); + gtk_container_add (GTK_CONTAINER (scroller), textview); + + frame = gtk_frame_new ("Data"); + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 5); + + scroller = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (frame), scroller); + + data_textbuffer = gtk_text_buffer_new (NULL); + textview = gtk_text_view_new_with_buffer (data_textbuffer); + gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE); + gtk_container_add (GTK_CONTAINER (scroller), textview); buttonbox = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (buttonbox), GTK_BUTTONBOX_END);