17 static GtkTargetEntry file_drag_types[] = {
18 { "text/uri-list", 0, TARGET_URI_LIST },
19 { "text/plain", 0, TARGET_TEXT_PLAIN }
21 static gint n_file_drag_types = 2;
23 static GtkTargetEntry file_drop_types[] = {
24 { "text/uri-list", 0, TARGET_URI_LIST }
26 static gint n_file_drop_types = 1;
28 static GList *get_uri_file_list(gchar *data);
30 static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
32 GtkSelectionData *selection_data, guint info,
33 guint time, gpointer data);
34 static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
35 GtkSelectionData *selection_data, guint info,
36 guint time, gpointer data);
37 static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
39 static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
40 GtkSelectionData *selection_data, guint info,
41 guint time, gpointer data);
42 static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
43 static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
45 static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
46 GtkSelectionData *selection_data, guint info,
47 guint time, gpointer data);
48 static void dir_clist_set_highlight(gint set);
49 static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
50 static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
52 static GList *get_uri_file_list(gchar *data)
59 while (data[b] != '\0')
61 while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
62 if (!strncmp(data + b, "file:", 5))
65 list = g_list_append(list, g_strndup(data + b, e - b));
67 while (data[e] == '\r' || data[e] == '\n') e++;
75 *-----------------------------------------------------------------------------
76 * image drag and drop routines
77 *-----------------------------------------------------------------------------
80 static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
82 GtkSelectionData *selection_data, guint info,
83 guint time, gpointer data)
85 ImageWindow *imd = data;
87 if (info == TARGET_URI_LIST)
89 GList *list = get_uri_file_list(selection_data->data);
96 if (imd == normal_image)
101 gchar *dir = remove_level_from_path(path);
102 if (strcmp(dir, current_path) != 0)
103 filelist_change_to(dir);
106 row = find_file_in_list(path);
108 image_change_to(path);
110 file_image_change_to(row);
112 else if (isdir(path))
114 filelist_change_to(path);
115 image_change_to(NULL);
122 image_area_set_image(imd, path, get_default_zoom(imd));
131 printf("dropped: %s\n", (gchar *)(work->data));
136 g_list_foreach(list, (GFunc)g_free, NULL);
142 static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
143 GtkSelectionData *selection_data, guint info,
144 guint time, gpointer data)
146 ImageWindow *imd = data;
147 gchar *path = image_area_get_path(imd);
154 case TARGET_URI_LIST:
155 text = g_strconcat("file:", path, "\r\n", NULL);
157 case TARGET_TEXT_PLAIN:
158 text = g_strdup(path);
163 gtk_selection_data_set (selection_data, selection_data->target,
164 8, text, strlen(text));
170 gtk_selection_data_set (selection_data, selection_data->target,
175 static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
177 ImageWindow *imd = data;
178 if (context->action == GDK_ACTION_MOVE)
180 gint row = find_file_in_list(image_area_get_path(imd));
182 if (image_get_path() && strcmp(image_get_path(), image_area_get_path(imd)) == 0)
184 if (row < file_count() - 1)
197 void image_dnd_init(ImageWindow *imd)
199 gtk_drag_source_set(imd->viewport, GDK_BUTTON2_MASK,
200 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
201 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_get",
202 image_set_dnd_data, imd);
203 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_end",
204 image_drag_end, imd);
206 gtk_drag_dest_set(imd->viewport,
207 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
208 file_drop_types, n_file_drop_types,
210 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_received",
211 image_get_dnd_data, imd);
215 *-----------------------------------------------------------------------------
216 * file list drag and drop routines (private)
217 *-----------------------------------------------------------------------------
220 static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
221 GtkSelectionData *selection_data, guint info,
222 guint time, gpointer data)
224 gchar *uri_text = NULL;
225 gchar *leader = "file:";
229 gint sep_l = strlen(sep);
234 case TARGET_URI_LIST:
235 leader_l = strlen(leader);
237 case TARGET_TEXT_PLAIN:
245 if (file_clicked_is_selected())
250 list = file_get_selected_list();
259 gchar *name = work->data;
260 total += leader_l + strlen(name) + sep_l;
265 uri_text = g_malloc(total + 1);
271 gchar *name = work->data;
284 free_selected_list(list);
288 gchar *path = file_clicked_get_path();
292 case TARGET_URI_LIST:
293 uri_text = g_strconcat("file:", path, "\r\n", NULL);
295 case TARGET_TEXT_PLAIN:
296 uri_text = g_strdup(path);
299 total = strlen(uri_text);
303 if (debug) printf(uri_text);
305 gtk_selection_data_set (selection_data, selection_data->target,
309 file_clist_highlight_unset();
312 static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
314 file_clist_highlight_set();
317 static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
319 file_clist_highlight_unset();
321 if (context->action == GDK_ACTION_MOVE)
328 *-----------------------------------------------------------------------------
329 * directory list drag and drop routines (private)
330 *-----------------------------------------------------------------------------
333 static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
334 GtkSelectionData *selection_data, guint info,
335 guint time, gpointer data)
337 gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
341 gchar *name = gtk_clist_get_row_data(GTK_CLIST(dir_clist), row);
345 if (strcmp(name, ".") == 0)
346 new_path = g_strdup(current_path);
347 else if (strcmp(name, "..") == 0)
348 new_path = remove_level_from_path(current_path);
351 if (strcmp(current_path, "/") == 0)
352 new_path = g_strconcat(current_path, name, NULL);
354 new_path = g_strconcat(current_path, "/", name, NULL);
360 case TARGET_URI_LIST:
361 text = g_strconcat("file:", new_path, "\r\n", NULL);
363 case TARGET_TEXT_PLAIN:
364 text = g_strdup(new_path);
369 gtk_selection_data_set (selection_data, selection_data->target,
370 8, text, strlen(text));
377 static void dir_clist_set_highlight(gint set)
379 gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
382 gtk_clist_set_background(GTK_CLIST(dir_clist), row,
383 >K_WIDGET (dir_clist)->style->bg[GTK_STATE_SELECTED]);
384 gtk_clist_set_foreground(GTK_CLIST(dir_clist), row,
385 >K_WIDGET (dir_clist)->style->fg[GTK_STATE_SELECTED]);
389 gtk_clist_set_background(GTK_CLIST(dir_clist), row, NULL);
390 gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, NULL);
394 static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
396 dir_clist_set_highlight(TRUE);
399 static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
401 dir_clist_set_highlight(FALSE);
403 if (context->action == GDK_ACTION_MOVE)
410 *-----------------------------------------------------------------------------
411 * drag and drop initialization (public)
412 *-----------------------------------------------------------------------------
418 gtk_drag_source_set(dir_clist, GDK_BUTTON2_MASK,
419 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
420 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_begin",
421 dir_list_drag_begin, NULL);
422 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_data_get",
423 dir_list_set_dnd_data, NULL);
424 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_end",
425 dir_list_drag_end, NULL);
428 gtk_drag_source_set(file_clist, GDK_BUTTON2_MASK,
429 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
430 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_begin",
431 file_list_drag_begin, NULL);
432 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_data_get",
433 file_list_set_dnd_data, NULL);
434 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_end",
435 file_list_drag_end, NULL);
438 image_dnd_init(main_image);