annotate src/dnd.c @ 3:c0e337a01cb7

0.8.0
author gqview
date Thu, 13 Apr 2000 12:55:19 +0000
parents b3e0e515fabf
children d907d608745f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2 * GQview image viewer
3
gqview
parents: 1
diff changeset
3 * (C)2000 John Ellis
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
4 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
5 * Author: John Ellis
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
6 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
7 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
8
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
9 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 #include "image.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
12 enum {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13 TARGET_URI_LIST,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14 TARGET_TEXT_PLAIN
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15 };
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
16
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
17 static GtkTargetEntry file_drag_types[] = {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
18 { "text/uri-list", 0, TARGET_URI_LIST },
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
19 { "text/plain", 0, TARGET_TEXT_PLAIN }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20 };
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21 static gint n_file_drag_types = 2;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23 static GtkTargetEntry file_drop_types[] = {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 { "text/uri-list", 0, TARGET_URI_LIST }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 };
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26 static gint n_file_drop_types = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
28 static GList *get_uri_file_list(gchar *data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
29
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
30 static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31 gint x, gint y,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33 guint time, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36 guint time, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37 static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 guint time, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43 static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
44
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45 static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
46 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47 guint time, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
48 static void dir_clist_set_highlight(gint set);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50 static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
51
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
52 static GList *get_uri_file_list(gchar *data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
53 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
54 GList *list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55 gint b, e;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
56
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
57 b = e = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
58
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
59 while (data[b] != '\0')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
60 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61 while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
62 if (!strncmp(data + b, "file:", 5))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
63 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
64 b += 5;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
65 list = g_list_append(list, g_strndup(data + b, e - b));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
66 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67 while (data[e] == '\r' || data[e] == '\n') e++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
68 b = e;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71 return list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
73
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
75 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
76 * image drag and drop routines
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
77 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
78 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
79
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
80 static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
81 gint x, gint y,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
82 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
83 guint time, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
85 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
86
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
87 if (info == TARGET_URI_LIST)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
88 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
89 GList *list = get_uri_file_list(selection_data->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
90 if (list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
91 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
92 gchar *path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
93
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94 path = list->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
95
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
96 if (imd == normal_image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
97 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
98 if (isfile(path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
99 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
100 gint row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
101 gchar *dir = remove_level_from_path(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
102 if (strcmp(dir, current_path) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
103 filelist_change_to(dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
104 g_free(dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
105
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
106 row = find_file_in_list(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
107 if (row == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
108 image_change_to(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
110 file_image_change_to(row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
111 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
112 else if (isdir(path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
114 filelist_change_to(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
115 image_change_to(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
117 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
120 if (isfile(path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
121 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
122 image_area_set_image(imd, path, get_default_zoom(imd));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
123 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
124 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
125
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
126 if (debug)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
127 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
128 GList *work = list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
129 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
130 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
131 printf("dropped: %s\n", (gchar *)(work->data));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
132 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
133 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
134 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
135
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
136 g_list_foreach(list, (GFunc)g_free, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
137 g_list_free(list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
138 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
139 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
140 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
141
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
142 static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
143 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
144 guint time, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
145 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
146 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 gchar *path = image_area_get_path(imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
149 if (path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
150 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
151 gchar *text = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
152 switch (info)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
153 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
154 case TARGET_URI_LIST:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
155 text = g_strconcat("file:", path, "\r\n", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
156 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
157 case TARGET_TEXT_PLAIN:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158 text = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
160 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
161 if (text)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
162 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163 gtk_selection_data_set (selection_data, selection_data->target,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164 8, text, strlen(text));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
165 g_free(text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
166 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
168 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
169 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
170 gtk_selection_data_set (selection_data, selection_data->target,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
171 8, NULL, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
172 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
173 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
174
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
175 static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
176 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
177 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178 if (context->action == GDK_ACTION_MOVE)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
179 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
180 gint row = find_file_in_list(image_area_get_path(imd));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
181 if (row < 0) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
182 if (image_get_path() && strcmp(image_get_path(), image_area_get_path(imd)) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
183 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
184 if (row < file_count() - 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
185 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
186 file_next_image();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
187 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
188 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
189 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 file_prev_image();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
193 filelist_refresh();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
195 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197 void image_dnd_init(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
198 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
199 gtk_drag_source_set(imd->viewport, GDK_BUTTON2_MASK,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_get",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202 image_set_dnd_data, imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
203 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_end",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
204 image_drag_end, imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
205
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
206 gtk_drag_dest_set(imd->viewport,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
207 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
208 file_drop_types, n_file_drop_types,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
209 GDK_ACTION_COPY);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210 gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_received",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
211 image_get_dnd_data, imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
212 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
213
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
214 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
215 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216 * file list drag and drop routines (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
217 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
218 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
219
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222 guint time, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
223 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
224 gchar *uri_text = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
225 gchar *leader = "file:";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226 gchar *sep = "\r\n";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
227 gint total;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
228 gint leader_l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
229 gint sep_l = strlen(sep);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
230 gchar *ptr;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
231
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
232 switch (info)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
233 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
234 case TARGET_URI_LIST:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
235 leader_l = strlen(leader);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
236 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
237 case TARGET_TEXT_PLAIN:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
238 leader_l = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
239 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 default:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
241 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
242 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
243 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
244
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
245 if (file_clicked_is_selected())
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
246 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
247 GList *list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
248 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
249
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
250 list = file_get_selected_list();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
251 if (!list) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
252 work = list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
253 total = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
254
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
255 /* compute length */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
256
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
257 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
258 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
259 gchar *name = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
260 total += leader_l + strlen(name) + sep_l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
261 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
262 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
263
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
264 /* create list */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
265 uri_text = g_malloc(total + 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
266 ptr = uri_text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
267
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
268 work = list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
269 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
270 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
271 gchar *name = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 if (leader_l > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
274 strcpy(ptr, leader);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
275 ptr += leader_l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
276 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
277 strcpy(ptr, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
278 ptr += strlen(name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
279 strcpy(ptr, sep);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
280 ptr += sep_l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
282 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
283 ptr[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
284 free_selected_list(list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
285 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
286 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
287 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
288 gchar *path = file_clicked_get_path();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
289 if (!path) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
290 switch (info)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
291 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
292 case TARGET_URI_LIST:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
293 uri_text = g_strconcat("file:", path, "\r\n", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295 case TARGET_TEXT_PLAIN:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
296 uri_text = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
297 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
298 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
299 total = strlen(uri_text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
300 g_free(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
301 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
302
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
303 if (debug) printf(uri_text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
304
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
305 gtk_selection_data_set (selection_data, selection_data->target,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 8, uri_text, total);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 g_free(uri_text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
309 file_clist_highlight_unset();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
310 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
311
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312 static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
313 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314 file_clist_highlight_set();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
317 static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
318 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
319 file_clist_highlight_unset();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
320
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321 if (context->action == GDK_ACTION_MOVE)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323 filelist_refresh();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
328 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 * directory list drag and drop routines (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334 GtkSelectionData *selection_data, guint info,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335 guint time, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
339 if (row >= 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
340 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
341 gchar *name = gtk_clist_get_row_data(GTK_CLIST(dir_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
342 gchar *new_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
343 gchar *text = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
344
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
345 if (strcmp(name, ".") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
346 new_path = g_strdup(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
347 else if (strcmp(name, "..") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
348 new_path = remove_level_from_path(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
349 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
350 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
351 if (strcmp(current_path, "/") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
352 new_path = g_strconcat(current_path, name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
353 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
354 new_path = g_strconcat(current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
355 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
356
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
357
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
358 switch (info)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
359 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
360 case TARGET_URI_LIST:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
361 text = g_strconcat("file:", new_path, "\r\n", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
362 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
363 case TARGET_TEXT_PLAIN:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
364 text = g_strdup(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
365 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
366 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
367 if (text)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
368 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
369 gtk_selection_data_set (selection_data, selection_data->target,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
370 8, text, strlen(text));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
371 g_free(text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
372 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
373 g_free(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
374 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
375 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
376
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
377 static void dir_clist_set_highlight(gint set)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
378 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
379 gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
380 if (set)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
381 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
382 gtk_clist_set_background(GTK_CLIST(dir_clist), row,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
383 &GTK_WIDGET (dir_clist)->style->bg[GTK_STATE_SELECTED]);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
384 gtk_clist_set_foreground(GTK_CLIST(dir_clist), row,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
385 &GTK_WIDGET (dir_clist)->style->fg[GTK_STATE_SELECTED]);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
386 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
387 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
388 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
389 gtk_clist_set_background(GTK_CLIST(dir_clist), row, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
390 gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
391 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
392 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
393
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
394 static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
395 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
396 dir_clist_set_highlight(TRUE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
397 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
398
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
399 static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
400 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
401 dir_clist_set_highlight(FALSE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
402
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
403 if (context->action == GDK_ACTION_MOVE)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
404 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
405 filelist_refresh();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
406 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
407 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
408
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
409 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
410 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
411 * drag and drop initialization (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
412 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
414
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
415 void init_dnd()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
416 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
417 /* dir clist */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
418 gtk_drag_source_set(dir_clist, GDK_BUTTON2_MASK,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
419 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
420 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_begin",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
421 dir_list_drag_begin, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
422 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_data_get",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
423 dir_list_set_dnd_data, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
424 gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_end",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
425 dir_list_drag_end, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
426
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
427 /* file clist */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
428 gtk_drag_source_set(file_clist, GDK_BUTTON2_MASK,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
429 file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
430 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_begin",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
431 file_list_drag_begin, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
432 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_data_get",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
433 file_list_set_dnd_data, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
434 gtk_signal_connect(GTK_OBJECT(file_clist), "drag_end",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
435 file_list_drag_end, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
436
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
437 /* image */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
438 image_dnd_init(main_image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
439 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
440
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
441