Mercurial > gftp.yaz
annotate src/gtk/misc-gtk.c @ 303:3b9d5797050f
2003-11-2 Brian Masney <masneyb@gftp.org>
* lib/rfc2068.c (rfc2068_chunked_read) - more improvements to this
function so that it will parse more chunked file transfers correctly.
* lib/misc.c lib/gftp.h lib/rfc2068.c src/gtk/bookmarks.c
src/gtk/dnd.c - removed remove_double_slashes(). Call gftp_build_path()
to build the paths. This now allows Novell directory listings with
//server
* lib/protocols.c src/gtk/transfer.c lib/gftp.h - added variable
conn_error_no_timeout to gftp_transfer structure. If this is enabled,
if the remote connection to the server timed out, don't wait and
immediately reconnect. So far, the only time this is used is when the
user was editing a file and it is to be uploaded back to the server.
* src/gtk/gftp-gtk.h src/gtk/transfer.c - add_file_transfer() now
returns the struct gftp_transfer that was just added.
* src/gtk/misc-gtk.c (update_directory_download_progress) - don't
make the window a popup and remove the window decorations
* src/text/gftp-text.c - don't populate the transfer_direction variable
in struct gftp_transfer. This is only needed by the GTK+ port and will
hopefully be taken out soon.
* lib/gftp.h - remove gftp_transfer_type enum. It wasn't used anymore.
author | masneyb |
---|---|
date | Mon, 03 Nov 2003 02:14:05 +0000 |
parents | 265244924868 |
children | cdabbe5c9a95 |
rev | line source |
---|---|
1 | 1 /*****************************************************************************/ |
2 /* misc-gtk.c - misc stuff for the gtk+ 1.2 port of gftp */ | |
255 | 3 /* Copyright (C) 1998-2003 Brian Masney <masneyb@gftp.org> */ |
1 | 4 /* */ |
5 /* This program is free software; you can redistribute it and/or modify */ | |
6 /* it under the terms of the GNU General Public License as published by */ | |
7 /* the Free Software Foundation; either version 2 of the License, or */ | |
8 /* (at your option) any later version. */ | |
9 /* */ | |
10 /* This program is distributed in the hope that it will be useful, */ | |
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ | |
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ | |
13 /* GNU General Public License for more details. */ | |
14 /* */ | |
15 /* You should have received a copy of the GNU General Public License */ | |
16 /* along with this program; if not, write to the Free Software */ | |
17 /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
18 /*****************************************************************************/ | |
19 | |
20 #include <gftp-gtk.h> | |
33 | 21 static const char cvsid[] = "$Id$"; |
1 | 22 |
23 static GtkWidget * statuswid; | |
24 | |
25 | |
26 void | |
27 remove_files_window (gftp_window_data * wdata) | |
28 { | |
29 wdata->show_selected = 0; | |
30 gtk_clist_freeze (GTK_CLIST (wdata->listbox)); | |
31 gtk_clist_clear (GTK_CLIST (wdata->listbox)); | |
32 free_file_list (wdata->files); | |
33 wdata->files = NULL; | |
34 gtk_clist_thaw (GTK_CLIST (wdata->listbox)); | |
35 } | |
36 | |
37 | |
38 void | |
186 | 39 ftp_log (gftp_logging_level level, gftp_request * request, |
40 const char *string, ...) | |
1 | 41 { |
129 | 42 guint max_log_window_size; |
45 | 43 int upd, free_logstr; |
1 | 44 gftp_log * newlog; |
45 | 45 char *logstr; |
1 | 46 gint delsize; |
47 va_list argp; | |
48 guint len; | |
45 | 49 #if GTK_MAJOR_VERSION == 1 |
1 | 50 gftp_color * color; |
51 GdkColor fore; | |
52 #else | |
53 GtkTextBuffer * textbuf; | |
54 GtkTextIter iter, iter2; | |
55 const char *descr; | |
291 | 56 char *utf8_str; |
1 | 57 #endif |
58 | |
59 va_start (argp, string); | |
45 | 60 if (strcmp (string, "%s") == 0) |
61 { | |
62 logstr = va_arg (argp, char *); | |
63 free_logstr = 0; | |
64 } | |
65 else | |
66 { | |
67 logstr = g_strdup_vprintf (string, argp); | |
68 free_logstr = 1; | |
69 } | |
1 | 70 va_end (argp); |
71 | |
186 | 72 #if GTK_MAJOR_VERSION > 1 |
291 | 73 if ((utf8_str = gftp_string_to_utf8 (request, logstr)) != NULL) |
186 | 74 { |
291 | 75 if (free_logstr) |
76 g_free (logstr); | |
77 else | |
78 free_logstr = 1; | |
186 | 79 |
291 | 80 logstr = utf8_str; |
186 | 81 } |
82 #endif | |
83 | |
190 | 84 if (pthread_self () != main_thread_id) |
85 { | |
86 newlog = g_malloc0 (sizeof (*newlog)); | |
87 newlog->type = level; | |
88 if (free_logstr) | |
89 newlog->msg = logstr; | |
90 else | |
91 newlog->msg = g_strdup (logstr); | |
92 | |
93 pthread_mutex_lock (&log_mutex); | |
94 gftp_file_transfer_logs = g_list_append (gftp_file_transfer_logs, newlog); | |
95 pthread_mutex_unlock (&log_mutex); | |
96 return; | |
97 } | |
98 | |
129 | 99 if (gftp_logfd != NULL) |
1 | 100 { |
129 | 101 if (fwrite (logstr, strlen (logstr), 1, gftp_logfd) != 1) |
1 | 102 { |
129 | 103 fclose (gftp_logfd); |
104 gftp_logfd = NULL; | |
1 | 105 } |
106 else | |
45 | 107 { |
129 | 108 fflush (gftp_logfd); |
109 if (ferror (gftp_logfd)) | |
45 | 110 { |
129 | 111 fclose (gftp_logfd); |
112 gftp_logfd = NULL; | |
45 | 113 } |
114 } | |
1 | 115 } |
116 | |
117 upd = logwdw_vadj->upper - logwdw_vadj->page_size == logwdw_vadj->value; | |
118 | |
129 | 119 gftp_lookup_global_option ("max_log_window_size", &max_log_window_size); |
120 | |
45 | 121 #if GTK_MAJOR_VERSION == 1 |
1 | 122 switch (level) |
123 { | |
124 case gftp_logging_send: | |
151 | 125 gftp_lookup_global_option ("send_color", &color); |
1 | 126 break; |
127 case gftp_logging_recv: | |
151 | 128 gftp_lookup_global_option ("recv_color", &color); |
1 | 129 break; |
130 case gftp_logging_error: | |
151 | 131 gftp_lookup_global_option ("error_color", &color); |
1 | 132 break; |
133 default: | |
151 | 134 gftp_lookup_global_option ("misc_color", &color); |
1 | 135 break; |
136 } | |
137 | |
138 memset (&fore, 0, sizeof (fore)); | |
139 fore.red = color->red; | |
140 fore.green = color->green; | |
141 fore.blue = color->blue; | |
142 | |
143 gtk_text_freeze (GTK_TEXT (logwdw)); | |
45 | 144 gtk_text_insert (GTK_TEXT (logwdw), NULL, &fore, NULL, logstr, -1); |
1 | 145 |
146 len = gtk_text_get_length (GTK_TEXT (logwdw)); | |
147 if (max_log_window_size > 0 && len > max_log_window_size) | |
148 { | |
149 delsize = len - max_log_window_size; | |
150 gtk_text_set_point (GTK_TEXT (logwdw), delsize); | |
151 gtk_text_backward_delete (GTK_TEXT (logwdw), delsize); | |
152 len = max_log_window_size; | |
153 } | |
154 gtk_text_set_point (GTK_TEXT (logwdw), len); | |
155 | |
156 gtk_text_thaw (GTK_TEXT (logwdw)); | |
157 | |
158 if (upd) | |
159 gtk_adjustment_set_value (logwdw_vadj, logwdw_vadj->upper); | |
160 #else | |
161 switch (level) | |
162 { | |
163 case gftp_logging_send: | |
164 descr = "send"; | |
165 break; | |
166 case gftp_logging_recv: | |
167 descr = "recv"; | |
168 break; | |
169 case gftp_logging_error: | |
170 descr = "error"; | |
171 break; | |
172 default: | |
173 descr = "misc"; | |
174 break; | |
175 } | |
176 | |
177 textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw)); | |
178 len = gtk_text_buffer_get_char_count (textbuf); | |
179 gtk_text_buffer_get_iter_at_offset (textbuf, &iter, len); | |
45 | 180 gtk_text_buffer_insert_with_tags_by_name (textbuf, &iter, logstr, -1, |
1 | 181 descr, NULL); |
182 | |
183 if (upd) | |
184 { | |
185 gtk_text_buffer_move_mark (textbuf, logwdw_textmark, &iter); | |
186 gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (logwdw), logwdw_textmark, | |
187 0, 1, 1, 1); | |
188 } | |
189 | |
45 | 190 if (max_log_window_size > 0) |
1 | 191 { |
45 | 192 delsize = len + g_utf8_strlen (logstr, -1) - max_log_window_size; |
193 | |
194 if (delsize > 0) | |
195 { | |
196 gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0); | |
197 gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, delsize); | |
198 gtk_text_buffer_delete (textbuf, &iter, &iter2); | |
199 } | |
1 | 200 } |
201 #endif | |
202 | |
45 | 203 if (free_logstr) |
204 g_free (logstr); | |
1 | 205 } |
206 | |
207 | |
208 void | |
209 refresh (gftp_window_data * wdata) | |
210 { | |
211 if (!check_status (_("Refresh"), wdata, 0, 0, 0, 1)) | |
212 return; | |
213 gtk_clist_freeze (GTK_CLIST (wdata->listbox)); | |
214 remove_files_window (wdata); | |
182 | 215 gftp_delete_cache_entry (wdata->request, NULL, 0); |
1 | 216 ftp_list_files (wdata, 0); |
217 gtk_clist_thaw (GTK_CLIST (wdata->listbox)); | |
218 } | |
219 | |
220 | |
221 void | |
222 update_window_info (void) | |
223 { | |
224 char *tempstr, empty[] = ""; | |
225 GtkWidget * tempwid; | |
226 int i; | |
227 | |
228 if (current_wdata->request != NULL) | |
229 { | |
129 | 230 if ((tempstr = current_wdata->request->hostname) == NULL) |
1 | 231 tempstr = empty; |
232 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry), tempstr); | |
233 | |
129 | 234 if ((tempstr = current_wdata->request->username) == NULL) |
1 | 235 tempstr = empty; |
236 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (useredit)->entry), tempstr); | |
237 | |
129 | 238 if ((tempstr = current_wdata->request->password) == NULL) |
1 | 239 tempstr = empty; |
240 gtk_entry_set_text (GTK_ENTRY (passedit), tempstr); | |
241 | |
129 | 242 if (current_wdata->request->port != 0) |
1 | 243 { |
129 | 244 tempstr = g_strdup_printf ("%d", current_wdata->request->port); |
1 | 245 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), tempstr); |
246 g_free (tempstr); | |
247 } | |
248 | |
249 for (i=0; gftp_protocols[i].init != NULL; i++) | |
250 { | |
251 if (current_wdata->request->init == gftp_protocols[i].init) | |
252 { | |
253 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), i); | |
254 break; | |
255 } | |
256 } | |
257 } | |
258 | |
259 update_window (&window1); | |
260 update_window (&window2); | |
261 | |
7 | 262 tempwid = gtk_item_factory_get_widget (factory, menus[tools_start+2].path); |
1 | 263 gtk_widget_set_sensitive (tempwid, GFTP_IS_CONNECTED (window1.request) |
264 && GFTP_IS_CONNECTED (window2.request)); | |
265 } | |
266 | |
267 | |
48 | 268 static void |
269 set_menu_sensitive (gftp_window_data * wdata, char *path, int sensitive) | |
270 { | |
271 GtkWidget * tempwid; | |
272 char * pos; | |
273 | |
274 tempwid = NULL; | |
275 | |
276 if (factory != NULL) | |
277 tempwid = gtk_item_factory_get_widget (factory, path); | |
278 if (tempwid) | |
279 gtk_widget_set_sensitive (tempwid, sensitive); | |
280 | |
281 if ((pos = strchr (path + 1, '/')) == NULL) | |
282 pos = path; | |
283 | |
284 if (wdata->ifactory) | |
285 tempwid = gtk_item_factory_get_widget (wdata->ifactory, pos); | |
286 if (tempwid) | |
287 gtk_widget_set_sensitive (tempwid, sensitive); | |
288 } | |
289 | |
290 | |
1 | 291 void |
292 update_window (gftp_window_data * wdata) | |
293 { | |
291 | 294 char *dir, *tempstr, *temp1str, *fspec, *utf8_directory; |
1 | 295 int connected, start; |
296 | |
297 connected = GFTP_IS_CONNECTED (wdata->request); | |
298 if (connected) | |
299 { | |
300 fspec = wdata->show_selected ? "Selected" : strcmp (wdata->filespec, "*") == 0 ? _("All Files") : wdata->filespec; | |
301 | |
129 | 302 if ((temp1str = wdata->request->hostname) == NULL || |
66 | 303 wdata->request->protonum == GFTP_LOCAL_NUM) |
1 | 304 temp1str = ""; |
305 tempstr = g_strconcat (temp1str, *temp1str == '\0' ? "[" : " [", | |
129 | 306 gftp_protocols[wdata->request->protonum].name, |
1 | 307 wdata->request->cached ? _("] (Cached) [") : "] [", |
308 fspec, "]", current_wdata == wdata ? "*" : "", NULL); | |
309 gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); | |
310 g_free (tempstr); | |
311 | |
291 | 312 utf8_directory = NULL; |
129 | 313 if ((dir = wdata->request->directory) == NULL) |
1 | 314 temp1str = ""; |
315 else | |
291 | 316 { |
317 utf8_directory = gftp_string_to_utf8 (wdata->request, | |
318 wdata->request->directory); | |
319 if (utf8_directory != NULL) | |
320 temp1str = utf8_directory; | |
321 else | |
322 temp1str = dir; | |
323 } | |
1 | 324 |
325 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry),temp1str); | |
291 | 326 |
327 if (utf8_directory != NULL) | |
328 g_free (utf8_directory); | |
1 | 329 } |
330 else if (wdata->hoststxt != NULL) | |
331 { | |
332 tempstr = g_strconcat (_("Not connected"), | |
333 current_wdata == wdata ? "*" : "", NULL); | |
334 gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); | |
335 g_free (tempstr); | |
336 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), ""); | |
337 } | |
338 | |
339 if (wdata == &window1) | |
340 start = local_start; | |
341 else | |
342 start = remote_start; | |
343 | |
344 set_menu_sensitive (wdata, menus[start + 3].path, connected && | |
345 strcmp (wdata->request->url_prefix, "file") != 0); | |
346 set_menu_sensitive (wdata, menus[start + 5].path, connected); | |
347 set_menu_sensitive (wdata, menus[start + 6].path, connected); | |
348 set_menu_sensitive (wdata, menus[start + 7].path, connected); | |
349 set_menu_sensitive (wdata, menus[start + 8].path, connected); | |
350 set_menu_sensitive (wdata, menus[start + 9].path, connected); | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
351 set_menu_sensitive (wdata, menus[start + 11].path, connected); |
1 | 352 set_menu_sensitive (wdata, menus[start + 12].path, connected && |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
353 wdata->request->site != NULL); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
354 set_menu_sensitive (wdata, menus[start + 13].path, connected && |
1 | 355 wdata->request->chdir!= NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
356 set_menu_sensitive (wdata, menus[start + 14].path, connected && |
1 | 357 wdata->request->chmod != NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
358 set_menu_sensitive (wdata, menus[start + 15].path, connected && |
1 | 359 wdata->request->mkdir != NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
360 set_menu_sensitive (wdata, menus[start + 16].path, connected && |
1 | 361 wdata->request->rename != NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
362 set_menu_sensitive (wdata, menus[start + 17].path, connected && |
1 | 363 wdata->request->rmdir != NULL && |
364 wdata->request->rmfile != NULL); | |
365 set_menu_sensitive (wdata, menus[start + 18].path, connected && | |
366 wdata->request->get_file != NULL); | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
367 set_menu_sensitive (wdata, menus[start + 19].path, connected && |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
368 wdata->request->get_file != NULL); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
369 set_menu_sensitive (wdata, menus[start + 20].path, connected); |
1 | 370 } |
371 | |
372 | |
373 GtkWidget * | |
374 toolbar_pixmap (GtkWidget * widget, char *filename) | |
375 { | |
376 gftp_graphic * graphic; | |
377 GtkWidget *pix; | |
378 | |
379 if (filename == NULL || *filename == '\0') | |
380 return (NULL); | |
381 | |
382 graphic = open_xpm (widget, filename); | |
383 | |
384 if (graphic == NULL) | |
385 return (NULL); | |
386 | |
387 if ((pix = gtk_pixmap_new (graphic->pixmap, graphic->bitmap)) == NULL) | |
388 return (NULL); | |
389 | |
390 gtk_widget_show (pix); | |
391 return (pix); | |
392 } | |
393 | |
394 | |
395 gftp_graphic * | |
396 open_xpm (GtkWidget * widget, char *filename) | |
397 { | |
398 gftp_graphic * graphic; | |
399 GtkStyle *style; | |
400 char *exfile; | |
401 | |
402 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) != NULL) | |
403 return (graphic); | |
404 | |
405 style = gtk_widget_get_style (widget); | |
406 | |
407 if ((exfile = get_xpm_path (filename, 0)) == NULL) | |
408 return (NULL); | |
409 | |
410 graphic = g_malloc0 (sizeof (*graphic)); | |
411 graphic->pixmap = gdk_pixmap_create_from_xpm (widget->window, | |
412 &graphic->bitmap, &style->bg[GTK_STATE_NORMAL], exfile); | |
413 g_free (exfile); | |
414 | |
415 if (graphic->pixmap == NULL) | |
416 { | |
417 g_free (graphic); | |
418 ftp_log (gftp_logging_error, NULL, _("Error opening file %s: %s\n"), | |
419 exfile, g_strerror (errno)); | |
420 return (NULL); | |
421 } | |
422 | |
129 | 423 graphic->filename = g_strdup (filename); |
1 | 424 g_hash_table_insert (graphic_hash_table, graphic->filename, graphic); |
425 | |
426 return (graphic); | |
427 } | |
428 | |
429 | |
430 void | |
431 gftp_free_pixmap (char *filename) | |
432 { | |
433 gftp_graphic * graphic; | |
434 | |
435 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) == NULL) | |
436 return; | |
437 | |
45 | 438 #if GTK_MAJOR_VERSION == 1 |
1 | 439 gdk_pixmap_unref (graphic->pixmap); |
440 gdk_bitmap_unref (graphic->bitmap); | |
441 #else | |
41 | 442 g_object_unref (graphic->pixmap); |
443 g_object_unref (graphic->bitmap); | |
1 | 444 #endif |
445 | |
446 g_hash_table_remove (graphic_hash_table, filename); | |
447 g_free (graphic->filename); | |
448 g_free (graphic); | |
449 } | |
450 | |
451 | |
452 void | |
453 gftp_get_pixmap (GtkWidget * widget, char *filename, GdkPixmap ** pix, | |
454 GdkBitmap ** bitmap) | |
455 { | |
456 gftp_graphic * graphic; | |
457 | |
458 if (filename == NULL || *filename == '\0') | |
459 { | |
460 *pix = NULL; | |
461 *bitmap = NULL; | |
462 return; | |
463 } | |
464 | |
465 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) == NULL) | |
466 graphic = open_xpm (widget, filename); | |
467 | |
468 if (graphic == NULL) | |
469 { | |
470 *pix = NULL; | |
471 *bitmap = NULL; | |
472 return; | |
473 } | |
474 | |
475 *pix = graphic->pixmap; | |
476 *bitmap = graphic->bitmap; | |
477 } | |
478 | |
479 | |
480 int | |
481 check_status (char *name, gftp_window_data *wdata, int check_other_stop, | |
482 int only_one, int at_least_one, int func) | |
483 { | |
484 gftp_window_data * owdata; | |
485 | |
486 owdata = wdata == &window1 ? &window2 : &window1; | |
487 | |
488 if (wdata->request->stopable) | |
489 { | |
490 ftp_log (gftp_logging_misc, NULL, | |
491 _("%s: Please hit the stop button first to do anything else\n"), | |
492 name); | |
493 return (0); | |
494 } | |
495 | |
496 if (check_other_stop && owdata->request->stopable) | |
497 { | |
498 ftp_log (gftp_logging_misc, NULL, | |
499 _("%s: Please hit the stop button first to do anything else\n"), | |
500 name); | |
501 return (0); | |
502 } | |
503 | |
504 if (!GFTP_IS_CONNECTED (wdata->request)) | |
505 { | |
506 ftp_log (gftp_logging_misc, NULL, | |
507 _("%s: Not connected to a remote site\n"), name); | |
508 return (0); | |
509 } | |
510 | |
511 if (!func) | |
512 { | |
513 ftp_log (gftp_logging_misc, NULL, | |
514 _("%s: This feature is not available using this protocol\n"), | |
515 name); | |
516 return (0); | |
517 } | |
518 | |
519 if (only_one && !IS_ONE_SELECTED (wdata)) | |
520 { | |
521 ftp_log (gftp_logging_misc, NULL, | |
522 _("%s: You must only have one item selected\n"), name); | |
523 return (0); | |
524 } | |
525 | |
526 if (at_least_one && !only_one && IS_NONE_SELECTED (wdata)) | |
527 { | |
528 ftp_log (gftp_logging_misc, NULL, | |
529 _("%s: You must have at least one item selected\n"), name); | |
530 return (0); | |
531 } | |
532 return (1); | |
533 } | |
534 | |
19 | 535 |
7 | 536 static gchar * |
168 | 537 gftp_item_factory_translate (const char *path, gpointer func_data) |
7 | 538 { |
539 const gchar *strip_prefix = func_data; | |
540 const char *result; | |
541 | |
542 if (strip_prefix) | |
543 { | |
544 char *tmp_path = g_strconcat (strip_prefix, path, NULL); | |
545 result = gettext (tmp_path); | |
546 if (result == tmp_path) | |
168 | 547 result = path; |
7 | 548 g_free (tmp_path); |
549 } | |
550 else | |
551 result = gettext (path); | |
552 | |
553 return (char *)result; | |
554 } | |
555 | |
19 | 556 |
7 | 557 GtkItemFactory * |
19 | 558 item_factory_new (GtkType container_type, const char *path, |
559 GtkAccelGroup *accel_group, const char *strip_prefix) | |
7 | 560 { |
561 GtkItemFactory *result = gtk_item_factory_new (container_type, path, accel_group); | |
201 | 562 gchar *strip_prefix_dup = g_strdup (strip_prefix); |
7 | 563 |
564 gtk_item_factory_set_translate_func (result, gftp_item_factory_translate, | |
565 strip_prefix_dup, NULL); | |
566 | |
567 if (strip_prefix_dup) | |
568 gtk_object_set_data_full (GTK_OBJECT (result), "gftp-strip-prefix", | |
569 strip_prefix_dup, (GDestroyNotify)g_free); | |
570 | |
571 return result; | |
572 } | |
1 | 573 |
19 | 574 |
1 | 575 void |
576 create_item_factory (GtkItemFactory * ifactory, guint n_entries, | |
577 GtkItemFactoryEntry * entries, gpointer callback_data) | |
578 { | |
579 int i; | |
7 | 580 const char *strip_prefix = gtk_object_get_data (GTK_OBJECT (ifactory), "gftp-strip-prefix"); |
581 int strip_prefix_len = 0; | |
582 | |
583 if (strip_prefix) | |
584 strip_prefix_len = strlen (strip_prefix); | |
1 | 585 |
586 for (i = 0; i < n_entries; i++) | |
587 { | |
7 | 588 GtkItemFactoryEntry dummy_item = entries[i]; |
589 if (strip_prefix && strncmp (entries[i].path, strip_prefix, strip_prefix_len) == 0) | |
590 dummy_item.path += strip_prefix_len; | |
591 | |
1 | 592 gtk_item_factory_create_item (ifactory, &dummy_item, callback_data, 1); |
593 } | |
594 } | |
595 | |
596 void | |
597 add_history (GtkWidget * widget, GList ** history, unsigned int *histlen, | |
598 const char *str) | |
599 { | |
600 GList *node, *delnode; | |
601 char *tempstr; | |
602 int i; | |
603 | |
604 if (str == NULL || *str == '\0') | |
605 return; | |
606 | |
607 for (node = *history; node != NULL; node = node->next) | |
608 { | |
609 if (strcmp ((char *) node->data, str) == 0) | |
610 break; | |
611 } | |
612 | |
613 if (node == NULL) | |
614 { | |
615 if (*histlen >= MAX_HIST_LEN) | |
616 { | |
617 node = *history; | |
618 for (i = 1; i < MAX_HIST_LEN; i++) | |
619 node = node->next; | |
620 node->prev->next = NULL; | |
621 node->prev = NULL; | |
622 delnode = node; | |
623 while (delnode != NULL) | |
624 { | |
625 if (delnode->data) | |
626 g_free (delnode->data); | |
627 delnode = delnode->next; | |
628 } | |
629 g_list_free (node); | |
630 } | |
129 | 631 tempstr = g_strdup (str); |
1 | 632 *history = g_list_prepend (*history, tempstr); |
633 ++*histlen; | |
634 } | |
635 else if (node->prev != NULL) | |
636 { | |
637 node->prev->next = node->next; | |
638 if (node->next != NULL) | |
639 node->next->prev = node->prev; | |
640 node->prev = NULL; | |
641 node->next = *history; | |
642 if (node->next != NULL) | |
643 node->next->prev = node; | |
644 *history = node; | |
645 } | |
646 gtk_combo_set_popdown_strings (GTK_COMBO (widget), *history); | |
647 } | |
648 | |
649 | |
650 int | |
651 check_reconnect (gftp_window_data *wdata) | |
652 { | |
169 | 653 return (wdata->request->cached && wdata->request->datafd < 0 && |
66 | 654 !wdata->request->always_connected && |
1 | 655 !ftp_connect (wdata, wdata->request, 0) ? -1 : 0); |
656 } | |
657 | |
658 | |
659 void | |
660 add_file_listbox (gftp_window_data * wdata, gftp_file * fle) | |
661 { | |
662 char *add_data[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }, *pos; | |
129 | 663 gftp_config_list_vars * tmplistvar; |
664 int clist_num, show_hidden_files; | |
1 | 665 gftp_file_extensions * tempext; |
666 char *tempstr, *str; | |
667 GdkBitmap * bitmap; | |
668 GList * templist; | |
669 GdkPixmap * pix; | |
670 size_t stlen; | |
671 | |
129 | 672 gftp_lookup_request_option (wdata->request, "show_hidden_files", |
673 &show_hidden_files); | |
674 | |
1 | 675 if (wdata->show_selected) |
676 { | |
677 fle->shown = fle->was_sel; | |
678 if (!fle->shown) | |
679 return; | |
680 } | |
681 else if ((!show_hidden_files && *fle->file == '.' && | |
682 strcmp (fle->file, "..") != 0) || | |
683 !gftp_match_filespec (fle->file, wdata->filespec)) | |
684 { | |
685 fle->shown = 0; | |
686 fle->was_sel = 0; | |
687 return; | |
688 } | |
689 else | |
690 fle->shown = 1; | |
691 | |
692 clist_num = gtk_clist_append (GTK_CLIST (wdata->listbox), add_data); | |
693 | |
694 if (fle->was_sel) | |
695 { | |
696 fle->was_sel = 0; | |
697 gtk_clist_select_row (GTK_CLIST (wdata->listbox), clist_num, 0); | |
698 } | |
699 | |
700 pix = NULL; | |
701 bitmap = NULL; | |
702 if (strcmp (fle->file, "..") == 0) | |
703 gftp_get_pixmap (wdata->listbox, "dotdot.xpm", &pix, &bitmap); | |
704 else if (fle->islink && fle->isdir) | |
705 gftp_get_pixmap (wdata->listbox, "linkdir.xpm", &pix, &bitmap); | |
706 else if (fle->islink) | |
707 gftp_get_pixmap (wdata->listbox, "linkfile.xpm", &pix, &bitmap); | |
708 else if (fle->isdir) | |
709 gftp_get_pixmap (wdata->listbox, "dir.xpm", &pix, &bitmap); | |
710 else if (fle->isexe) | |
711 gftp_get_pixmap (wdata->listbox, "exe.xpm", &pix, &bitmap); | |
712 else | |
713 { | |
714 stlen = strlen (fle->file); | |
129 | 715 gftp_lookup_global_option ("ext", &tmplistvar); |
716 templist = tmplistvar->list; | |
1 | 717 while (templist != NULL) |
718 { | |
719 tempext = templist->data; | |
720 if (stlen >= tempext->stlen && | |
721 strcmp (&fle->file[stlen - tempext->stlen], tempext->ext) == 0) | |
722 { | |
723 gftp_get_pixmap (wdata->listbox, tempext->filename, &pix, | |
724 &bitmap); | |
725 break; | |
726 } | |
727 templist = templist->next; | |
728 } | |
729 } | |
730 | |
731 if (pix == NULL && bitmap == NULL) | |
732 gftp_get_pixmap (wdata->listbox, "doc.xpm", &pix, &bitmap); | |
733 | |
734 gtk_clist_set_pixmap (GTK_CLIST (wdata->listbox), clist_num, 0, pix, bitmap); | |
735 | |
184 | 736 if (fle->utf8_file) |
737 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, | |
738 fle->utf8_file); | |
739 else if (fle->file) | |
1 | 740 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, fle->file); |
741 | |
742 if (fle->attribs && (*fle->attribs == 'b' || *fle->attribs == 'c')) | |
48 | 743 tempstr = g_strdup_printf ("%d, %d", major (fle->size), |
744 minor (fle->size)); | |
1 | 745 else |
746 tempstr = insert_commas (fle->size, NULL, 0); | |
747 | |
748 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 2, tempstr); | |
749 g_free (tempstr); | |
750 | |
751 if (fle->user) | |
752 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 3, fle->user); | |
753 if (fle->group) | |
754 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 4, fle->group); | |
755 if ((str = ctime (&fle->datetime))) | |
756 { | |
757 if ((pos = strchr (str, '\n')) != NULL) | |
758 *pos = '\0'; | |
759 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 5, str); | |
760 } | |
761 if (fle->attribs) | |
762 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 6, fle->attribs); | |
763 | |
764 } | |
765 | |
766 | |
45 | 767 #if GTK_MAJOR_VERSION == 1 |
21 | 768 static void |
769 ok_dialog_response (GtkWidget * widget, gftp_dialog_data * ddata) | |
770 { | |
771 if (ddata->edit == NULL) | |
198 | 772 { |
773 gtk_widget_destroy (ddata->dialog); | |
774 ddata->dialog = NULL; | |
775 ddata->checkbox = NULL; | |
776 } | |
21 | 777 |
778 if (ddata->yesfunc != NULL) | |
779 ddata->yesfunc (ddata->yespointer, ddata); | |
780 | |
781 if (ddata->edit != NULL) | |
782 gtk_widget_destroy (ddata->dialog); | |
783 | |
784 g_free (ddata); | |
785 } | |
786 | |
787 | |
788 static void | |
789 cancel_dialog_response (GtkWidget * widget, gftp_dialog_data * ddata) | |
790 { | |
791 if (ddata->edit == NULL) | |
198 | 792 { |
793 gtk_widget_destroy (ddata->dialog); | |
794 ddata->dialog = NULL; | |
795 ddata->checkbox = NULL; | |
796 } | |
21 | 797 |
798 if (ddata->nofunc != NULL) | |
799 ddata->nofunc (ddata->nopointer, ddata); | |
800 | |
801 if (ddata->edit != NULL) | |
802 gtk_widget_destroy (ddata->dialog); | |
803 | |
804 g_free (ddata); | |
805 } | |
806 #else | |
19 | 807 static void |
808 dialog_response (GtkWidget * widget, gint response, gftp_dialog_data * ddata) | |
809 { | |
810 if (ddata->edit == NULL) | |
198 | 811 { |
812 gtk_widget_destroy (ddata->dialog); | |
813 ddata->dialog = NULL; | |
814 ddata->checkbox = NULL; | |
815 } | |
19 | 816 |
817 switch (response) | |
818 { | |
819 case GTK_RESPONSE_YES: | |
820 if (ddata->yesfunc != NULL) | |
821 ddata->yesfunc (ddata->yespointer, ddata); | |
822 break; | |
823 default: | |
824 if (ddata->nofunc != NULL) | |
825 ddata->nofunc (ddata->nopointer, ddata); | |
826 break; | |
827 } | |
828 | |
829 if (ddata->edit != NULL) | |
72 | 830 gtk_widget_destroy (ddata->dialog); |
19 | 831 |
832 g_free (ddata); | |
833 } | |
834 #endif | |
835 | |
836 | |
72 | 837 static gint |
838 dialog_keypress (GtkWidget * widget, GdkEventKey * event, gpointer data) | |
839 { | |
840 if (event->type != GDK_KEY_PRESS) | |
841 return (FALSE); | |
842 | |
843 if (event->keyval == GDK_KP_Enter || event->keyval == GDK_Return) | |
844 { | |
845 #if GTK_MAJOR_VERSION == 1 | |
846 ok_dialog_response (widget, data); | |
847 #else | |
848 dialog_response (widget, GTK_RESPONSE_YES, data); | |
849 #endif | |
850 return (TRUE); | |
851 } | |
852 else if (event->keyval == GDK_Escape) | |
853 { | |
854 #if GTK_MAJOR_VERSION == 1 | |
855 cancel_dialog_response (widget, data); | |
856 #else | |
857 dialog_response (widget, GTK_RESPONSE_NO, data); | |
858 #endif | |
859 return (TRUE); | |
860 } | |
861 | |
862 return (FALSE); | |
863 } | |
864 | |
865 | |
1 | 866 void |
19 | 867 MakeEditDialog (char *diagtxt, char *infotxt, char *deftext, int passwd_item, |
868 char *checktext, | |
869 gftp_dialog_button okbutton, void (*okfunc) (), void *okptr, | |
870 void (*cancelfunc) (), void *cancelptr) | |
1 | 871 { |
19 | 872 GtkWidget * tempwid, * dialog; |
873 gftp_dialog_data * ddata; | |
874 const gchar * yes_text; | |
875 | |
876 ddata = g_malloc (sizeof (*ddata)); | |
877 ddata->yesfunc = okfunc; | |
878 ddata->yespointer = okptr; | |
879 ddata->nofunc = cancelfunc; | |
880 ddata->nopointer = cancelptr; | |
1 | 881 |
45 | 882 #if GTK_MAJOR_VERSION == 1 |
19 | 883 dialog = gtk_dialog_new (); |
884 gtk_window_set_title (GTK_WINDOW (dialog), diagtxt); | |
885 gtk_grab_add (dialog); | |
1 | 886 gtk_container_border_width (GTK_CONTAINER |
19 | 887 (GTK_DIALOG (dialog)->action_area), 5); |
888 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15); | |
889 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
890 #else | |
891 switch (okbutton) | |
892 { | |
893 case gftp_dialog_button_create: | |
894 yes_text = GTK_STOCK_ADD; | |
895 break; | |
896 case gftp_dialog_button_change: | |
897 yes_text = _("Change"); | |
898 break; | |
899 case gftp_dialog_button_connect: | |
900 yes_text = _("Connect"); | |
901 break; | |
902 case gftp_dialog_button_rename: | |
903 yes_text = _("Rename"); | |
904 break; | |
905 default: | |
906 yes_text = GTK_STOCK_MISSING_IMAGE; | |
907 break; | |
908 } | |
1 | 909 |
19 | 910 dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0, |
911 yes_text, | |
912 GTK_RESPONSE_YES, | |
913 GTK_STOCK_CANCEL, | |
914 GTK_RESPONSE_NO, | |
915 NULL); | |
916 #endif | |
917 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
918 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
919 gtk_window_set_wmclass (GTK_WINDOW(dialog), "edit", "gFTP"); | |
920 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
921 gtk_widget_realize (dialog); | |
1 | 922 |
19 | 923 if (gftp_icon != NULL) |
924 { | |
925 gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap, | |
926 gftp_icon->bitmap); | |
168 | 927 gdk_window_set_icon_name (dialog->window, gftp_version); |
19 | 928 } |
929 | |
930 ddata->dialog = dialog; | |
931 | |
1 | 932 tempwid = gtk_label_new (infotxt); |
19 | 933 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, TRUE, |
1 | 934 TRUE, 0); |
935 gtk_widget_show (tempwid); | |
936 | |
19 | 937 ddata->edit = gtk_entry_new (); |
72 | 938 gtk_signal_connect (GTK_OBJECT (ddata->edit), "key_press_event", |
939 GTK_SIGNAL_FUNC (dialog_keypress), (gpointer) ddata); | |
940 | |
19 | 941 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), ddata->edit, TRUE, |
1 | 942 TRUE, 0); |
19 | 943 gtk_widget_grab_focus (ddata->edit); |
944 gtk_entry_set_visibility (GTK_ENTRY (ddata->edit), passwd_item); | |
1 | 945 |
946 if (deftext != NULL) | |
947 { | |
19 | 948 gtk_entry_set_text (GTK_ENTRY (ddata->edit), deftext); |
949 gtk_entry_select_region (GTK_ENTRY (ddata->edit), 0, strlen (deftext)); | |
1 | 950 } |
19 | 951 gtk_widget_show (ddata->edit); |
1 | 952 |
19 | 953 if (checktext != NULL) |
1 | 954 { |
19 | 955 ddata->checkbox = gtk_check_button_new_with_label (checktext); |
956 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), | |
957 ddata->checkbox, TRUE, TRUE, 0); | |
958 gtk_widget_show (ddata->checkbox); | |
1 | 959 } |
960 | |
45 | 961 #if GTK_MAJOR_VERSION == 1 |
21 | 962 switch (okbutton) |
963 { | |
964 case gftp_dialog_button_create: | |
965 yes_text = _("Add"); | |
966 break; | |
967 case gftp_dialog_button_change: | |
968 yes_text = _("Change"); | |
969 break; | |
970 case gftp_dialog_button_connect: | |
971 yes_text = _("Connect"); | |
972 break; | |
973 case gftp_dialog_button_rename: | |
974 yes_text = _("Rename"); | |
975 break; | |
976 default: | |
977 yes_text = ""; | |
978 break; | |
979 } | |
980 | |
981 tempwid = gtk_button_new_with_label (yes_text); | |
1 | 982 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); |
19 | 983 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, |
1 | 984 TRUE, TRUE, 0); |
21 | 985 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
986 GTK_SIGNAL_FUNC (ok_dialog_response), | |
987 ddata); | |
1 | 988 gtk_widget_grab_default (tempwid); |
989 gtk_widget_show (tempwid); | |
990 | |
21 | 991 tempwid = gtk_button_new_with_label (_("Cancel")); |
1 | 992 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); |
19 | 993 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, |
1 | 994 TRUE, TRUE, 0); |
21 | 995 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
996 GTK_SIGNAL_FUNC (cancel_dialog_response), | |
997 ddata); | |
1 | 998 gtk_widget_show (tempwid); |
19 | 999 #else |
1000 g_signal_connect (GTK_OBJECT (dialog), "response", | |
1001 G_CALLBACK (dialog_response), ddata); | |
1002 #endif | |
1 | 1003 |
19 | 1004 gtk_widget_show (dialog); |
1 | 1005 } |
1006 | |
1007 | |
1008 void | |
19 | 1009 MakeYesNoDialog (char *diagtxt, char *infotxt, |
1010 void (*yesfunc) (), gpointer yespointer, | |
1011 void (*nofunc) (), gpointer nopointer) | |
1 | 1012 { |
19 | 1013 GtkWidget * text, * dialog; |
1014 gftp_dialog_data * ddata; | |
45 | 1015 #if GTK_MAJOR_VERSION == 1 |
21 | 1016 GtkWidget * tempwid; |
19 | 1017 #endif |
1 | 1018 |
21 | 1019 ddata = g_malloc (sizeof (*ddata)); |
1020 ddata->yesfunc = yesfunc; | |
1021 ddata->yespointer = yespointer; | |
1022 ddata->nofunc = nofunc; | |
1023 ddata->nopointer = nopointer; | |
1024 | |
45 | 1025 #if GTK_MAJOR_VERSION == 1 |
1 | 1026 dialog = gtk_dialog_new (); |
1027 gtk_grab_add (dialog); | |
1028 gtk_window_set_title (GTK_WINDOW (dialog), diagtxt); | |
1029 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), | |
1030 5); | |
1031 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15); | |
1032 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
19 | 1033 #else |
1034 dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0, | |
1035 GTK_STOCK_YES, | |
1036 GTK_RESPONSE_YES, | |
1037 GTK_STOCK_NO, | |
1038 GTK_RESPONSE_NO, | |
1039 NULL); | |
1040 #endif | |
1041 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
1042 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
1 | 1043 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); |
19 | 1044 gtk_window_set_wmclass (GTK_WINDOW(dialog), "yndiag", "gFTP"); |
1045 gtk_widget_realize (dialog); | |
1046 | |
1047 if (gftp_icon != NULL) | |
1048 { | |
1049 gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap, | |
1050 gftp_icon->bitmap); | |
168 | 1051 gdk_window_set_icon_name (dialog->window, gftp_version); |
19 | 1052 } |
1 | 1053 |
21 | 1054 ddata->dialog = dialog; |
1055 | |
1 | 1056 text = gtk_label_new (infotxt); |
1057 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), text, TRUE, TRUE, 0); | |
1058 gtk_widget_show (text); | |
1059 | |
45 | 1060 #if GTK_MAJOR_VERSION == 1 |
19 | 1061 tempwid = gtk_button_new_with_label (_(" Yes ")); |
1062 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
1063 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
1064 FALSE, FALSE, 0); | |
21 | 1065 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
72 | 1066 GTK_SIGNAL_FUNC (ok_dialog_response), ddata); |
1067 | |
19 | 1068 gtk_widget_grab_default (tempwid); |
1069 gtk_widget_show (tempwid); | |
1 | 1070 |
19 | 1071 tempwid = gtk_button_new_with_label (_(" No ")); |
1072 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
1073 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
1074 FALSE, FALSE, 0); | |
21 | 1075 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
72 | 1076 GTK_SIGNAL_FUNC (cancel_dialog_response), ddata); |
19 | 1077 gtk_widget_show (tempwid); |
1078 | |
1079 #else | |
1080 g_signal_connect (GTK_OBJECT (dialog), "response", | |
1081 G_CALLBACK (dialog_response), ddata); | |
1082 #endif | |
1 | 1083 |
1084 gtk_widget_show (dialog); | |
1085 } | |
1086 | |
1087 | |
48 | 1088 static gint |
1089 delete_event (GtkWidget * widget, GdkEvent * event, gpointer data) | |
1090 { | |
1091 return (TRUE); | |
1092 } | |
1093 | |
1094 | |
1095 static void | |
1096 trans_stop_button (GtkWidget * widget, gpointer data) | |
1097 { | |
1098 gftp_transfer * transfer; | |
1099 | |
1100 transfer = data; | |
1101 pthread_kill (((gftp_window_data *) transfer->fromwdata)->tid, SIGINT); | |
1102 } | |
1103 | |
1104 | |
1 | 1105 void |
1106 update_directory_download_progress (gftp_transfer * transfer) | |
1107 { | |
1108 static GtkWidget * dialog = NULL, * textwid, * stopwid; | |
1109 char tempstr[255]; | |
1110 GtkWidget * vbox; | |
1111 | |
1112 if (transfer->numfiles < 0 || transfer->numdirs < 0) | |
1113 { | |
1114 if (dialog != NULL) | |
1115 gtk_widget_destroy (dialog); | |
1116 dialog = NULL; | |
1117 return; | |
1118 } | |
1119 | |
1120 if (dialog == NULL) | |
1121 { | |
303 | 1122 dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
1123 #if GTK_MAJOR_VERSION > 1 | |
1124 gtk_window_set_decorated (GTK_WINDOW (dialog), 0); | |
1125 #endif | |
1 | 1126 gtk_grab_add (dialog); |
1127 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", | |
1128 GTK_SIGNAL_FUNC (delete_event), NULL); | |
1129 gtk_window_set_title (GTK_WINDOW (dialog), | |
1130 _("Getting directory listings")); | |
1131 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
1132 gtk_window_set_wmclass (GTK_WINDOW(dialog), "dirlist", "gFTP"); | |
1133 | |
1134 vbox = gtk_vbox_new (FALSE, 5); | |
1135 gtk_container_border_width (GTK_CONTAINER (vbox), 10); | |
1136 gtk_container_add (GTK_CONTAINER (dialog), vbox); | |
1137 gtk_widget_show (vbox); | |
1138 | |
1139 textwid = gtk_label_new (NULL); | |
1140 gtk_box_pack_start (GTK_BOX (vbox), textwid, TRUE, TRUE, 0); | |
1141 gtk_widget_show (textwid); | |
1142 | |
1143 statuswid = gtk_progress_bar_new (); | |
1144 gtk_progress_set_activity_mode (GTK_PROGRESS (statuswid), 1); | |
1145 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (statuswid), 3); | |
1146 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (statuswid), 5); | |
1147 gtk_box_pack_start (GTK_BOX (vbox), statuswid, TRUE, TRUE, 0); | |
1148 gtk_widget_show (statuswid); | |
1149 | |
1150 stopwid = gtk_button_new_with_label (_(" Stop ")); | |
1151 gtk_signal_connect (GTK_OBJECT (stopwid), "clicked", | |
1152 GTK_SIGNAL_FUNC (trans_stop_button), transfer); | |
1153 gtk_box_pack_start (GTK_BOX (vbox), stopwid, TRUE, TRUE, 0); | |
1154 gtk_widget_show (stopwid); | |
1155 | |
1156 gtk_widget_show (dialog); | |
1157 } | |
1158 | |
1159 g_snprintf (tempstr, sizeof (tempstr), | |
1160 _("Received %ld directories\nand %ld files"), | |
1161 transfer->numdirs, transfer->numfiles); | |
1162 gtk_label_set_text (GTK_LABEL (textwid), tempstr); | |
1163 } | |
1164 | |
1165 | |
1166 void * | |
1167 generic_thread (void * (*func) (void *), gftp_window_data * wdata) | |
1168 { | |
1169 void * ret; | |
1170 | |
1171 if (wdata->request->use_threads) | |
1172 { | |
1173 wdata->request->stopable = 1; | |
1174 gtk_widget_set_sensitive (stop_btn, 1); | |
1175 pthread_create (&wdata->tid, NULL, func, wdata); | |
1176 | |
1177 while (wdata->request->stopable) | |
31 | 1178 { |
33 | 1179 GDK_THREADS_LEAVE (); |
45 | 1180 #if GTK_MAJOR_VERSION == 1 |
31 | 1181 g_main_iteration (TRUE); |
41 | 1182 #else |
1183 g_main_context_iteration (NULL, TRUE); | |
1184 #endif | |
31 | 1185 } |
1 | 1186 |
1187 pthread_join (wdata->tid, &ret); | |
1188 gtk_widget_set_sensitive (stop_btn, 0); | |
1189 } | |
1190 else | |
1191 ret = func (wdata); | |
1192 | |
1193 if (!GFTP_IS_CONNECTED (wdata->request)) | |
1194 disconnect (wdata); | |
1195 | |
1196 return (ret); | |
1197 } | |
1198 | |
1199 | |
1200 int | |
1201 progress_timeout (gpointer data) | |
1202 { | |
1203 gftp_transfer * tdata; | |
1204 double val; | |
1205 | |
1206 tdata = data; | |
1207 | |
1208 update_directory_download_progress (tdata); | |
1209 | |
1210 val = gtk_progress_get_value (GTK_PROGRESS (statuswid)); | |
1211 if (val >= 1.0) | |
1212 val = 0; | |
1213 else | |
1214 val += 0.10; | |
1215 gtk_progress_bar_update (GTK_PROGRESS_BAR (statuswid), val); | |
1216 | |
1217 return (1); | |
1218 } | |
1219 | |
1220 | |
1221 void | |
1222 display_cached_logs (void) | |
1223 { | |
1224 gftp_log * templog; | |
1225 GList * templist; | |
1226 | |
1227 pthread_mutex_lock (&log_mutex); | |
129 | 1228 templist = gftp_file_transfer_logs; |
1 | 1229 while (templist != NULL) |
1230 { | |
1231 templog = (gftp_log *) templist->data; | |
186 | 1232 ftp_log (templog->type, NULL, "%s", templog->msg); |
1 | 1233 g_free (templog->msg); |
1234 g_free (templog); | |
1235 templist->data = NULL; | |
1236 templist = templist->next; | |
1237 } | |
129 | 1238 g_list_free (gftp_file_transfer_logs); |
1239 gftp_file_transfer_logs = NULL; | |
1 | 1240 pthread_mutex_unlock (&log_mutex); |
1241 } | |
1242 | |
42 | 1243 |
1244 RETSIGTYPE | |
1245 signal_handler (int signo) | |
1246 { | |
1247 signal (signo, signal_handler); | |
1248 | |
1249 if (use_jmp_environment) | |
1250 siglongjmp (jmp_environment, signo == SIGINT ? 1 : 2); | |
43 | 1251 else if (signo == SIGINT) |
1252 exit (1); | |
42 | 1253 } |
1254 | |
201 | 1255 |
1256 char * | |
1257 get_xpm_path (char *filename, int quit_on_err) | |
1258 { | |
1259 char *tempstr, *exfile; | |
1260 | |
1261 tempstr = g_strconcat (BASE_CONF_DIR, "/", filename, NULL); | |
1262 exfile = expand_path (tempstr); | |
1263 g_free (tempstr); | |
1264 if (access (exfile, F_OK) != 0) | |
1265 { | |
1266 g_free (exfile); | |
1267 tempstr = g_strconcat (SHARE_DIR, "/", filename, NULL); | |
1268 exfile = expand_path (tempstr); | |
1269 g_free (tempstr); | |
1270 if (access (exfile, F_OK) != 0) | |
1271 { | |
1272 g_free (exfile); | |
1273 exfile = g_strconcat ("/usr/share/icons/", filename, NULL); | |
1274 if (access (exfile, F_OK) != 0) | |
1275 { | |
1276 g_free (exfile); | |
1277 if (!quit_on_err) | |
1278 return (NULL); | |
1279 | |
1280 printf (_("gFTP Error: Cannot find file %s in %s or %s\n"), | |
1281 filename, SHARE_DIR, BASE_CONF_DIR); | |
1282 exit (1); | |
1283 } | |
1284 } | |
1285 } | |
1286 return (exfile); | |
1287 } | |
1288 |