1 #include <stdlib.h> /* putenv */
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-rootwin-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_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask);
300 target_drag_motion (GtkWidget *widget,
301 GdkDragContext *context,
306 GtkWidget *source_widget;
312 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_open, trashcan_open_mask);
315 source_widget = gtk_drag_get_source_widget (context);
316 g_print ("motion, source %s\n", source_widget ?
317 GTK_OBJECT_TYPE_NAME (source_widget) :
320 tmp_list = context->targets;
323 char *name = gdk_atom_name (GDK_POINTER_TO_ATOM (tmp_list->data));
324 g_print ("%s\n", name);
327 tmp_list = tmp_list->next;
330 gdk_drag_status (context, context->suggested_action, time);
335 target_drag_drop (GtkWidget *widget,
336 GdkDragContext *context,
344 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask);
346 if (context->targets)
348 gtk_drag_get_data (widget, context,
349 GDK_POINTER_TO_ATOM (context->targets->data),
358 target_drag_data_received (GtkWidget *widget,
359 GdkDragContext *context,
362 GtkSelectionData *data,
366 if ((data->length >= 0) && (data->format == 8))
368 g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data);
369 gtk_drag_finish (context, TRUE, FALSE, time);
373 gtk_drag_finish (context, FALSE, FALSE, time);
377 label_drag_data_received (GtkWidget *widget,
378 GdkDragContext *context,
381 GtkSelectionData *data,
385 if ((data->length >= 0) && (data->format == 8))
387 g_print ("Received \"%s\" in label\n", (gchar *)data->data);
388 gtk_drag_finish (context, TRUE, FALSE, time);
392 gtk_drag_finish (context, FALSE, FALSE, time);
396 source_drag_data_get (GtkWidget *widget,
397 GdkDragContext *context,
398 GtkSelectionData *selection_data,
403 if (info == TARGET_ROOTWIN)
404 g_print ("I was dropped on the rootwin\n");
406 gtk_selection_data_set (selection_data,
407 selection_data->target,
411 /* The following is a rather elaborate example demonstrating/testing
412 * changing of the window heirarchy during a drag - in this case,
413 * via a "spring-loaded" popup window.
415 static GtkWidget *popup_window = NULL;
417 static gboolean popped_up = FALSE;
418 static gboolean in_popup = FALSE;
419 static guint popdown_timer = 0;
420 static guint popup_timer = 0;
423 popdown_cb (gpointer data)
427 gtk_widget_hide (popup_window);
434 popup_motion (GtkWidget *widget,
435 GdkDragContext *context,
445 g_print ("removed popdown\n");
446 gtk_timeout_remove (popdown_timer);
455 popup_leave (GtkWidget *widget,
456 GdkDragContext *context,
464 g_print ("added popdown\n");
465 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
471 popup_cb (gpointer data)
481 popup_window = gtk_window_new (GTK_WINDOW_POPUP);
482 gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE);
484 table = gtk_table_new (3,3, FALSE);
490 g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j);
491 button = gtk_button_new_with_label (buffer);
492 gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1,
493 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
496 gtk_drag_dest_set (button,
497 GTK_DEST_DEFAULT_ALL,
498 target_table, n_targets - 1, /* no rootwin */
499 GDK_ACTION_COPY | GDK_ACTION_MOVE);
500 gtk_signal_connect (GTK_OBJECT (button), "drag_motion",
501 GTK_SIGNAL_FUNC (popup_motion), NULL);
502 gtk_signal_connect (GTK_OBJECT (button), "drag_leave",
503 GTK_SIGNAL_FUNC (popup_leave), NULL);
506 gtk_widget_show_all (table);
507 gtk_container_add (GTK_CONTAINER (popup_window), table);
510 gtk_widget_show (popup_window);
514 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
515 g_print ("added popdown\n");
523 popsite_motion (GtkWidget *widget,
524 GdkDragContext *context,
530 popup_timer = gtk_timeout_add (500, popup_cb, NULL);
536 popsite_leave (GtkWidget *widget,
537 GdkDragContext *context,
542 gtk_timeout_remove (popup_timer);
548 source_drag_data_delete (GtkWidget *widget,
549 GdkDragContext *context,
552 g_print ("Delete the data!\n");
558 if (g_file_test ("../gdk-pixbuf/.libs/libpixbufloader-pnm.so",
561 putenv ("GDK_PIXBUF_MODULEDIR=../gdk-pixbuf/.libs");
562 putenv ("GTK_IM_MODULE_FILE=./gtk.immodules");
567 main (int argc, char **argv)
574 GdkPixmap *drag_icon;
575 GdkPixmap *drag_mask;
579 gtk_init (&argc, &argv);
581 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
582 gtk_signal_connect (GTK_OBJECT(window), "destroy",
583 GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
586 table = gtk_table_new (2, 2, FALSE);
587 gtk_container_add (GTK_CONTAINER (window), table);
589 drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL,
590 gtk_widget_get_colormap (window),
592 NULL, drag_icon_xpm);
594 trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL,
595 gtk_widget_get_colormap (window),
597 NULL, trashcan_open_xpm);
598 trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL,
599 gtk_widget_get_colormap (window),
600 &trashcan_closed_mask,
601 NULL, trashcan_closed_xpm);
603 label = gtk_label_new ("Drop Here\n");
605 gtk_drag_dest_set (label,
606 GTK_DEST_DEFAULT_ALL,
607 target_table, n_targets - 1, /* no rootwin */
608 GDK_ACTION_COPY | GDK_ACTION_MOVE);
610 gtk_signal_connect( GTK_OBJECT(label), "drag_data_received",
611 GTK_SIGNAL_FUNC( label_drag_data_received), NULL);
613 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
614 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
617 label = gtk_label_new ("Popup\n");
619 gtk_drag_dest_set (label,
620 GTK_DEST_DEFAULT_ALL,
621 target_table, n_targets - 1, /* no rootwin */
622 GDK_ACTION_COPY | GDK_ACTION_MOVE);
624 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
625 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
628 gtk_signal_connect (GTK_OBJECT (label), "drag_motion",
629 GTK_SIGNAL_FUNC (popsite_motion), NULL);
630 gtk_signal_connect (GTK_OBJECT (label), "drag_leave",
631 GTK_SIGNAL_FUNC (popsite_leave), NULL);
633 pixmap = gtk_pixmap_new (trashcan_closed, trashcan_closed_mask);
634 gtk_drag_dest_set (pixmap, 0, NULL, 0, 0);
635 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
636 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
639 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_leave",
640 GTK_SIGNAL_FUNC (target_drag_leave), NULL);
642 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_motion",
643 GTK_SIGNAL_FUNC (target_drag_motion), NULL);
645 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_drop",
646 GTK_SIGNAL_FUNC (target_drag_drop), NULL);
648 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_data_received",
649 GTK_SIGNAL_FUNC (target_drag_data_received), NULL);
653 button = gtk_button_new_with_label ("Drag Here\n");
655 gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
656 target_table, n_targets,
657 GDK_ACTION_COPY | GDK_ACTION_MOVE);
658 gtk_drag_source_set_icon (button,
659 gtk_widget_get_colormap (window),
660 drag_icon, drag_mask);
662 gdk_pixmap_unref (drag_icon);
663 gdk_pixmap_unref (drag_mask);
665 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
666 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
669 gtk_signal_connect (GTK_OBJECT (button), "drag_data_get",
670 GTK_SIGNAL_FUNC (source_drag_data_get), NULL);
671 gtk_signal_connect (GTK_OBJECT (button), "drag_data_delete",
672 GTK_SIGNAL_FUNC (source_drag_data_delete), NULL);
674 gtk_widget_show_all (window);