4 /* Target side drag signals */
7 static char * drag_icon_xpm[] = {
18 " .....................",
19 " ..&&&&&&&&&&&&&&&&&&&.",
20 " ...&&&&&&&&&&&&&&&&&&&.",
21 " ..&.&&&&&&&&&&&&&&&&&&&.",
22 " ..&&.&&&&&&&&&&&&&&&&&&&.",
23 " ..&&&.&&&&&&&&&&&&&&&&&&&.",
24 " ..&&&&.&&&&&&&&&&&&&&&&&&&.",
25 " ..&&&&&.&&&@&&&&&&&&&&&&&&&.",
26 " ..&&&&&&.*$%$+$&&&&&&&&&&&&&.",
27 " ..&&&&&&&.%$%$+&&&&&&&&&&&&&&.",
28 " ..&&&&&&&&.#&#@$&&&&&&&&&&&&&&.",
29 " ..&&&&&&&&&.#$**#$&&&&&&&&&&&&&.",
30 " ..&&&&&&&&&&.&@%&%$&&&&&&&&&&&&&.",
31 " ..&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&.",
32 " ..&&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&.",
33 "................&$@&&&@&&&&&&&&&&&&.",
34 ".&&&&&&&+&&#@%#+@#@*$%$+$&&&&&&&&&&.",
35 ".&&&&&&&+&&#@#@&&@*%$%$+&&&&&&&&&&&.",
36 ".&&&&&&&+&$%&#@&#@@#&#@$&&&&&&&&&&&.",
37 ".&&&&&&@#@@$&*@&@#@#$**#$&&&&&&&&&&.",
38 ".&&&&&&&&&&&&&&&&&&&@%&%$&&&&&&&&&&.",
39 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.",
40 ".&&&&&&&&$#@@$&&&&&&&&&&&&&&&&&&&&&.",
41 ".&&&&&&&&&+&$+&$&@&$@&&$@&&&&&&&&&&.",
42 ".&&&&&&&&&+&&#@%#+@#@*$%&+$&&&&&&&&.",
43 ".&&&&&&&&&+&&#@#@&&@*%$%$+&&&&&&&&&.",
44 ".&&&&&&&&&+&$%&#@&#@@#&#@$&&&&&&&&&.",
45 ".&&&&&&&&@#@@$&*@&@#@#$#*#$&&&&&&&&.",
46 ".&&&&&&&&&&&&&&&&&&&&&$%&%$&&&&&&&&.",
47 ".&&&&&&&&&&$#@@$&&&&&&&&&&&&&&&&&&&.",
48 ".&&&&&&&&&&&+&$%&$$@&$@&&$@&&&&&&&&.",
49 ".&&&&&&&&&&&+&&#@%#+@#@*$%$+$&&&&&&.",
50 ".&&&&&&&&&&&+&&#@#@&&@*#$%$+&&&&&&&.",
51 ".&&&&&&&&&&&+&$+&*@&#@@#&#@$&&&&&&&.",
52 ".&&&&&&&&&&$%@@&&*@&@#@#$#*#&&&&&&&.",
53 ".&&&&&&&&&&&&&&&&&&&&&&&$%&%$&&&&&&.",
54 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.",
55 ".&&&&&&&&&&&&&&$#@@$&&&&&&&&&&&&&&&.",
56 ".&&&&&&&&&&&&&&&+&$%&$$@&$@&&$@&&&&.",
57 ".&&&&&&&&&&&&&&&+&&#@%#+@#@*$%$+$&&.",
58 ".&&&&&&&&&&&&&&&+&&#@#@&&@*#$%$+&&&.",
59 ".&&&&&&&&&&&&&&&+&$+&*@&#@@#&#@$&&&.",
60 ".&&&&&&&&&&&&&&$%@@&&*@&@#@#$#*#&&&.",
61 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&$%&%$&&.",
62 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.",
63 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.",
64 ".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.",
65 "...................................."};
68 static char * trashcan_closed_xpm[] = {
109 " ==......=$$...=== ",
110 " ..$------)+++++++++++++@$$... ",
111 " ..=@@-------&+++++++++++++++++++-.... ",
112 " =.$$@@@-&&)++++)-,$$$$=@@&+++++++++++++,..$ ",
113 " .$$$$@@&+++++++&$$$@@@@-&,$,-++++++++++;;;&.. ",
114 " $$$$,@--&++++++&$$)++++++++-,$&++++++;%%'%%;;$@ ",
115 " .-@@-@-&++++++++-@++++++++++++,-++++++;''%;;;%*-$ ",
116 " +------++++++++++++++++++++++++++++++;;%%%;;##*!. ",
117 " =+----+++++++++++++++++++++++;;;;;;;;;;;;%'>>). ",
118 " .=)&+++++++++++++++++;;;;;;;;;;;;;;%''>>#>#@. ",
119 " =..=&++++++++++++;;;;;;;;;;;;;%###>>###+%== ",
120 " .&....=-+++++%;;####''''''''''##'%%%)..#. ",
121 " .+-++@....=,+%#####'%%%%%%%%%;@$-@-@*++!. ",
122 " .+-++-+++-&-@$$=$=......$,,,@;&)+!++!++!. ",
123 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
124 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
125 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
126 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
127 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
128 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
129 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
130 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
131 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
132 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
133 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
134 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
135 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
136 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
137 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
138 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
139 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
140 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
141 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
142 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
143 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
144 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
145 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
146 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
147 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
148 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
149 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
150 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
151 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
152 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
153 " =+-++-+++-+++++++++!++++!++++!+++!++!+++= ",
154 " $.++-+++-+++++++++!++++!++++!+++!++!+.$ ",
155 " =.++++++++++++++!++++!++++!+++!++.= ",
156 " $..+++++++++++++++!++++++...$ ",
157 " $$=.............=$$ ",
169 static char * trashcan_open_xpm[] = {
197 " $,-+)+++%%;;'#+. ",
198 " =---+++++;%%%;%##@. ",
199 " @)++++++++;%%%%'#%$ ",
200 " $&++++++++++;%%;%##@= ",
201 " ,-++++)+++++++;;;'#%) ",
202 " @+++&&--&)++++;;%'#'-. ",
203 " ,&++-@@,,,,-)++;;;'>'+, ",
204 " =-++&@$@&&&&-&+;;;%##%+@ ",
205 " =,)+)-,@@&+++++;;;;%##%&@ ",
206 " @--&&,,@&)++++++;;;;'#)@ ",
207 " ---&)-,@)+++++++;;;%''+, ",
208 " $--&)+&$-+++++++;;;%%'';- ",
209 " .,-&+++-$&++++++;;;%''%&= ",
210 " $,-&)++)-@++++++;;%''%), ",
211 " =,@&)++++&&+++++;%'''+$@&++++++ ",
212 " .$@-++++++++++++;'#';,........=$@&++++ ",
213 " =$@@&)+++++++++++'##-.................=&++ ",
214 " .$$@-&)+++++++++;%#+$.....................=)+ ",
215 " $$,@-)+++++++++;%;@=........................,+ ",
216 " .$$@@-++++++++)-)@=............................ ",
217 " $,@---)++++&)@===............................,. ",
218 " $-@---&)))-$$=..............................=)!. ",
219 " --&-&&,,$=,==...........................=&+++!. ",
220 " =,=$..=$+)+++++&@$=.............=$@&+++++!++!. ",
221 " .)-++-+++++++++++++++++++++++++++!++!++!. ",
222 " .+-++-+++++++++++++++++++++++!+++!++!++!. ",
223 " .+-++-+++-+++++++++!+++!!++++!+++!++!++!. ",
224 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
225 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
226 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
227 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
228 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
229 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
230 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
231 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
232 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
233 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
234 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
235 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
236 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
237 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
238 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
239 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
240 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
241 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
242 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
243 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
244 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
245 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
246 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
247 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
248 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
249 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
250 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
251 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
252 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
253 " .+-++-+++-+++++++++!++++!++++!+++!++!++!. ",
254 " =+-++-+++-+++++++++!++++!++++!+++!++!+++= ",
255 " $.++-+++-+++++++++!++++!++++!+++!++!+.$ ",
256 " =.++++++++++++++!++++!++++!+++!++.= ",
257 " $..+++++++++++++++!++++++...$ ",
258 " $$==...........==$$ ",
269 GdkPixmap *trashcan_open;
270 GdkPixmap *trashcan_open_mask;
271 GdkPixmap *trashcan_closed;
272 GdkPixmap *trashcan_closed_mask;
281 static GtkTargetEntry target_table[] = {
282 { "STRING", 0, TARGET_STRING },
283 { "text/plain", 0, TARGET_STRING },
284 { "application/x-rootwindow-drop", 0, TARGET_ROOTWIN }
287 static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);
290 target_drag_leave (GtkWidget *widget,
291 GdkDragContext *context,
296 gtk_image_set_from_pixmap (GTK_IMAGE (widget),
297 trashcan_closed, trashcan_closed_mask);
301 target_drag_motion (GtkWidget *widget,
302 GdkDragContext *context,
307 GtkWidget *source_widget;
313 gtk_image_set_from_pixmap (GTK_IMAGE (widget),
314 trashcan_open, trashcan_open_mask);
317 source_widget = gtk_drag_get_source_widget (context);
318 g_print ("motion, source %s\n", source_widget ?
319 GTK_OBJECT_TYPE_NAME (source_widget) :
322 tmp_list = context->targets;
325 char *name = gdk_atom_name (GDK_POINTER_TO_ATOM (tmp_list->data));
326 g_print ("%s\n", name);
329 tmp_list = tmp_list->next;
332 gdk_drag_status (context, context->suggested_action, time);
337 target_drag_drop (GtkWidget *widget,
338 GdkDragContext *context,
346 gtk_image_set_from_pixmap (GTK_IMAGE (widget),
347 trashcan_closed, trashcan_closed_mask);
349 if (context->targets)
351 gtk_drag_get_data (widget, context,
352 GDK_POINTER_TO_ATOM (context->targets->data),
361 target_drag_data_received (GtkWidget *widget,
362 GdkDragContext *context,
365 GtkSelectionData *data,
369 if ((data->length >= 0) && (data->format == 8))
371 g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data);
372 gtk_drag_finish (context, TRUE, FALSE, time);
376 gtk_drag_finish (context, FALSE, FALSE, time);
380 label_drag_data_received (GtkWidget *widget,
381 GdkDragContext *context,
384 GtkSelectionData *data,
388 if ((data->length >= 0) && (data->format == 8))
390 g_print ("Received \"%s\" in label\n", (gchar *)data->data);
391 gtk_drag_finish (context, TRUE, FALSE, time);
395 gtk_drag_finish (context, FALSE, FALSE, time);
399 source_drag_data_get (GtkWidget *widget,
400 GdkDragContext *context,
401 GtkSelectionData *selection_data,
406 if (info == TARGET_ROOTWIN)
407 g_print ("I was dropped on the rootwin\n");
409 gtk_selection_data_set (selection_data,
410 selection_data->target,
414 /* The following is a rather elaborate example demonstrating/testing
415 * changing of the window heirarchy during a drag - in this case,
416 * via a "spring-loaded" popup window.
418 static GtkWidget *popup_window = NULL;
420 static gboolean popped_up = FALSE;
421 static gboolean in_popup = FALSE;
422 static guint popdown_timer = 0;
423 static guint popup_timer = 0;
426 popdown_cb (gpointer data)
430 gtk_widget_hide (popup_window);
437 popup_motion (GtkWidget *widget,
438 GdkDragContext *context,
448 g_print ("removed popdown\n");
449 g_source_remove (popdown_timer);
458 popup_leave (GtkWidget *widget,
459 GdkDragContext *context,
467 g_print ("added popdown\n");
468 popdown_timer = g_timeout_add (500, popdown_cb, NULL);
474 popup_cb (gpointer data)
484 popup_window = gtk_window_new (GTK_WINDOW_POPUP);
485 gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE);
487 table = gtk_table_new (3,3, FALSE);
493 g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j);
494 button = gtk_button_new_with_label (buffer);
495 gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1,
496 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
499 gtk_drag_dest_set (button,
500 GTK_DEST_DEFAULT_ALL,
501 target_table, n_targets - 1, /* no rootwin */
502 GDK_ACTION_COPY | GDK_ACTION_MOVE);
503 g_signal_connect (button, "drag_motion",
504 G_CALLBACK (popup_motion), NULL);
505 g_signal_connect (button, "drag_leave",
506 G_CALLBACK (popup_leave), NULL);
509 gtk_widget_show_all (table);
510 gtk_container_add (GTK_CONTAINER (popup_window), table);
513 gtk_widget_show (popup_window);
517 popdown_timer = g_timeout_add (500, popdown_cb, NULL);
518 g_print ("added popdown\n");
526 popsite_motion (GtkWidget *widget,
527 GdkDragContext *context,
533 popup_timer = g_timeout_add (500, popup_cb, NULL);
539 popsite_leave (GtkWidget *widget,
540 GdkDragContext *context,
545 g_source_remove (popup_timer);
551 source_drag_data_delete (GtkWidget *widget,
552 GdkDragContext *context,
555 g_print ("Delete the data!\n");
561 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
564 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
565 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
570 main (int argc, char **argv)
577 GdkPixmap *drag_icon;
578 GdkPixmap *drag_mask;
582 gtk_init (&argc, &argv);
584 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
585 g_signal_connect (window, "destroy",
586 G_CALLBACK (gtk_main_quit), NULL);
589 table = gtk_table_new (2, 2, FALSE);
590 gtk_container_add (GTK_CONTAINER (window), table);
592 drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL,
593 gtk_widget_get_colormap (window),
595 NULL, drag_icon_xpm);
597 trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL,
598 gtk_widget_get_colormap (window),
600 NULL, trashcan_open_xpm);
601 trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL,
602 gtk_widget_get_colormap (window),
603 &trashcan_closed_mask,
604 NULL, trashcan_closed_xpm);
606 label = gtk_label_new ("Drop Here\n");
608 gtk_drag_dest_set (label,
609 GTK_DEST_DEFAULT_ALL,
610 target_table, n_targets - 1, /* no rootwin */
611 GDK_ACTION_COPY | GDK_ACTION_MOVE);
613 g_signal_connect (label, "drag_data_received",
614 G_CALLBACK( label_drag_data_received), NULL);
616 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
617 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
620 label = gtk_label_new ("Popup\n");
622 gtk_drag_dest_set (label,
623 GTK_DEST_DEFAULT_ALL,
624 target_table, n_targets - 1, /* no rootwin */
625 GDK_ACTION_COPY | GDK_ACTION_MOVE);
627 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
628 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
631 g_signal_connect (label, "drag_motion",
632 G_CALLBACK (popsite_motion), NULL);
633 g_signal_connect (label, "drag_leave",
634 G_CALLBACK (popsite_leave), NULL);
636 pixmap = gtk_image_new_from_pixmap (trashcan_closed, trashcan_closed_mask);
637 gtk_drag_dest_set (pixmap, 0, NULL, 0, 0);
638 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
639 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
642 g_signal_connect (pixmap, "drag_leave",
643 G_CALLBACK (target_drag_leave), NULL);
645 g_signal_connect (pixmap, "drag_motion",
646 G_CALLBACK (target_drag_motion), NULL);
648 g_signal_connect (pixmap, "drag_drop",
649 G_CALLBACK (target_drag_drop), NULL);
651 g_signal_connect (pixmap, "drag_data_received",
652 G_CALLBACK (target_drag_data_received), NULL);
656 button = gtk_button_new_with_label ("Drag Here\n");
658 gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
659 target_table, n_targets,
660 GDK_ACTION_COPY | GDK_ACTION_MOVE);
661 gtk_drag_source_set_icon (button,
662 gtk_widget_get_colormap (window),
663 drag_icon, drag_mask);
665 g_object_unref (drag_icon);
666 g_object_unref (drag_mask);
668 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
669 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
672 g_signal_connect (button, "drag_data_get",
673 G_CALLBACK (source_drag_data_get), NULL);
674 g_signal_connect (button, "drag_data_delete",
675 G_CALLBACK (source_drag_data_delete), NULL);
677 gtk_widget_show_all (window);