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;
310 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_open, trashcan_open_mask);
313 source_widget = gtk_drag_get_source_widget (context);
314 g_print("motion, source %s\n", source_widget ?
315 gtk_type_name (GTK_OBJECT (source_widget)->klass->type) :
318 gdk_drag_status (context, context->suggested_action, time);
323 target_drag_drop (GtkWidget *widget,
324 GdkDragContext *context,
332 gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask);
334 if (context->targets)
335 gtk_drag_get_data (widget, context,
336 GPOINTER_TO_INT (context->targets->data),
343 target_drag_data_received (GtkWidget *widget,
344 GdkDragContext *context,
347 GtkSelectionData *data,
351 if ((data->length >= 0) && (data->format == 8))
353 g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data);
354 gtk_drag_finish (context, TRUE, FALSE, time);
358 gtk_drag_finish (context, FALSE, FALSE, time);
362 label_drag_data_received (GtkWidget *widget,
363 GdkDragContext *context,
366 GtkSelectionData *data,
370 if ((data->length >= 0) && (data->format == 8))
372 g_print ("Received \"%s\" in label\n", (gchar *)data->data);
373 gtk_drag_finish (context, TRUE, FALSE, time);
377 gtk_drag_finish (context, FALSE, FALSE, time);
381 source_drag_data_get (GtkWidget *widget,
382 GdkDragContext *context,
383 GtkSelectionData *selection_data,
388 if (info == TARGET_ROOTWIN)
389 g_print ("I was dropped on the rootwin\n");
391 gtk_selection_data_set (selection_data,
392 selection_data->target,
396 /* The following is a rather elaborate example demonstrating/testing
397 * changing of the window heirarchy during a drag - in this case,
398 * via a "spring-loaded" popup window.
400 static GtkWidget *popup_window = NULL;
402 static gboolean popped_up = FALSE;
403 static gboolean in_popup = FALSE;
404 static guint popdown_timer = 0;
405 static guint popup_timer = 0;
408 popdown_cb (gpointer data)
412 gtk_widget_hide (popup_window);
419 popup_motion (GtkWidget *widget,
420 GdkDragContext *context,
430 g_print ("removed popdown\n");
431 gtk_timeout_remove (popdown_timer);
440 popup_leave (GtkWidget *widget,
441 GdkDragContext *context,
449 g_print ("added popdown\n");
450 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
456 popup_cb (gpointer data)
466 popup_window = gtk_window_new (GTK_WINDOW_POPUP);
467 gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE);
469 table = gtk_table_new (3,3, FALSE);
475 g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j);
476 button = gtk_button_new_with_label (buffer);
477 gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1,
478 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
481 gtk_drag_dest_set (button,
482 GTK_DEST_DEFAULT_ALL,
483 target_table, n_targets - 1, /* no rootwin */
484 GDK_ACTION_COPY | GDK_ACTION_MOVE);
485 gtk_signal_connect (GTK_OBJECT (button), "drag_motion",
486 GTK_SIGNAL_FUNC (popup_motion), NULL);
487 gtk_signal_connect (GTK_OBJECT (button), "drag_leave",
488 GTK_SIGNAL_FUNC (popup_leave), NULL);
491 gtk_widget_show_all (table);
492 gtk_container_add (GTK_CONTAINER (popup_window), table);
495 gtk_widget_show (popup_window);
499 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
500 g_print ("added popdown\n");
508 popsite_motion (GtkWidget *widget,
509 GdkDragContext *context,
515 popup_timer = gtk_timeout_add (500, popup_cb, NULL);
521 popsite_leave (GtkWidget *widget,
522 GdkDragContext *context,
527 gtk_timeout_remove (popup_timer);
533 source_drag_data_delete (GtkWidget *widget,
534 GdkDragContext *context,
537 g_print ("Delete the data!\n");
541 main (int argc, char **argv)
548 GdkPixmap *drag_icon;
549 GdkPixmap *drag_mask;
551 gtk_init (&argc, &argv);
553 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
554 gtk_signal_connect (GTK_OBJECT(window), "destroy",
555 GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
558 table = gtk_table_new (2, 2, FALSE);
559 gtk_container_add (GTK_CONTAINER (window), table);
561 drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL,
562 gtk_widget_get_colormap (window),
564 NULL, drag_icon_xpm);
566 trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL,
567 gtk_widget_get_colormap (window),
569 NULL, trashcan_open_xpm);
570 trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL,
571 gtk_widget_get_colormap (window),
572 &trashcan_closed_mask,
573 NULL, trashcan_closed_xpm);
575 label = gtk_label_new ("Drop Here\n");
577 gtk_drag_dest_set (label,
578 GTK_DEST_DEFAULT_ALL,
579 target_table, n_targets - 1, /* no rootwin */
580 GDK_ACTION_COPY | GDK_ACTION_MOVE);
582 gtk_signal_connect( GTK_OBJECT(label), "drag_data_received",
583 GTK_SIGNAL_FUNC( label_drag_data_received), NULL);
585 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
586 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
589 label = gtk_label_new ("Popup\n");
591 gtk_drag_dest_set (label,
592 GTK_DEST_DEFAULT_ALL,
593 target_table, n_targets - 1, /* no rootwin */
594 GDK_ACTION_COPY | GDK_ACTION_MOVE);
596 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
597 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
600 gtk_signal_connect (GTK_OBJECT (label), "drag_motion",
601 GTK_SIGNAL_FUNC (popsite_motion), NULL);
602 gtk_signal_connect (GTK_OBJECT (label), "drag_leave",
603 GTK_SIGNAL_FUNC (popsite_leave), NULL);
605 pixmap = gtk_pixmap_new (trashcan_closed, trashcan_closed_mask);
606 gtk_drag_dest_set (pixmap, 0, NULL, 0, 0);
607 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
608 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
611 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_leave",
612 GTK_SIGNAL_FUNC (target_drag_leave), NULL);
614 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_motion",
615 GTK_SIGNAL_FUNC (target_drag_motion), NULL);
617 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_drop",
618 GTK_SIGNAL_FUNC (target_drag_drop), NULL);
620 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_data_received",
621 GTK_SIGNAL_FUNC (target_drag_data_received), NULL);
625 button = gtk_button_new_with_label ("Drag Here\n");
627 gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
628 target_table, n_targets,
629 GDK_ACTION_COPY | GDK_ACTION_MOVE);
630 gtk_drag_source_set_icon (button,
631 gtk_widget_get_colormap (window),
632 drag_icon, drag_mask);
634 gdk_pixmap_unref (drag_icon);
635 gdk_pixmap_unref (drag_mask);
637 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
638 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
641 gtk_signal_connect (GTK_OBJECT (button), "drag_data_get",
642 GTK_SIGNAL_FUNC (source_drag_data_get), NULL);
643 gtk_signal_connect (GTK_OBJECT (button), "drag_data_delete",
644 GTK_SIGNAL_FUNC (source_drag_data_delete), NULL);
646 gtk_widget_show_all (window);