On Wed, 7 Sep 2011, John Emmas wrote:

Using gtk-win32, I'm porting a GTK+ application (originally written for Linux and OS-X) to the Windows platform and have been pleasantly surprised at how well it's all worked. However, part of the app's functionality includes a drag'n'drop feature to move items from one part of the GUI to another part. [not working on Windows]

Unfortunately, the app itself is very large and complicated so it's pretty difficult to figure out what's supposed to be happening. Does anyone know of a handy example that I could use to study GTK+ drag'n'drop at a simpler level (with source code, obviously) ?

I'm attaching a little test program that I once used for diagnosing GTK dnd problems on Windows.

Allin Cottrell

/*

  Test program for drag and drop with two sorts of targets available.

  Allin Cottrell (cottr...@wfu.edu), March 2003.

*/

#include <gtk/gtk.h>

enum {
    DRAG_FILENAME,
    DRAG_POINTER
};

GtkTargetEntry test_drag_targets[] = {
    { "text/uri-list", 0, DRAG_FILENAME },
    { "pointer", GTK_TARGET_SAME_APP, DRAG_POINTER }    
};

void app_exit (GtkWidget *w, gpointer p)
{
    gtk_main_quit();
}

static void msgbox (const char *msg)
{
    GtkWidget *dialog;

    dialog = gtk_message_dialog_new (NULL, 
                                     GTK_DIALOG_DESTROY_WITH_PARENT,
                                     GTK_MESSAGE_INFO,
                                     GTK_BUTTONS_CLOSE,
                                     msg);
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

static void 
get_drag_pointer (GtkWidget *w, GdkDragContext *context,
                  GtkSelectionData *sel, guint info, guint t,
                  gpointer ptr)
{
    gtk_selection_data_set(sel, GDK_SELECTION_TYPE_INTEGER, 8, 
                           (const guchar *) &ptr, sizeof ptr);
}

static void 
pointer_window_drag_connect (GtkWidget *widget, gpointer ptr)
{
    gtk_drag_source_set(widget, GDK_BUTTON1_MASK,
                        &test_drag_targets[DRAG_POINTER],
                        1, GDK_ACTION_COPY);

    g_signal_connect(G_OBJECT(widget), "drag_data_get",
                     G_CALLBACK(get_drag_pointer),
                     ptr);
}

static void pointer_window (void)
     /* mock-up of a window which supplies a pointer to drop */
{
    GtkWidget *pw, *plabel;
    
    pw = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_print("Pointer window is at %p\n", (void *) pw);

    plabel = gtk_label_new("\n Pointer window \n");
    gtk_container_add(GTK_CONTAINER(pw), plabel);
    pointer_window_drag_connect(pw, (gpointer) pw);

    gtk_widget_show_all(pw);
}

static void  
handle_drag_data (GtkWidget *widget,
                  GdkDragContext *context,
                  gint x, gint y,
                  GtkSelectionData *data,
                  guint info, guint time,
                  gpointer p)
{
    gchar *input = NULL;

    if (info == DRAG_FILENAME) {
        input = g_strdup_printf("Got uri-list: %s", data->data);
    } 
    else if (info == DRAG_POINTER) {
        input = g_strdup_printf("Got pointer (address of pointer window):\n"
                                "%p", *(void **) data->data);
    } 
    else {
        input = g_strdup("Got unknown drag input");
    }

    msgbox(input);
    g_free(input);
}

static void 
main_window_drag_connect (GtkWidget *widget)
{
    gtk_drag_dest_set (widget,
                       GTK_DEST_DEFAULT_ALL,
                       test_drag_targets, 2,
                       GDK_ACTION_COPY);

    g_signal_connect (G_OBJECT(widget), "drag_data_received",
                      G_CALLBACK(handle_drag_data),
                      NULL);
}

int main (int argc, char *argv[])
{
    GtkWidget *w, *label;

    gtk_init(&argc, &argv);

    w = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(G_OBJECT(w), "destroy",
                     G_CALLBACK(app_exit), NULL);

    label = gtk_label_new("\n Drag onto me, from a file icon \n"
                          " or from the pointer window. \n");
    gtk_container_add(GTK_CONTAINER(w), label);
    main_window_drag_connect(label);
    
    gtk_widget_show_all(w);

    pointer_window();

    gtk_main();

    return 0;
}
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to