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)
336 gtk_drag_get_data (widget, context,
337 GPOINTER_TO_INT (context->targets->data),
346 target_drag_data_received (GtkWidget *widget,
347 GdkDragContext *context,
350 GtkSelectionData *data,
354 if ((data->length >= 0) && (data->format == 8))
356 g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data);
357 gtk_drag_finish (context, TRUE, FALSE, time);
361 gtk_drag_finish (context, FALSE, FALSE, time);
365 label_drag_data_received (GtkWidget *widget,
366 GdkDragContext *context,
369 GtkSelectionData *data,
373 if ((data->length >= 0) && (data->format == 8))
375 g_print ("Received \"%s\" in label\n", (gchar *)data->data);
376 gtk_drag_finish (context, TRUE, FALSE, time);
380 gtk_drag_finish (context, FALSE, FALSE, time);
384 source_drag_data_get (GtkWidget *widget,
385 GdkDragContext *context,
386 GtkSelectionData *selection_data,
391 if (info == TARGET_ROOTWIN)
392 g_print ("I was dropped on the rootwin\n");
394 gtk_selection_data_set (selection_data,
395 selection_data->target,
399 /* The following is a rather elaborate example demonstrating/testing
400 * changing of the window heirarchy during a drag - in this case,
401 * via a "spring-loaded" popup window.
403 static GtkWidget *popup_window = NULL;
405 static gboolean popped_up = FALSE;
406 static gboolean in_popup = FALSE;
407 static guint popdown_timer = 0;
408 static guint popup_timer = 0;
411 popdown_cb (gpointer data)
415 gtk_widget_hide (popup_window);
422 popup_motion (GtkWidget *widget,
423 GdkDragContext *context,
433 g_print ("removed popdown\n");
434 gtk_timeout_remove (popdown_timer);
443 popup_leave (GtkWidget *widget,
444 GdkDragContext *context,
452 g_print ("added popdown\n");
453 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
459 popup_cb (gpointer data)
469 popup_window = gtk_window_new (GTK_WINDOW_POPUP);
470 gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE);
472 table = gtk_table_new (3,3, FALSE);
478 g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j);
479 button = gtk_button_new_with_label (buffer);
480 gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1,
481 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
484 gtk_drag_dest_set (button,
485 GTK_DEST_DEFAULT_ALL,
486 target_table, n_targets - 1, /* no rootwin */
487 GDK_ACTION_COPY | GDK_ACTION_MOVE);
488 gtk_signal_connect (GTK_OBJECT (button), "drag_motion",
489 GTK_SIGNAL_FUNC (popup_motion), NULL);
490 gtk_signal_connect (GTK_OBJECT (button), "drag_leave",
491 GTK_SIGNAL_FUNC (popup_leave), NULL);
494 gtk_widget_show_all (table);
495 gtk_container_add (GTK_CONTAINER (popup_window), table);
498 gtk_widget_show (popup_window);
502 popdown_timer = gtk_timeout_add (500, popdown_cb, NULL);
503 g_print ("added popdown\n");
511 popsite_motion (GtkWidget *widget,
512 GdkDragContext *context,
518 popup_timer = gtk_timeout_add (500, popup_cb, NULL);
524 popsite_leave (GtkWidget *widget,
525 GdkDragContext *context,
530 gtk_timeout_remove (popup_timer);
536 source_drag_data_delete (GtkWidget *widget,
537 GdkDragContext *context,
540 g_print ("Delete the data!\n");
544 main (int argc, char **argv)
551 GdkPixmap *drag_icon;
552 GdkPixmap *drag_mask;
554 gtk_init (&argc, &argv);
556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
557 gtk_signal_connect (GTK_OBJECT(window), "destroy",
558 GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
561 table = gtk_table_new (2, 2, FALSE);
562 gtk_container_add (GTK_CONTAINER (window), table);
564 drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL,
565 gtk_widget_get_colormap (window),
567 NULL, drag_icon_xpm);
569 trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL,
570 gtk_widget_get_colormap (window),
572 NULL, trashcan_open_xpm);
573 trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL,
574 gtk_widget_get_colormap (window),
575 &trashcan_closed_mask,
576 NULL, trashcan_closed_xpm);
578 label = gtk_label_new ("Drop Here\n");
580 gtk_drag_dest_set (label,
581 GTK_DEST_DEFAULT_ALL,
582 target_table, n_targets - 1, /* no rootwin */
583 GDK_ACTION_COPY | GDK_ACTION_MOVE);
585 gtk_signal_connect( GTK_OBJECT(label), "drag_data_received",
586 GTK_SIGNAL_FUNC( label_drag_data_received), NULL);
588 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
589 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
592 label = gtk_label_new ("Popup\n");
594 gtk_drag_dest_set (label,
595 GTK_DEST_DEFAULT_ALL,
596 target_table, n_targets - 1, /* no rootwin */
597 GDK_ACTION_COPY | GDK_ACTION_MOVE);
599 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
600 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
603 gtk_signal_connect (GTK_OBJECT (label), "drag_motion",
604 GTK_SIGNAL_FUNC (popsite_motion), NULL);
605 gtk_signal_connect (GTK_OBJECT (label), "drag_leave",
606 GTK_SIGNAL_FUNC (popsite_leave), NULL);
608 pixmap = gtk_pixmap_new (trashcan_closed, trashcan_closed_mask);
609 gtk_drag_dest_set (pixmap, 0, NULL, 0, 0);
610 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
611 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
614 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_leave",
615 GTK_SIGNAL_FUNC (target_drag_leave), NULL);
617 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_motion",
618 GTK_SIGNAL_FUNC (target_drag_motion), NULL);
620 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_drop",
621 GTK_SIGNAL_FUNC (target_drag_drop), NULL);
623 gtk_signal_connect (GTK_OBJECT (pixmap), "drag_data_received",
624 GTK_SIGNAL_FUNC (target_drag_data_received), NULL);
628 button = gtk_button_new_with_label ("Drag Here\n");
630 gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
631 target_table, n_targets,
632 GDK_ACTION_COPY | GDK_ACTION_MOVE);
633 gtk_drag_source_set_icon (button,
634 gtk_widget_get_colormap (window),
635 drag_icon, drag_mask);
637 gdk_pixmap_unref (drag_icon);
638 gdk_pixmap_unref (drag_mask);
640 gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
641 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
644 gtk_signal_connect (GTK_OBJECT (button), "drag_data_get",
645 GTK_SIGNAL_FUNC (source_drag_data_get), NULL);
646 gtk_signal_connect (GTK_OBJECT (button), "drag_data_delete",
647 GTK_SIGNAL_FUNC (source_drag_data_delete), NULL);
649 gtk_widget_show_all (window);