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