3 /* Target side drag signals */
6 static char * drag_icon_xpm[] = {
17 " .....................",
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 "...................................."};
67 static char * trashcan_closed_xpm[] = {
108 " ==......=$$...=== ",
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 " $$=.............=$$ ",
168 static char * trashcan_open_xpm[] = {
196 " $,-+)+++%%;;'#+. ",
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 " $$==...........==$$ ",
268 GdkPixmap *trashcan_open;
269 GdkPixmap *trashcan_open_mask;
270 GdkPixmap *trashcan_closed;
271 GdkPixmap *trashcan_closed_mask;
280 static GtkTargetEntry target_table[] = {
281 { "STRING", 0, TARGET_STRING },
282 { "text/plain", 0, TARGET_STRING },
283 { "application/x-rootwin-drop", 0, TARGET_ROOTWIN }
286 static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);
289 target_drag_leave (GtkWidget *widget,
290 GdkDragContext *context,
295 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask);
299 target_drag_motion (GtkWidget *widget,
300 GdkDragContext *context,
305 GtkWidget *source_widget;
311 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_open, trashcan_open_mask);
314 source_widget = gtk_drag_get_source_widget (context);
315 g_print ("motion, source %s\n", source_widget ?
316 GTK_OBJECT_TYPE_NAME (source_widget) :
319 tmp_list = context->targets;
322 char *name = gdk_atom_name (GPOINTER_TO_UINT (tmp_list->data));
323 g_print ("%s\n", name);
326 tmp_list = tmp_list->next;
329 gdk_drag_status (context, context->suggested_action, time);
334 target_drag_drop (GtkWidget *widget,
335 GdkDragContext *context,
343 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask);
345 if (context->targets)
347 gtk_drag_get_data (widget, context,
348 GPOINTER_TO_INT (context->targets->data),
357 target_drag_data_received (GtkWidget *widget,
358 GdkDragContext *context,
361 GtkSelectionData *data,
365 if ((data->length >= 0) && (data->format == 8))
367 g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data);
368 gtk_drag_finish (context, TRUE, FALSE, time);
372 gtk_drag_finish (context, FALSE, FALSE, time);
376 label_drag_data_received (GtkWidget *widget,
377 GdkDragContext *context,
380 GtkSelectionData *data,
384 if ((data->length >= 0) && (data->format == 8))
386 g_print ("Received \"%s\" in label\n", (gchar *)data->data);
387 gtk_drag_finish (context, TRUE, FALSE, time);
391 gtk_drag_finish (context, FALSE, FALSE, time);
395 source_drag_data_get (GtkWidget *widget,
396 GdkDragContext *context,
397 GtkSelectionData *selection_data,
402 if (info == TARGET_ROOTWIN)
403 g_print ("I was dropped on the rootwin\n");
405 gtk_selection_data_set (selection_data,
406 selection_data->target,
410 /* The following is a rather elaborate example demonstrating/testing
411 * changing of the window heirarchy during a drag - in this case,
412 * via a "spring-loaded" popup window.
414 static GtkWidget *popup_window = NULL;
416 static gboolean popped_up = FALSE;
417 static gboolean in_popup = FALSE;
418 static guint popdown_timer = 0;
419 static guint popup_timer = 0;
422 popdown_cb (gpointer data)
426 gtk_widget_hide (popup_window);
433 popup_motion (GtkWidget *widget,
434 GdkDragContext *context,
444 g_print ("removed popdown\n");
445 gtk_timeout_remove (popdown_timer);
454 popup_leave (GtkWidget *widget,
455 GdkDragContext *context,
463 g_print ("added popdown\n");
464 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
470 popup_cb (gpointer data)
480 popup_window = gtk_window_new (GTK_WINDOW_POPUP);
481 gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE);
483 table = gtk_table_new (3,3, FALSE);
489 g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j);
490 button = gtk_button_new_with_label (buffer);
491 gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1,
492 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
495 gtk_drag_dest_set (button,
496 GTK_DEST_DEFAULT_ALL,
497 target_table, n_targets - 1, /* no rootwin */
498 GDK_ACTION_COPY | GDK_ACTION_MOVE);
499 gtk_signal_connect (GTK_OBJECT (button), "drag_motion",
500 GTK_SIGNAL_FUNC (popup_motion), NULL);
501 gtk_signal_connect (GTK_OBJECT (button), "drag_leave",
502 GTK_SIGNAL_FUNC (popup_leave), NULL);
505 gtk_widget_show_all (table);
506 gtk_container_add (GTK_CONTAINER (popup_window), table);
509 gtk_widget_show (popup_window);
513 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
514 g_print ("added popdown\n");
522 popsite_motion (GtkWidget *widget,
523 GdkDragContext *context,
529 popup_timer = gtk_timeout_add (500, popup_cb, NULL);
535 popsite_leave (GtkWidget *widget,
536 GdkDragContext *context,
541 gtk_timeout_remove (popup_timer);
547 source_drag_data_delete (GtkWidget *widget,
548 GdkDragContext *context,
551 g_print ("Delete the data!\n");
557 if (g_file_test ("../gdk-pixbuf/.libs/libpixbufloader-pnm.so",
560 putenv ("GDK_PIXBUF_MODULEDIR=../gdk-pixbuf/.libs");
561 putenv ("GTK_IM_MODULE_FILE=./gtk.immodules");
566 main (int argc, char **argv)
573 GdkPixmap *drag_icon;
574 GdkPixmap *drag_mask;
578 gtk_init (&argc, &argv);
580 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
581 gtk_signal_connect (GTK_OBJECT(window), "destroy",
582 GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
585 table = gtk_table_new (2, 2, FALSE);
586 gtk_container_add (GTK_CONTAINER (window), table);
588 drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL,
589 gtk_widget_get_colormap (window),
591 NULL, drag_icon_xpm);
593 trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL,
594 gtk_widget_get_colormap (window),
596 NULL, trashcan_open_xpm);
597 trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL,
598 gtk_widget_get_colormap (window),
599 &trashcan_closed_mask,
600 NULL, trashcan_closed_xpm);
602 label = gtk_label_new ("Drop Here\n");
604 gtk_drag_dest_set (label,
605 GTK_DEST_DEFAULT_ALL,
606 target_table, n_targets - 1, /* no rootwin */
607 GDK_ACTION_COPY | GDK_ACTION_MOVE);
609 gtk_signal_connect( GTK_OBJECT(label), "drag_data_received",
610 GTK_SIGNAL_FUNC( label_drag_data_received), NULL);
612 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
613 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
616 label = gtk_label_new ("Popup\n");
618 gtk_drag_dest_set (label,
619 GTK_DEST_DEFAULT_ALL,
620 target_table, n_targets - 1, /* no rootwin */
621 GDK_ACTION_COPY | GDK_ACTION_MOVE);
623 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
624 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
627 gtk_signal_connect (GTK_OBJECT (label), "drag_motion",
628 GTK_SIGNAL_FUNC (popsite_motion), NULL);
629 gtk_signal_connect (GTK_OBJECT (label), "drag_leave",
630 GTK_SIGNAL_FUNC (popsite_leave), NULL);
632 pixmap = gtk_pixmap_new (trashcan_closed, trashcan_closed_mask);
633 gtk_drag_dest_set (pixmap, 0, NULL, 0, 0);
634 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
635 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
638 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_leave",
639 GTK_SIGNAL_FUNC (target_drag_leave), NULL);
641 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_motion",
642 GTK_SIGNAL_FUNC (target_drag_motion), NULL);
644 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_drop",
645 GTK_SIGNAL_FUNC (target_drag_drop), NULL);
647 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_data_received",
648 GTK_SIGNAL_FUNC (target_drag_data_received), NULL);
652 button = gtk_button_new_with_label ("Drag Here\n");
654 gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
655 target_table, n_targets,
656 GDK_ACTION_COPY | GDK_ACTION_MOVE);
657 gtk_drag_source_set_icon (button,
658 gtk_widget_get_colormap (window),
659 drag_icon, drag_mask);
661 gdk_pixmap_unref (drag_icon);
662 gdk_pixmap_unref (drag_mask);
664 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
665 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
668 gtk_signal_connect (GTK_OBJECT (button), "drag_data_get",
669 GTK_SIGNAL_FUNC (source_drag_data_get), NULL);
670 gtk_signal_connect (GTK_OBJECT (button), "drag_data_delete",
671 GTK_SIGNAL_FUNC (source_drag_data_delete), NULL);
673 gtk_widget_show_all (window);