Mercurial > gftp.yaz
annotate src/gtk/misc-gtk.c @ 542:fd9ce7797984
2004-8-21 Brian Masney <masneyb@gftp.org>
* lib/gftp.h lib/options.h lib/protocols.c - added
gftp_protocol_default_port() that will return the default port for
the current protocol
* src/gtk/misc-gtk.c (update_window_info) - when updating the toolbar
with the connection status, if the current connection is using the
default port for it's protocol, then leave the port field blank. This
should help users who want to reconnect to the current site using a
different protocol
* src/gtk/gftp-gtk.c (CreateConnectToolbar) - expanded the size of
the Port input box
author | masneyb |
---|---|
date | Sat, 21 Aug 2004 15:49:34 +0000 |
parents | 739afd9df73c |
children | 7f54d0c0edbc |
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 | |
518 | 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 { |
326 | 42 uintptr_t max_log_window_size; |
45 | 43 int upd, free_logstr; |
1 | 44 gftp_log * newlog; |
519 | 45 gint delsize; |
45 | 46 char *logstr; |
1 | 47 va_list argp; |
519 | 48 size_t 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 | |
354 | 99 if (gftp_logfd != NULL && level != gftp_logging_misc_nolog) |
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 update_window_info (void) | |
210 { | |
211 char *tempstr, empty[] = ""; | |
212 GtkWidget * tempwid; | |
542 | 213 unsigned int port; |
1 | 214 int i; |
215 | |
216 if (current_wdata->request != NULL) | |
217 { | |
129 | 218 if ((tempstr = current_wdata->request->hostname) == NULL) |
1 | 219 tempstr = empty; |
220 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry), tempstr); | |
221 | |
129 | 222 if ((tempstr = current_wdata->request->username) == NULL) |
1 | 223 tempstr = empty; |
224 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (useredit)->entry), tempstr); | |
225 | |
129 | 226 if ((tempstr = current_wdata->request->password) == NULL) |
1 | 227 tempstr = empty; |
228 gtk_entry_set_text (GTK_ENTRY (passedit), tempstr); | |
229 | |
542 | 230 port = gftp_protocol_default_port (current_wdata->request); |
231 if (current_wdata->request->port != 0 && | |
232 port != current_wdata->request->port) | |
1 | 233 { |
129 | 234 tempstr = g_strdup_printf ("%d", current_wdata->request->port); |
1 | 235 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), tempstr); |
236 g_free (tempstr); | |
237 } | |
542 | 238 else |
239 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), ""); | |
1 | 240 |
518 | 241 for (i=0; gftp_protocols[i].init != NULL; i++) |
242 { | |
243 if (current_wdata->request->init == gftp_protocols[i].init) | |
244 { | |
245 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), i); | |
246 break; | |
247 } | |
248 } | |
1 | 249 } |
250 | |
251 update_window (&window1); | |
252 update_window (&window2); | |
253 | |
7 | 254 tempwid = gtk_item_factory_get_widget (factory, menus[tools_start+2].path); |
1 | 255 gtk_widget_set_sensitive (tempwid, GFTP_IS_CONNECTED (window1.request) |
256 && GFTP_IS_CONNECTED (window2.request)); | |
257 } | |
258 | |
259 | |
48 | 260 static void |
261 set_menu_sensitive (gftp_window_data * wdata, char *path, int sensitive) | |
262 { | |
263 GtkWidget * tempwid; | |
264 char * pos; | |
265 | |
266 tempwid = NULL; | |
267 | |
268 if (factory != NULL) | |
269 tempwid = gtk_item_factory_get_widget (factory, path); | |
270 if (tempwid) | |
271 gtk_widget_set_sensitive (tempwid, sensitive); | |
272 | |
273 if ((pos = strchr (path + 1, '/')) == NULL) | |
274 pos = path; | |
275 | |
276 if (wdata->ifactory) | |
277 tempwid = gtk_item_factory_get_widget (wdata->ifactory, pos); | |
278 if (tempwid) | |
279 gtk_widget_set_sensitive (tempwid, sensitive); | |
280 } | |
281 | |
282 | |
1 | 283 void |
284 update_window (gftp_window_data * wdata) | |
285 { | |
291 | 286 char *dir, *tempstr, *temp1str, *fspec, *utf8_directory; |
1 | 287 int connected, start; |
288 | |
289 connected = GFTP_IS_CONNECTED (wdata->request); | |
290 if (connected) | |
291 { | |
292 fspec = wdata->show_selected ? "Selected" : strcmp (wdata->filespec, "*") == 0 ? _("All Files") : wdata->filespec; | |
293 | |
129 | 294 if ((temp1str = wdata->request->hostname) == NULL || |
66 | 295 wdata->request->protonum == GFTP_LOCAL_NUM) |
1 | 296 temp1str = ""; |
297 tempstr = g_strconcat (temp1str, *temp1str == '\0' ? "[" : " [", | |
129 | 298 gftp_protocols[wdata->request->protonum].name, |
1 | 299 wdata->request->cached ? _("] (Cached) [") : "] [", |
300 fspec, "]", current_wdata == wdata ? "*" : "", NULL); | |
301 gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); | |
302 g_free (tempstr); | |
303 | |
291 | 304 utf8_directory = NULL; |
129 | 305 if ((dir = wdata->request->directory) == NULL) |
1 | 306 temp1str = ""; |
307 else | |
291 | 308 { |
309 utf8_directory = gftp_string_to_utf8 (wdata->request, | |
310 wdata->request->directory); | |
311 if (utf8_directory != NULL) | |
312 temp1str = utf8_directory; | |
313 else | |
314 temp1str = dir; | |
315 } | |
1 | 316 |
317 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry),temp1str); | |
291 | 318 |
319 if (utf8_directory != NULL) | |
320 g_free (utf8_directory); | |
1 | 321 } |
322 else if (wdata->hoststxt != NULL) | |
323 { | |
324 tempstr = g_strconcat (_("Not connected"), | |
325 current_wdata == wdata ? "*" : "", NULL); | |
326 gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); | |
327 g_free (tempstr); | |
328 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), ""); | |
329 } | |
330 | |
331 if (wdata == &window1) | |
332 start = local_start; | |
333 else | |
334 start = remote_start; | |
335 | |
336 set_menu_sensitive (wdata, menus[start + 3].path, connected && | |
337 strcmp (wdata->request->url_prefix, "file") != 0); | |
338 set_menu_sensitive (wdata, menus[start + 5].path, connected); | |
339 set_menu_sensitive (wdata, menus[start + 6].path, connected); | |
340 set_menu_sensitive (wdata, menus[start + 7].path, connected); | |
341 set_menu_sensitive (wdata, menus[start + 8].path, connected); | |
342 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
|
343 set_menu_sensitive (wdata, menus[start + 11].path, connected); |
1 | 344 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
|
345 wdata->request->site != NULL); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
346 set_menu_sensitive (wdata, menus[start + 13].path, connected && |
1 | 347 wdata->request->chdir!= NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
348 set_menu_sensitive (wdata, menus[start + 14].path, connected && |
1 | 349 wdata->request->chmod != NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
350 set_menu_sensitive (wdata, menus[start + 15].path, connected && |
1 | 351 wdata->request->mkdir != NULL); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
352 set_menu_sensitive (wdata, menus[start + 16].path, connected && |
1 | 353 wdata->request->rename != NULL); |
14
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 + 17].path, connected && |
1 | 355 wdata->request->rmdir != NULL && |
356 wdata->request->rmfile != NULL); | |
357 set_menu_sensitive (wdata, menus[start + 18].path, connected && | |
358 wdata->request->get_file != NULL); | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
359 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
|
360 wdata->request->get_file != NULL); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
361 set_menu_sensitive (wdata, menus[start + 20].path, connected); |
1 | 362 } |
363 | |
364 | |
365 GtkWidget * | |
366 toolbar_pixmap (GtkWidget * widget, char *filename) | |
367 { | |
368 gftp_graphic * graphic; | |
369 GtkWidget *pix; | |
370 | |
371 if (filename == NULL || *filename == '\0') | |
372 return (NULL); | |
373 | |
374 graphic = open_xpm (widget, filename); | |
375 | |
376 if (graphic == NULL) | |
377 return (NULL); | |
378 | |
379 if ((pix = gtk_pixmap_new (graphic->pixmap, graphic->bitmap)) == NULL) | |
380 return (NULL); | |
381 | |
382 gtk_widget_show (pix); | |
383 return (pix); | |
384 } | |
385 | |
386 | |
387 gftp_graphic * | |
388 open_xpm (GtkWidget * widget, char *filename) | |
389 { | |
390 gftp_graphic * graphic; | |
391 GtkStyle *style; | |
392 char *exfile; | |
393 | |
394 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) != NULL) | |
395 return (graphic); | |
396 | |
397 style = gtk_widget_get_style (widget); | |
398 | |
399 if ((exfile = get_xpm_path (filename, 0)) == NULL) | |
400 return (NULL); | |
401 | |
402 graphic = g_malloc0 (sizeof (*graphic)); | |
403 graphic->pixmap = gdk_pixmap_create_from_xpm (widget->window, | |
404 &graphic->bitmap, &style->bg[GTK_STATE_NORMAL], exfile); | |
405 g_free (exfile); | |
406 | |
407 if (graphic->pixmap == NULL) | |
408 { | |
409 g_free (graphic); | |
410 ftp_log (gftp_logging_error, NULL, _("Error opening file %s: %s\n"), | |
411 exfile, g_strerror (errno)); | |
412 return (NULL); | |
413 } | |
414 | |
129 | 415 graphic->filename = g_strdup (filename); |
1 | 416 g_hash_table_insert (graphic_hash_table, graphic->filename, graphic); |
417 | |
418 return (graphic); | |
419 } | |
420 | |
421 | |
422 void | |
423 gftp_free_pixmap (char *filename) | |
424 { | |
425 gftp_graphic * graphic; | |
426 | |
427 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) == NULL) | |
428 return; | |
429 | |
45 | 430 #if GTK_MAJOR_VERSION == 1 |
1 | 431 gdk_pixmap_unref (graphic->pixmap); |
432 gdk_bitmap_unref (graphic->bitmap); | |
433 #else | |
41 | 434 g_object_unref (graphic->pixmap); |
435 g_object_unref (graphic->bitmap); | |
1 | 436 #endif |
437 | |
438 g_hash_table_remove (graphic_hash_table, filename); | |
439 g_free (graphic->filename); | |
440 g_free (graphic); | |
441 } | |
442 | |
443 | |
444 void | |
445 gftp_get_pixmap (GtkWidget * widget, char *filename, GdkPixmap ** pix, | |
446 GdkBitmap ** bitmap) | |
447 { | |
448 gftp_graphic * graphic; | |
449 | |
450 if (filename == NULL || *filename == '\0') | |
451 { | |
452 *pix = NULL; | |
453 *bitmap = NULL; | |
454 return; | |
455 } | |
456 | |
457 if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) == NULL) | |
458 graphic = open_xpm (widget, filename); | |
459 | |
460 if (graphic == NULL) | |
461 { | |
462 *pix = NULL; | |
463 *bitmap = NULL; | |
464 return; | |
465 } | |
466 | |
467 *pix = graphic->pixmap; | |
468 *bitmap = graphic->bitmap; | |
469 } | |
470 | |
471 | |
472 int | |
473 check_status (char *name, gftp_window_data *wdata, int check_other_stop, | |
474 int only_one, int at_least_one, int func) | |
475 { | |
476 gftp_window_data * owdata; | |
477 | |
478 owdata = wdata == &window1 ? &window2 : &window1; | |
479 | |
480 if (wdata->request->stopable) | |
481 { | |
482 ftp_log (gftp_logging_misc, NULL, | |
483 _("%s: Please hit the stop button first to do anything else\n"), | |
484 name); | |
485 return (0); | |
486 } | |
487 | |
488 if (check_other_stop && owdata->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 (!GFTP_IS_CONNECTED (wdata->request)) | |
497 { | |
498 ftp_log (gftp_logging_misc, NULL, | |
499 _("%s: Not connected to a remote site\n"), name); | |
500 return (0); | |
501 } | |
502 | |
503 if (!func) | |
504 { | |
505 ftp_log (gftp_logging_misc, NULL, | |
506 _("%s: This feature is not available using this protocol\n"), | |
507 name); | |
508 return (0); | |
509 } | |
510 | |
511 if (only_one && !IS_ONE_SELECTED (wdata)) | |
512 { | |
513 ftp_log (gftp_logging_misc, NULL, | |
514 _("%s: You must only have one item selected\n"), name); | |
515 return (0); | |
516 } | |
517 | |
518 if (at_least_one && !only_one && IS_NONE_SELECTED (wdata)) | |
519 { | |
520 ftp_log (gftp_logging_misc, NULL, | |
521 _("%s: You must have at least one item selected\n"), name); | |
522 return (0); | |
523 } | |
524 return (1); | |
525 } | |
526 | |
19 | 527 |
7 | 528 static gchar * |
168 | 529 gftp_item_factory_translate (const char *path, gpointer func_data) |
7 | 530 { |
531 const gchar *strip_prefix = func_data; | |
532 const char *result; | |
533 | |
534 if (strip_prefix) | |
535 { | |
536 char *tmp_path = g_strconcat (strip_prefix, path, NULL); | |
537 result = gettext (tmp_path); | |
538 if (result == tmp_path) | |
168 | 539 result = path; |
7 | 540 g_free (tmp_path); |
541 } | |
542 else | |
543 result = gettext (path); | |
544 | |
545 return (char *)result; | |
546 } | |
547 | |
19 | 548 |
7 | 549 GtkItemFactory * |
19 | 550 item_factory_new (GtkType container_type, const char *path, |
551 GtkAccelGroup *accel_group, const char *strip_prefix) | |
7 | 552 { |
553 GtkItemFactory *result = gtk_item_factory_new (container_type, path, accel_group); | |
201 | 554 gchar *strip_prefix_dup = g_strdup (strip_prefix); |
7 | 555 |
556 gtk_item_factory_set_translate_func (result, gftp_item_factory_translate, | |
557 strip_prefix_dup, NULL); | |
558 | |
559 if (strip_prefix_dup) | |
560 gtk_object_set_data_full (GTK_OBJECT (result), "gftp-strip-prefix", | |
561 strip_prefix_dup, (GDestroyNotify)g_free); | |
562 | |
563 return result; | |
564 } | |
1 | 565 |
19 | 566 |
1 | 567 void |
568 create_item_factory (GtkItemFactory * ifactory, guint n_entries, | |
569 GtkItemFactoryEntry * entries, gpointer callback_data) | |
570 { | |
518 | 571 const char *strip_prefix; |
572 size_t strip_prefix_len; | |
521 | 573 size_t i; |
7 | 574 |
518 | 575 strip_prefix = gtk_object_get_data (GTK_OBJECT (ifactory), "gftp-strip-prefix"); |
7 | 576 if (strip_prefix) |
577 strip_prefix_len = strlen (strip_prefix); | |
518 | 578 else |
579 strip_prefix_len = 0; | |
1 | 580 |
581 for (i = 0; i < n_entries; i++) | |
582 { | |
7 | 583 GtkItemFactoryEntry dummy_item = entries[i]; |
584 if (strip_prefix && strncmp (entries[i].path, strip_prefix, strip_prefix_len) == 0) | |
585 dummy_item.path += strip_prefix_len; | |
586 | |
1 | 587 gtk_item_factory_create_item (ifactory, &dummy_item, callback_data, 1); |
588 } | |
589 } | |
590 | |
591 void | |
592 add_history (GtkWidget * widget, GList ** history, unsigned int *histlen, | |
593 const char *str) | |
594 { | |
595 GList *node, *delnode; | |
596 char *tempstr; | |
597 int i; | |
598 | |
599 if (str == NULL || *str == '\0') | |
600 return; | |
601 | |
602 for (node = *history; node != NULL; node = node->next) | |
603 { | |
604 if (strcmp ((char *) node->data, str) == 0) | |
605 break; | |
606 } | |
607 | |
608 if (node == NULL) | |
609 { | |
610 if (*histlen >= MAX_HIST_LEN) | |
611 { | |
612 node = *history; | |
613 for (i = 1; i < MAX_HIST_LEN; i++) | |
614 node = node->next; | |
615 node->prev->next = NULL; | |
616 node->prev = NULL; | |
617 delnode = node; | |
618 while (delnode != NULL) | |
619 { | |
620 if (delnode->data) | |
621 g_free (delnode->data); | |
622 delnode = delnode->next; | |
623 } | |
624 g_list_free (node); | |
625 } | |
129 | 626 tempstr = g_strdup (str); |
1 | 627 *history = g_list_prepend (*history, tempstr); |
628 ++*histlen; | |
629 } | |
630 else if (node->prev != NULL) | |
631 { | |
632 node->prev->next = node->next; | |
633 if (node->next != NULL) | |
634 node->next->prev = node->prev; | |
635 node->prev = NULL; | |
636 node->next = *history; | |
637 if (node->next != NULL) | |
638 node->next->prev = node; | |
639 *history = node; | |
640 } | |
641 gtk_combo_set_popdown_strings (GTK_COMBO (widget), *history); | |
642 } | |
643 | |
644 | |
645 int | |
646 check_reconnect (gftp_window_data *wdata) | |
647 { | |
169 | 648 return (wdata->request->cached && wdata->request->datafd < 0 && |
66 | 649 !wdata->request->always_connected && |
1 | 650 !ftp_connect (wdata, wdata->request, 0) ? -1 : 0); |
651 } | |
652 | |
653 | |
654 void | |
655 add_file_listbox (gftp_window_data * wdata, gftp_file * fle) | |
656 { | |
499 | 657 char *add_data[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; |
658 char *tempstr, *str, *pos, *attribs; | |
129 | 659 gftp_config_list_vars * tmplistvar; |
499 | 660 gftp_file_extensions * tempext; |
326 | 661 intptr_t show_hidden_files; |
1 | 662 GdkBitmap * bitmap; |
663 GList * templist; | |
664 GdkPixmap * pix; | |
499 | 665 int clist_num; |
1 | 666 size_t stlen; |
667 | |
129 | 668 gftp_lookup_request_option (wdata->request, "show_hidden_files", |
669 &show_hidden_files); | |
670 | |
1 | 671 if (wdata->show_selected) |
672 { | |
673 fle->shown = fle->was_sel; | |
674 if (!fle->shown) | |
675 return; | |
676 } | |
677 else if ((!show_hidden_files && *fle->file == '.' && | |
678 strcmp (fle->file, "..") != 0) || | |
679 !gftp_match_filespec (fle->file, wdata->filespec)) | |
680 { | |
681 fle->shown = 0; | |
682 fle->was_sel = 0; | |
683 return; | |
684 } | |
685 else | |
686 fle->shown = 1; | |
687 | |
688 clist_num = gtk_clist_append (GTK_CLIST (wdata->listbox), add_data); | |
689 | |
690 if (fle->was_sel) | |
691 { | |
692 fle->was_sel = 0; | |
693 gtk_clist_select_row (GTK_CLIST (wdata->listbox), clist_num, 0); | |
694 } | |
695 | |
696 pix = NULL; | |
697 bitmap = NULL; | |
698 if (strcmp (fle->file, "..") == 0) | |
699 gftp_get_pixmap (wdata->listbox, "dotdot.xpm", &pix, &bitmap); | |
499 | 700 else if (S_ISLNK (fle->st_mode) && S_ISDIR (fle->st_mode)) |
1 | 701 gftp_get_pixmap (wdata->listbox, "linkdir.xpm", &pix, &bitmap); |
499 | 702 else if (S_ISLNK (fle->st_mode)) |
1 | 703 gftp_get_pixmap (wdata->listbox, "linkfile.xpm", &pix, &bitmap); |
500 | 704 else if (S_ISDIR (fle->st_mode)) |
1 | 705 gftp_get_pixmap (wdata->listbox, "dir.xpm", &pix, &bitmap); |
499 | 706 else if ((fle->st_mode & S_IXUSR) || |
707 (fle->st_mode & S_IXGRP) || | |
708 (fle->st_mode & S_IXOTH)) | |
1 | 709 gftp_get_pixmap (wdata->listbox, "exe.xpm", &pix, &bitmap); |
710 else | |
711 { | |
712 stlen = strlen (fle->file); | |
129 | 713 gftp_lookup_global_option ("ext", &tmplistvar); |
714 templist = tmplistvar->list; | |
1 | 715 while (templist != NULL) |
716 { | |
717 tempext = templist->data; | |
718 if (stlen >= tempext->stlen && | |
719 strcmp (&fle->file[stlen - tempext->stlen], tempext->ext) == 0) | |
720 { | |
721 gftp_get_pixmap (wdata->listbox, tempext->filename, &pix, | |
722 &bitmap); | |
723 break; | |
724 } | |
725 templist = templist->next; | |
726 } | |
727 } | |
728 | |
729 if (pix == NULL && bitmap == NULL) | |
730 gftp_get_pixmap (wdata->listbox, "doc.xpm", &pix, &bitmap); | |
731 | |
732 gtk_clist_set_pixmap (GTK_CLIST (wdata->listbox), clist_num, 0, pix, bitmap); | |
733 | |
184 | 734 if (fle->utf8_file) |
735 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, | |
736 fle->utf8_file); | |
737 else if (fle->file) | |
1 | 738 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, fle->file); |
739 | |
499 | 740 if (GFTP_IS_SPECIAL_DEVICE (fle->st_mode)) |
48 | 741 tempstr = g_strdup_printf ("%d, %d", major (fle->size), |
742 minor (fle->size)); | |
1 | 743 else |
744 tempstr = insert_commas (fle->size, NULL, 0); | |
745 | |
746 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 2, tempstr); | |
747 g_free (tempstr); | |
748 | |
749 if (fle->user) | |
750 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 3, fle->user); | |
751 if (fle->group) | |
752 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 4, fle->group); | |
753 if ((str = ctime (&fle->datetime))) | |
754 { | |
755 if ((pos = strchr (str, '\n')) != NULL) | |
756 *pos = '\0'; | |
757 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 5, str); | |
758 } | |
499 | 759 |
760 attribs = gftp_convert_attributes_from_mode_t (fle->st_mode); | |
761 gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 6, attribs); | |
762 g_free (attribs); | |
1 | 763 |
764 } | |
765 | |
766 | |
425 | 767 void |
768 destroy_dialog (gftp_dialog_data * ddata) | |
769 { | |
770 if (ddata->dialog != NULL) | |
771 { | |
772 gtk_widget_destroy (ddata->dialog); | |
773 ddata->dialog = NULL; | |
774 } | |
775 } | |
776 | |
777 | |
45 | 778 #if GTK_MAJOR_VERSION == 1 |
21 | 779 static void |
780 ok_dialog_response (GtkWidget * widget, gftp_dialog_data * ddata) | |
781 { | |
782 if (ddata->edit == NULL) | |
198 | 783 { |
784 gtk_widget_destroy (ddata->dialog); | |
785 ddata->dialog = NULL; | |
786 ddata->checkbox = NULL; | |
787 } | |
21 | 788 |
789 if (ddata->yesfunc != NULL) | |
790 ddata->yesfunc (ddata->yespointer, ddata); | |
791 | |
425 | 792 if (ddata->edit != NULL && |
793 ddata->dialog != NULL) | |
21 | 794 gtk_widget_destroy (ddata->dialog); |
795 | |
796 g_free (ddata); | |
797 } | |
798 | |
799 | |
800 static void | |
801 cancel_dialog_response (GtkWidget * widget, gftp_dialog_data * ddata) | |
802 { | |
803 if (ddata->edit == NULL) | |
198 | 804 { |
805 gtk_widget_destroy (ddata->dialog); | |
806 ddata->dialog = NULL; | |
807 ddata->checkbox = NULL; | |
808 } | |
21 | 809 |
810 if (ddata->nofunc != NULL) | |
811 ddata->nofunc (ddata->nopointer, ddata); | |
812 | |
425 | 813 if (ddata->edit != NULL && |
814 ddata->dialog != NULL) | |
21 | 815 gtk_widget_destroy (ddata->dialog); |
816 | |
817 g_free (ddata); | |
818 } | |
819 #else | |
19 | 820 static void |
821 dialog_response (GtkWidget * widget, gint response, gftp_dialog_data * ddata) | |
822 { | |
823 if (ddata->edit == NULL) | |
198 | 824 { |
825 gtk_widget_destroy (ddata->dialog); | |
826 ddata->dialog = NULL; | |
827 ddata->checkbox = NULL; | |
828 } | |
19 | 829 |
830 switch (response) | |
831 { | |
832 case GTK_RESPONSE_YES: | |
833 if (ddata->yesfunc != NULL) | |
834 ddata->yesfunc (ddata->yespointer, ddata); | |
835 break; | |
836 default: | |
837 if (ddata->nofunc != NULL) | |
838 ddata->nofunc (ddata->nopointer, ddata); | |
839 break; | |
840 } | |
841 | |
425 | 842 if (ddata->edit != NULL && |
843 ddata->dialog != NULL) | |
72 | 844 gtk_widget_destroy (ddata->dialog); |
19 | 845 |
846 g_free (ddata); | |
847 } | |
848 #endif | |
849 | |
850 | |
72 | 851 static gint |
852 dialog_keypress (GtkWidget * widget, GdkEventKey * event, gpointer data) | |
853 { | |
854 if (event->type != GDK_KEY_PRESS) | |
855 return (FALSE); | |
856 | |
857 if (event->keyval == GDK_KP_Enter || event->keyval == GDK_Return) | |
858 { | |
859 #if GTK_MAJOR_VERSION == 1 | |
860 ok_dialog_response (widget, data); | |
861 #else | |
862 dialog_response (widget, GTK_RESPONSE_YES, data); | |
863 #endif | |
864 return (TRUE); | |
865 } | |
866 else if (event->keyval == GDK_Escape) | |
867 { | |
868 #if GTK_MAJOR_VERSION == 1 | |
869 cancel_dialog_response (widget, data); | |
870 #else | |
871 dialog_response (widget, GTK_RESPONSE_NO, data); | |
872 #endif | |
873 return (TRUE); | |
874 } | |
875 | |
876 return (FALSE); | |
877 } | |
878 | |
879 | |
1 | 880 void |
19 | 881 MakeEditDialog (char *diagtxt, char *infotxt, char *deftext, int passwd_item, |
882 char *checktext, | |
883 gftp_dialog_button okbutton, void (*okfunc) (), void *okptr, | |
884 void (*cancelfunc) (), void *cancelptr) | |
1 | 885 { |
19 | 886 GtkWidget * tempwid, * dialog; |
887 gftp_dialog_data * ddata; | |
888 const gchar * yes_text; | |
889 | |
890 ddata = g_malloc (sizeof (*ddata)); | |
891 ddata->yesfunc = okfunc; | |
892 ddata->yespointer = okptr; | |
893 ddata->nofunc = cancelfunc; | |
894 ddata->nopointer = cancelptr; | |
1 | 895 |
45 | 896 #if GTK_MAJOR_VERSION == 1 |
19 | 897 dialog = gtk_dialog_new (); |
898 gtk_window_set_title (GTK_WINDOW (dialog), diagtxt); | |
899 gtk_grab_add (dialog); | |
1 | 900 gtk_container_border_width (GTK_CONTAINER |
19 | 901 (GTK_DIALOG (dialog)->action_area), 5); |
902 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15); | |
903 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
904 #else | |
905 switch (okbutton) | |
906 { | |
341 | 907 case gftp_dialog_button_ok: |
908 yes_text = GTK_STOCK_OK; | |
909 break; | |
19 | 910 case gftp_dialog_button_create: |
911 yes_text = GTK_STOCK_ADD; | |
912 break; | |
913 case gftp_dialog_button_change: | |
914 yes_text = _("Change"); | |
915 break; | |
916 case gftp_dialog_button_connect: | |
917 yes_text = _("Connect"); | |
918 break; | |
919 case gftp_dialog_button_rename: | |
920 yes_text = _("Rename"); | |
921 break; | |
922 default: | |
923 yes_text = GTK_STOCK_MISSING_IMAGE; | |
924 break; | |
925 } | |
1 | 926 |
19 | 927 dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0, |
928 yes_text, | |
929 GTK_RESPONSE_YES, | |
930 GTK_STOCK_CANCEL, | |
931 GTK_RESPONSE_NO, | |
932 NULL); | |
933 #endif | |
934 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
935 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
936 gtk_window_set_wmclass (GTK_WINDOW(dialog), "edit", "gFTP"); | |
937 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
938 gtk_widget_realize (dialog); | |
1 | 939 |
19 | 940 if (gftp_icon != NULL) |
941 { | |
942 gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap, | |
943 gftp_icon->bitmap); | |
168 | 944 gdk_window_set_icon_name (dialog->window, gftp_version); |
19 | 945 } |
946 | |
947 ddata->dialog = dialog; | |
948 | |
1 | 949 tempwid = gtk_label_new (infotxt); |
19 | 950 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, TRUE, |
1 | 951 TRUE, 0); |
952 gtk_widget_show (tempwid); | |
953 | |
19 | 954 ddata->edit = gtk_entry_new (); |
72 | 955 gtk_signal_connect (GTK_OBJECT (ddata->edit), "key_press_event", |
956 GTK_SIGNAL_FUNC (dialog_keypress), (gpointer) ddata); | |
957 | |
19 | 958 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), ddata->edit, TRUE, |
1 | 959 TRUE, 0); |
19 | 960 gtk_widget_grab_focus (ddata->edit); |
961 gtk_entry_set_visibility (GTK_ENTRY (ddata->edit), passwd_item); | |
1 | 962 |
963 if (deftext != NULL) | |
964 { | |
19 | 965 gtk_entry_set_text (GTK_ENTRY (ddata->edit), deftext); |
966 gtk_entry_select_region (GTK_ENTRY (ddata->edit), 0, strlen (deftext)); | |
1 | 967 } |
19 | 968 gtk_widget_show (ddata->edit); |
1 | 969 |
19 | 970 if (checktext != NULL) |
1 | 971 { |
19 | 972 ddata->checkbox = gtk_check_button_new_with_label (checktext); |
973 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), | |
974 ddata->checkbox, TRUE, TRUE, 0); | |
975 gtk_widget_show (ddata->checkbox); | |
1 | 976 } |
977 | |
45 | 978 #if GTK_MAJOR_VERSION == 1 |
21 | 979 switch (okbutton) |
980 { | |
341 | 981 case gftp_dialog_button_ok: |
401 | 982 yes_text = _("OK"); |
341 | 983 break; |
21 | 984 case gftp_dialog_button_create: |
985 yes_text = _("Add"); | |
986 break; | |
987 case gftp_dialog_button_change: | |
988 yes_text = _("Change"); | |
989 break; | |
990 case gftp_dialog_button_connect: | |
991 yes_text = _("Connect"); | |
992 break; | |
993 case gftp_dialog_button_rename: | |
994 yes_text = _("Rename"); | |
995 break; | |
996 default: | |
997 yes_text = ""; | |
998 break; | |
999 } | |
1000 | |
1001 tempwid = gtk_button_new_with_label (yes_text); | |
1 | 1002 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); |
19 | 1003 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, |
1 | 1004 TRUE, TRUE, 0); |
21 | 1005 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
1006 GTK_SIGNAL_FUNC (ok_dialog_response), | |
1007 ddata); | |
1 | 1008 gtk_widget_grab_default (tempwid); |
1009 gtk_widget_show (tempwid); | |
1010 | |
21 | 1011 tempwid = gtk_button_new_with_label (_("Cancel")); |
1 | 1012 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); |
19 | 1013 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, |
1 | 1014 TRUE, TRUE, 0); |
21 | 1015 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
1016 GTK_SIGNAL_FUNC (cancel_dialog_response), | |
1017 ddata); | |
1 | 1018 gtk_widget_show (tempwid); |
19 | 1019 #else |
1020 g_signal_connect (GTK_OBJECT (dialog), "response", | |
1021 G_CALLBACK (dialog_response), ddata); | |
1022 #endif | |
1 | 1023 |
19 | 1024 gtk_widget_show (dialog); |
1 | 1025 } |
1026 | |
1027 | |
1028 void | |
19 | 1029 MakeYesNoDialog (char *diagtxt, char *infotxt, |
1030 void (*yesfunc) (), gpointer yespointer, | |
1031 void (*nofunc) (), gpointer nopointer) | |
1 | 1032 { |
19 | 1033 GtkWidget * text, * dialog; |
1034 gftp_dialog_data * ddata; | |
45 | 1035 #if GTK_MAJOR_VERSION == 1 |
21 | 1036 GtkWidget * tempwid; |
19 | 1037 #endif |
1 | 1038 |
21 | 1039 ddata = g_malloc (sizeof (*ddata)); |
1040 ddata->yesfunc = yesfunc; | |
1041 ddata->yespointer = yespointer; | |
1042 ddata->nofunc = nofunc; | |
1043 ddata->nopointer = nopointer; | |
1044 | |
45 | 1045 #if GTK_MAJOR_VERSION == 1 |
1 | 1046 dialog = gtk_dialog_new (); |
1047 gtk_grab_add (dialog); | |
1048 gtk_window_set_title (GTK_WINDOW (dialog), diagtxt); | |
1049 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), | |
1050 5); | |
1051 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15); | |
1052 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
19 | 1053 #else |
1054 dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0, | |
1055 GTK_STOCK_YES, | |
1056 GTK_RESPONSE_YES, | |
1057 GTK_STOCK_NO, | |
1058 GTK_RESPONSE_NO, | |
1059 NULL); | |
1060 #endif | |
1061 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
1062 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
1 | 1063 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); |
19 | 1064 gtk_window_set_wmclass (GTK_WINDOW(dialog), "yndiag", "gFTP"); |
1065 gtk_widget_realize (dialog); | |
1066 | |
1067 if (gftp_icon != NULL) | |
1068 { | |
1069 gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap, | |
1070 gftp_icon->bitmap); | |
168 | 1071 gdk_window_set_icon_name (dialog->window, gftp_version); |
19 | 1072 } |
1 | 1073 |
21 | 1074 ddata->dialog = dialog; |
1075 | |
1 | 1076 text = gtk_label_new (infotxt); |
1077 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), text, TRUE, TRUE, 0); | |
1078 gtk_widget_show (text); | |
1079 | |
45 | 1080 #if GTK_MAJOR_VERSION == 1 |
19 | 1081 tempwid = gtk_button_new_with_label (_(" Yes ")); |
1082 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
1083 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
1084 FALSE, FALSE, 0); | |
21 | 1085 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
72 | 1086 GTK_SIGNAL_FUNC (ok_dialog_response), ddata); |
1087 | |
19 | 1088 gtk_widget_grab_default (tempwid); |
1089 gtk_widget_show (tempwid); | |
1 | 1090 |
19 | 1091 tempwid = gtk_button_new_with_label (_(" No ")); |
1092 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
1093 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
1094 FALSE, FALSE, 0); | |
21 | 1095 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", |
72 | 1096 GTK_SIGNAL_FUNC (cancel_dialog_response), ddata); |
19 | 1097 gtk_widget_show (tempwid); |
1098 | |
1099 #else | |
1100 g_signal_connect (GTK_OBJECT (dialog), "response", | |
1101 G_CALLBACK (dialog_response), ddata); | |
1102 #endif | |
1 | 1103 |
1104 gtk_widget_show (dialog); | |
1105 } | |
1106 | |
1107 | |
48 | 1108 static gint |
1109 delete_event (GtkWidget * widget, GdkEvent * event, gpointer data) | |
1110 { | |
1111 return (TRUE); | |
1112 } | |
1113 | |
1114 | |
1115 static void | |
1116 trans_stop_button (GtkWidget * widget, gpointer data) | |
1117 { | |
1118 gftp_transfer * transfer; | |
1119 | |
1120 transfer = data; | |
1121 pthread_kill (((gftp_window_data *) transfer->fromwdata)->tid, SIGINT); | |
1122 } | |
1123 | |
1124 | |
1 | 1125 void |
1126 update_directory_download_progress (gftp_transfer * transfer) | |
1127 { | |
1128 static GtkWidget * dialog = NULL, * textwid, * stopwid; | |
1129 char tempstr[255]; | |
1130 GtkWidget * vbox; | |
1131 | |
1132 if (transfer->numfiles < 0 || transfer->numdirs < 0) | |
1133 { | |
1134 if (dialog != NULL) | |
1135 gtk_widget_destroy (dialog); | |
1136 dialog = NULL; | |
1137 return; | |
1138 } | |
1139 | |
1140 if (dialog == NULL) | |
1141 { | |
303 | 1142 dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
424 | 1143 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); |
303 | 1144 #if GTK_MAJOR_VERSION > 1 |
1145 gtk_window_set_decorated (GTK_WINDOW (dialog), 0); | |
1146 #endif | |
1 | 1147 gtk_grab_add (dialog); |
1148 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", | |
1149 GTK_SIGNAL_FUNC (delete_event), NULL); | |
1150 gtk_window_set_title (GTK_WINDOW (dialog), | |
1151 _("Getting directory listings")); | |
1152 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
1153 gtk_window_set_wmclass (GTK_WINDOW(dialog), "dirlist", "gFTP"); | |
1154 | |
1155 vbox = gtk_vbox_new (FALSE, 5); | |
1156 gtk_container_border_width (GTK_CONTAINER (vbox), 10); | |
1157 gtk_container_add (GTK_CONTAINER (dialog), vbox); | |
1158 gtk_widget_show (vbox); | |
1159 | |
1160 textwid = gtk_label_new (NULL); | |
1161 gtk_box_pack_start (GTK_BOX (vbox), textwid, TRUE, TRUE, 0); | |
1162 gtk_widget_show (textwid); | |
1163 | |
1164 statuswid = gtk_progress_bar_new (); | |
1165 gtk_progress_set_activity_mode (GTK_PROGRESS (statuswid), 1); | |
1166 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (statuswid), 3); | |
1167 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (statuswid), 5); | |
1168 gtk_box_pack_start (GTK_BOX (vbox), statuswid, TRUE, TRUE, 0); | |
1169 gtk_widget_show (statuswid); | |
1170 | |
1171 stopwid = gtk_button_new_with_label (_(" Stop ")); | |
1172 gtk_signal_connect (GTK_OBJECT (stopwid), "clicked", | |
1173 GTK_SIGNAL_FUNC (trans_stop_button), transfer); | |
1174 gtk_box_pack_start (GTK_BOX (vbox), stopwid, TRUE, TRUE, 0); | |
1175 gtk_widget_show (stopwid); | |
1176 | |
1177 gtk_widget_show (dialog); | |
1178 } | |
1179 | |
1180 g_snprintf (tempstr, sizeof (tempstr), | |
1181 _("Received %ld directories\nand %ld files"), | |
1182 transfer->numdirs, transfer->numfiles); | |
1183 gtk_label_set_text (GTK_LABEL (textwid), tempstr); | |
1184 } | |
1185 | |
1186 | |
1187 int | |
1188 progress_timeout (gpointer data) | |
1189 { | |
1190 gftp_transfer * tdata; | |
1191 double val; | |
1192 | |
1193 tdata = data; | |
1194 | |
1195 update_directory_download_progress (tdata); | |
1196 | |
1197 val = gtk_progress_get_value (GTK_PROGRESS (statuswid)); | |
1198 if (val >= 1.0) | |
517 | 1199 val = 0.0; |
1 | 1200 else |
1201 val += 0.10; | |
1202 gtk_progress_bar_update (GTK_PROGRESS_BAR (statuswid), val); | |
1203 | |
1204 return (1); | |
1205 } | |
1206 | |
1207 | |
1208 void | |
1209 display_cached_logs (void) | |
1210 { | |
1211 gftp_log * templog; | |
1212 GList * templist; | |
1213 | |
1214 pthread_mutex_lock (&log_mutex); | |
129 | 1215 templist = gftp_file_transfer_logs; |
1 | 1216 while (templist != NULL) |
1217 { | |
1218 templog = (gftp_log *) templist->data; | |
186 | 1219 ftp_log (templog->type, NULL, "%s", templog->msg); |
1 | 1220 g_free (templog->msg); |
1221 g_free (templog); | |
1222 templist->data = NULL; | |
1223 templist = templist->next; | |
1224 } | |
129 | 1225 g_list_free (gftp_file_transfer_logs); |
1226 gftp_file_transfer_logs = NULL; | |
1 | 1227 pthread_mutex_unlock (&log_mutex); |
1228 } | |
1229 | |
42 | 1230 |
201 | 1231 char * |
1232 get_xpm_path (char *filename, int quit_on_err) | |
1233 { | |
483 | 1234 char *tempstr, *exfile, *share_dir; |
201 | 1235 |
1236 tempstr = g_strconcat (BASE_CONF_DIR, "/", filename, NULL); | |
1237 exfile = expand_path (tempstr); | |
1238 g_free (tempstr); | |
1239 if (access (exfile, F_OK) != 0) | |
1240 { | |
1241 g_free (exfile); | |
483 | 1242 share_dir = gftp_get_share_dir (); |
1243 | |
1244 tempstr = g_strconcat (share_dir, "/", filename, NULL); | |
201 | 1245 exfile = expand_path (tempstr); |
1246 g_free (tempstr); | |
1247 if (access (exfile, F_OK) != 0) | |
1248 { | |
1249 g_free (exfile); | |
1250 exfile = g_strconcat ("/usr/share/icons/", filename, NULL); | |
1251 if (access (exfile, F_OK) != 0) | |
1252 { | |
1253 g_free (exfile); | |
1254 if (!quit_on_err) | |
1255 return (NULL); | |
1256 | |
1257 printf (_("gFTP Error: Cannot find file %s in %s or %s\n"), | |
483 | 1258 filename, share_dir, BASE_CONF_DIR); |
201 | 1259 exit (1); |
1260 } | |
1261 } | |
1262 } | |
1263 return (exfile); | |
1264 } | |
1265 |