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