Ticket #1649: Prepare for prerelease mc-4.7.0-pre3 (code cleanup)
[midnight-commander.git] / src / boxes.c
blob54ee2bc785034013cd0d441263bf298b2e2124d0
1 /* Some misc dialog boxes for the program.
3 Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2009 Free Software Foundation, Inc.
6 Authors: 1994, 1995 Miguel de Icaza
7 1995 Jakub Jelinek
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
23 /** \file boxes.c
24 * \brief Source: Some misc dialog boxes for the program
27 #include <config.h>
29 #include <ctype.h>
30 #include <signal.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
37 #include "global.h"
39 #include "../src/tty/tty.h"
40 #include "../src/skin/skin.h" /* INPUT_COLOR */
41 #include "../src/tty/key.h" /* XCTRL and ALT macros */
43 #include "../src/mcconfig/mcconfig.h" /* Load/save user formats */
45 #include "dialog.h" /* The nice dialog manager */
46 #include "widget.h" /* The widgets for the nice dialog manager */
47 #include "wtools.h"
48 #include "setup.h" /* For profile_name */
49 #include "command.h" /* For cmdline */
50 #include "dir.h"
51 #include "panel.h" /* LIST_TYPES */
52 #include "boxes.h"
53 #include "main.h" /* For the confirm_* variables */
54 #include "tree.h"
55 #include "layout.h" /* for get_nth_panel_name proto */
56 #include "background.h" /* task_list */
57 #include "strutil.h"
59 #ifdef HAVE_CHARSET
60 #include "charsets.h"
61 #include "selcodepage.h"
62 #endif
64 #ifdef USE_NETCODE
65 # include "../vfs/ftpfs.h"
66 #endif
68 #ifdef USE_VFS
69 #include "../vfs/gc.h"
70 #endif
73 static WRadio *display_radio;
74 static WInput *display_user_format;
75 static WInput *display_mini_status;
76 static WCheck *display_check_status;
77 static char **displays_status;
78 static int display_user_hotkey = 'u';
80 static cb_ret_t
81 display_callback (Dlg_head *h, dlg_msg_t msg, int parm)
83 switch (msg) {
84 case DLG_UNFOCUS:
85 if (dlg_widget_active (display_radio)) {
86 assign_text (display_mini_status, displays_status[display_radio->sel]);
87 input_set_point (display_mini_status, 0);
89 return MSG_HANDLED;
91 case DLG_KEY:
92 if (parm == '\n') {
93 if (dlg_widget_active (display_radio)) {
94 assign_text (display_mini_status, displays_status[display_radio->sel]);
95 dlg_stop (h);
96 return MSG_HANDLED;
99 if (dlg_widget_active (display_user_format)) {
100 h->ret_value = B_USER + 6;
101 dlg_stop (h);
102 return MSG_HANDLED;
105 if (dlg_widget_active (display_mini_status)) {
106 h->ret_value = B_USER + 7;
107 dlg_stop (h);
108 return MSG_HANDLED;
112 if (g_ascii_tolower (parm) == display_user_hotkey && dlg_widget_active (display_user_format)
113 && dlg_widget_active (display_mini_status)) {
114 display_radio->sel = 3;
115 dlg_select_widget (display_radio); /* force redraw */
116 dlg_select_widget (display_user_format);
117 return MSG_HANDLED;
119 return MSG_NOT_HANDLED;
121 default:
122 return default_dlg_callback (h, msg, parm);
126 static Dlg_head *
127 display_init (int radio_sel, char *init_text, int _check_status,
128 char **_status)
130 int dlg_width = 48, dlg_height = 15;
131 Dlg_head *dd;
133 /* Controls whether the array strings have been translated */
134 const char *displays [LIST_TYPES] =
136 N_("&Full file list"),
137 N_("&Brief file list"),
138 N_("&Long file list"),
139 N_("&User defined:")
142 /* Index in displays[] for "user defined" */
143 const int user_type_idx = 3;
145 const char *display_title = N_("Listing mode");
146 const char *user_mini_status = N_("user &Mini status");
147 const char *ok_name = N_("&OK");
148 const char *cancel_name = N_("&Cancel");
150 WButton *ok_button, *cancel_button;
153 int i, maxlen = 0;
154 const char *cp;
155 int ok_len, cancel_len;
157 #ifdef ENABLE_NLS
158 display_title = _(display_title);
159 user_mini_status = _(user_mini_status);
160 ok_name = _(ok_name);
161 cancel_name = _(cancel_name);
163 for (i = 0; i < LIST_TYPES; i++)
164 displays[i] = _(displays[i]);
165 #endif
167 /* get hotkey of user-defined format string */
168 cp = strchr (displays[user_type_idx], '&');
169 if (cp != NULL && *++cp != '\0')
170 display_user_hotkey = g_ascii_tolower (*cp);
172 /* xpos will be fixed later */
173 ok_button = button_new (dlg_height - 3, 0, B_ENTER, DEFPUSH_BUTTON, ok_name, 0);
174 ok_len = button_get_len (ok_button);
175 cancel_button = button_new (dlg_height - 3, 0, B_CANCEL, NORMAL_BUTTON, cancel_name, 0);
176 cancel_len = button_get_len (cancel_button);
178 dlg_width = max (dlg_width, str_term_width1 (display_title) + 10);
179 /* calculate max width of radiobutons */
180 for (i = 0; i < LIST_TYPES; i++)
181 maxlen = max (maxlen, str_term_width1 (displays[i]));
182 dlg_width = max (dlg_width, maxlen);
183 dlg_width = max (dlg_width, str_term_width1 (user_mini_status) + 13);
185 /* buttons */
186 dlg_width = max (dlg_width, ok_len + cancel_len + 8);
187 ok_button->widget.x = dlg_width/3 - ok_len/2;
188 cancel_button->widget.x = dlg_width * 2/3 - cancel_len/2;
191 displays_status = _status;
193 dd = create_dlg (0, 0, dlg_height, dlg_width, dialog_colors,
194 display_callback, "[Listing Mode...]", display_title,
195 DLG_CENTER | DLG_REVERSE);
197 add_widget (dd, cancel_button);
198 add_widget (dd, ok_button);
200 display_mini_status = input_new (10, 8, INPUT_COLOR, dlg_width - 12, _status[radio_sel],
201 "mini-input", INPUT_COMPLETE_DEFAULT);
202 add_widget (dd, display_mini_status);
203 input_set_point (display_mini_status, 0);
205 display_check_status = check_new (9, 4, _check_status, user_mini_status);
206 add_widget (dd, display_check_status);
208 display_user_format = input_new (7, 8, INPUT_COLOR, dlg_width - 12, init_text,
209 "user-fmt-input", INPUT_COMPLETE_DEFAULT);
210 add_widget (dd, display_user_format);
211 input_set_point (display_user_format, 0);
213 display_radio = radio_new (3, 4, LIST_TYPES, displays);
214 display_radio->sel = display_radio->pos = radio_sel;
215 add_widget (dd, display_radio);
217 return dd;
221 display_box (WPanel *panel, char **userp, char **minip, int *use_msformat, int num)
223 int result = -1;
224 Dlg_head *dd;
225 char *section = NULL;
226 int i;
228 if (panel == NULL) {
229 const char *p = get_nth_panel_name (num);
230 panel = g_new (WPanel, 1);
231 panel->list_type = list_full;
232 panel->user_format = g_strdup (DEFAULT_USER_FORMAT);
233 panel->user_mini_status = 0;
234 for (i = 0; i < LIST_TYPES; i++)
235 panel->user_status_format[i] = g_strdup (DEFAULT_USER_FORMAT);
236 section = g_strconcat ("Temporal:", p, (char *) NULL);
237 if (! mc_config_has_group (mc_main_config, section)) {
238 g_free (section);
239 section = g_strdup (p);
241 panel_load_setup (panel, section);
242 g_free (section);
245 dd = display_init (panel->list_type, panel->user_format,
246 panel->user_mini_status, panel->user_status_format);
248 if (run_dlg (dd) != B_CANCEL) {
249 result = display_radio->sel;
250 *userp = g_strdup (display_user_format->buffer);
251 *minip = g_strdup (display_mini_status->buffer);
252 *use_msformat = display_check_status->state & C_BOOL;
255 if (section != NULL) {
256 g_free (panel->user_format);
257 for (i = 0; i < LIST_TYPES; i++)
258 g_free (panel->user_status_format [i]);
259 g_free (panel);
262 destroy_dlg (dd);
264 return result;
267 sortfn *
268 sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first)
270 int dlg_width = 40, dlg_height = 15;
272 char *sort_orders_names [SORT_TYPES];
273 int sort_idx = 0;
275 sortfn *result = sort_fn;
278 int max_radio = 0, max_check = 0;
279 int ok_len, cancel_len;
280 int i;
282 QuickWidget quick_widgets[] =
284 /* 0 */
285 QUICK_BUTTON (0, dlg_width, dlg_height - 3, dlg_height, N_("&Cancel"), B_CANCEL, NULL),
286 /* 1 */
287 QUICK_BUTTON (0, dlg_width, dlg_height - 3, dlg_height, N_("&OK"), B_ENTER, NULL),
288 /* 2 */
289 QUICK_CHECKBOX (0, dlg_width, 5, dlg_height, N_("&Reverse"), reverse),
290 /* 3 */
291 QUICK_CHECKBOX (0, dlg_width, 4, dlg_height, N_("Case sensi&tive"), case_sensitive),
292 /* 4 */
293 QUICK_CHECKBOX (0, dlg_width, 3, dlg_height, N_("Executable &first"), exec_first),
294 /* 5 */
295 QUICK_RADIO (4, dlg_width, 3, dlg_height, SORT_TYPES,
296 (const char **) sort_orders_names, &sort_idx),
297 QUICK_END
300 QuickDialog quick_dlg =
302 dlg_width, dlg_height, -1, -1,
303 N_("Sort order"), "[Sort Order...]",
304 quick_widgets, TRUE
307 for (i = 0; i < SORT_TYPES; i++)
308 if ((sortfn *) (sort_orders[i].sort_fn) == sort_fn) {
309 sort_idx = i;
310 break;
313 #ifdef ENABLE_NLS
314 quick_dlg.title = _(quick_dlg.title);
315 /* buttons */
316 for (i = 0; i < 2; i++)
317 quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
318 /* checkboxes */
319 for (i = 2; i < 5; i++)
320 quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
321 /* radiobuttons */
322 for (i = 0; i < SORT_TYPES; i++)
323 sort_orders_names[i] = _(sort_orders[i].sort_name);
324 #else
325 /* radiobuttons */
326 for (i = 0; i < SORT_TYPES; i++)
327 sort_orders_names[i] = sort_orders[i].sort_name;
328 #endif /* ENABLE_NlS */
330 /* buttons */
331 cancel_len = str_term_width1 (quick_widgets[0].u.button.text) + 4;
332 ok_len = str_term_width1 (quick_widgets[1].u.button.text) + 6;
333 /* checkboxes */
334 for (i = 2; i < 5; i++)
335 max_check = max (max_check, str_term_width1 (quick_widgets[i].u.checkbox.text) + 4);
336 /* radiobuttons */
337 for (i = 0; i < SORT_TYPES; i++)
338 max_radio = max (max_radio, str_term_width1 (sort_orders_names[i]) + 4);
340 /* dialog width */
341 dlg_width = max (dlg_width, str_term_width1 (quick_dlg.title) + 8);
342 dlg_width = max (dlg_width, ok_len + cancel_len + 8);
343 dlg_width = max (dlg_width, 2 * max (max_radio, max_check) + 8);
345 /* fix widget and dialog parameters */
346 /* dialog */
347 quick_dlg.xlen = dlg_width;
348 /* widgets */
349 for (i = 0; (size_t) i < sizeof (quick_widgets)/sizeof (quick_widgets[0]) - 1; i++)
350 quick_widgets[i].x_divisions = dlg_width;
351 /* buttons */
352 quick_widgets[0].relative_x = dlg_width * 2/3 - cancel_len/2;
353 quick_widgets[1].relative_x = dlg_width/3 - ok_len/2;
354 /* checkboxes */
355 for (i = 2; i < 5; i++)
356 quick_widgets[i].relative_x = dlg_width/2 + 2;
358 if (quick_dialog (&quick_dlg) != B_CANCEL)
359 result = (sortfn *) sort_orders[sort_idx].sort_fn;
362 return result;
366 void
367 confirm_box (void)
369 const int w_num = 7;
371 /* dialog sizes */
372 int dlg_width = 46;
373 int dlg_height = 12;
375 const char *title = _(" Confirmation ");
377 QuickWidget conf_widgets [] =
379 /* 0 */ QUICK_BUTTON (29, dlg_width, 9, dlg_height, N_("&Cancel"), B_CANCEL, NULL),
380 /* 1 */ QUICK_BUTTON (12, dlg_width, 9, dlg_height, N_("&OK"), B_ENTER, NULL),
381 /* 2 */ QUICK_CHECKBOX (3, dlg_width, 7, dlg_height, N_(" confirm di&Rectory hotlist delete "), &confirm_directory_hotlist_delete),
382 /* 3 */ QUICK_CHECKBOX (3, dlg_width, 6, dlg_height, N_(" confirm &Exit "), &confirm_exit),
383 /* 4 */ QUICK_CHECKBOX (3, dlg_width, 5, dlg_height, N_(" confirm e&Xecute "), &confirm_execute),
384 /* 5 */ QUICK_CHECKBOX (3, dlg_width, 4, dlg_height, N_(" confirm o&Verwrite "), &confirm_overwrite),
385 /* 6 */ QUICK_CHECKBOX (3, dlg_width, 3, dlg_height, N_(" confirm &Delete "), &confirm_delete),
386 QUICK_END
389 int i;
390 int maxlen = 0;
391 int cancel_len, ok_len, blen;
393 #ifdef ENABLE_NLS
394 title = _(title);
396 for (i = 0; i < 2; i++)
397 conf_widgets [i].u.button.text = _(conf_widgets [i].u.button.text);
399 for (i = 2; i < w_num; i++)
400 conf_widgets [i].u.checkbox.text = _(conf_widgets [i].u.checkbox.text);
401 #endif /* ENABLE_NLS */
403 /* maximumr length of checkboxes */
404 for (i = 2; i < w_num; i++)
405 maxlen = max (maxlen, str_term_width1 (conf_widgets [i].u.checkbox.text) + 3);
407 /* length of buttons */
408 cancel_len = str_term_width1 (conf_widgets [0].u.button.text) + 2;
409 ok_len = str_term_width1 (conf_widgets [0].u.button.text) + 4; /* default button */
411 blen = cancel_len + ok_len + 2;
413 dlg_width = max (maxlen, blen) + 6;
414 dlg_width = max (dlg_width, str_term_width1 (title) + 4);
416 /* correct widget parameters */
417 for (i = 0; i < w_num; i++)
418 conf_widgets[i].x_divisions = dlg_width;
420 conf_widgets[0].relative_x = dlg_width * 2/3 - cancel_len/2;
421 conf_widgets[1].relative_x = dlg_width/3 - ok_len/2;
424 QuickDialog confirmation =
426 dlg_width, dlg_height, -1, -1, title,
427 "[Confirmation]", conf_widgets, 1
430 (void) quick_dialog (&confirmation);
435 #ifndef HAVE_CHARSET
436 void
437 display_bits_box (void) /* AB:FIXME: test dialog */
439 /* dialog sizes */
440 const int DISPY = 13;
441 const int DISPX = 46;
443 int new_meta = 0;
444 int current_mode;
446 const char *display_bits_str [] =
448 N_("UTF-8 output"),
449 N_("Full 8 bits output"),
450 N_("ISO 8859-1"),
451 N_("7 bits")
454 QuickWidget display_widgets[] =
456 /* 0 */ QUICK_BUTTON (15, DISPX, DISPY - 3, DISPY, N_("&Cancel"), B_CANCEL, NULL),
457 /* 1 */ QUICK_BUTTON (29, DISPX, DISPY - 3, DISPY, N_("&OK"), B_ENTER, NULL),
458 /* 2 */ QUICK_CHECKBOX (3, DISPX, 8, DISPY, N_("F&ull 8 bits input"), &new_meta),
459 /* 3 */ QUICK_RADIO (3, DISPX, 3, DISPY, 4, display_bits_str, &current_mode),
460 QUICK_END
463 QuickDialog display_bits =
465 DISPX, DISPY, -1, -1, _(" Display bits "),
466 "[Display bits]", display_widgets, TRUE
469 int i;
470 int l1, maxlen = 0;
471 int ok_len, cancel_len;
473 #ifdef ENABLE_NLS
474 static gboolean i18n_flag = FALSE;
476 if (!i18n_flag) {
477 for (i = 0; i < 3; i++) {
478 display_bits_str[i] = _(display_bits_str [i]);
481 display_widgets[0].u.button.text = _(display_widgets[0].u.button.text);
482 display_widgets[1].u.button.text = _(display_widgets[1].u.button.text);
483 display_widgets[2].u.checkbox.text = _(display_widgets[2].u.checkbox.text);
485 i18n_flag = TRUE;
487 #endif /* ENABLE_NLS */
489 /* radiobuttons */
490 for (i = 0; i < 3; i++)
491 maxlen = max (maxlen, str_term_width1 (display_bits_str [i]));
493 /* buttons */
494 cancel_len = str_term_width1 (display_widgets [0].u.button.text) + 2;
495 ok_len = str_term_width1 (display_widgets [1].u.button.text) + 4; /* default button */
497 l1 = max (cancel_len, ok_len);
499 display_bits.xlen = max (maxlen, l1) + 20;
501 for (i = 0; i < 4; i++)
502 display_widgets[i].x_divisions = display_bits.xlen;
504 display_widgets[0].relative_x = display_bits.xlen * 2/3 - cancel_len/2;
505 display_widgets[1].relative_x = display_bits.xlen/3 - ok_len/2;
507 if (full_eight_bits)
508 current_mode = 0;
509 else if (eight_bit_clean)
510 current_mode = 1;
511 else
512 current_mode = 2;
514 new_meta = !use_8th_bit_as_meta;
516 if (quick_dialog (&display_bits) != B_CANCEL) {
517 eight_bit_clean = current_mode < 3;
518 full_eight_bits = current_mode < 2;
519 #ifndef HAVE_SLANG
520 meta (stdscr, eight_bit_clean);
521 #else
522 SLsmg_Display_Eight_Bit = full_eight_bits ? 128 : 160;
523 #endif
524 use_8th_bit_as_meta = !new_meta;
528 #else /* HAVE_CHARSET */
530 static int new_display_codepage;
532 static WLabel *cplabel;
533 static WCheck *inpcheck;
535 static int
536 sel_charset_button (int action)
538 int new_dcp;
540 (void) action;
542 new_dcp = select_charset (0, 0, new_display_codepage, TRUE);
544 if (new_dcp != SELECT_CHARSET_CANCEL) {
545 const char *cpname;
546 char buf[BUF_TINY];
548 new_display_codepage = new_dcp;
549 cpname = (new_display_codepage == SELECT_CHARSET_OTHER_8BIT) ?
550 _("Other 8 bit") : codepages[new_display_codepage].name;
551 if (cpname != NULL)
552 utf8_display = str_isutf8 (cpname);
553 /* avoid strange bug with label repainting */
554 g_snprintf (buf, sizeof (buf), "%-27s", cpname);
555 label_set_text (cplabel, buf);
558 return 0;
561 static Dlg_head *
562 init_disp_bits_box (void)
564 /* dialog sizes */
565 const int DISPY = 11;
566 const int DISPX = 46;
568 const char *cpname;
569 Dlg_head *dbits_dlg;
571 do_refresh ();
573 dbits_dlg =
574 create_dlg (0, 0, DISPY, DISPX, dialog_colors, NULL,
575 "[Display bits]", _(" Display bits "), DLG_CENTER | DLG_REVERSE);
577 add_widget (dbits_dlg,
578 label_new (3, 4, _("Input / display codepage:")));
580 cpname = (new_display_codepage < 0)
581 ? _("Other 8 bit")
582 : codepages[new_display_codepage].name;
583 cplabel = label_new (4, 4, cpname);
584 add_widget (dbits_dlg, cplabel);
586 add_widget (dbits_dlg,
587 button_new (DISPY - 3, DISPX / 2 + 3, B_CANCEL,
588 NORMAL_BUTTON, _("&Cancel"), 0));
589 add_widget (dbits_dlg,
590 button_new (DISPY - 3, 7, B_ENTER, NORMAL_BUTTON, _("&OK"),
591 0));
593 inpcheck =
594 check_new (6, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input"));
595 add_widget (dbits_dlg, inpcheck);
597 cpname = _("&Select");
598 add_widget (dbits_dlg,
599 button_new (4, DISPX - 7 - str_term_width1 (cpname), B_USER,
600 NORMAL_BUTTON, cpname, sel_charset_button));
602 return dbits_dlg;
605 void
606 display_bits_box (void)
608 Dlg_head *dbits_dlg;
609 new_display_codepage = display_codepage;
611 application_keypad_mode ();
612 dbits_dlg = init_disp_bits_box ();
614 run_dlg (dbits_dlg);
616 if (dbits_dlg->ret_value == B_ENTER) {
617 const char *errmsg;
618 display_codepage = new_display_codepage;
619 errmsg =
620 init_translation_table (source_codepage, display_codepage);
621 if (errmsg)
622 message (D_ERROR, MSG_ERROR, "%s", errmsg);
623 #ifdef HAVE_SLANG
624 tty_display_8bit (display_codepage != 0 && display_codepage != 1);
625 #else
626 tty_display_8bit (display_codepage != 0);
627 #endif
628 use_8th_bit_as_meta = !(inpcheck->state & C_BOOL);
630 destroy_dlg (dbits_dlg);
631 repaint_screen ();
634 #endif /* HAVE_CHARSET */
637 #define TREE_Y 20
638 #define TREE_X 60
640 static cb_ret_t
641 tree_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
643 switch (msg) {
645 case DLG_POST_KEY:
646 /* The enter key will be processed by the tree widget */
647 if (parm == '\n') {
648 h->ret_value = B_ENTER;
649 dlg_stop (h);
651 return MSG_HANDLED;
653 default:
654 return default_dlg_callback (h, msg, parm);
658 /* Show tree in a box, not on a panel */
659 char *
660 tree_box (const char *current_dir)
662 WTree *mytree;
663 Dlg_head *dlg;
664 char *val = NULL;
665 WButtonBar *bar;
667 (void) current_dir;
668 /* Create the components */
669 dlg = create_dlg (0, 0, TREE_Y, TREE_X, dialog_colors,
670 tree_callback, "[Directory Tree]", NULL, DLG_CENTER | DLG_REVERSE);
671 mytree = tree_new (0, 2, 2, TREE_Y - 6, TREE_X - 5);
672 add_widget (dlg, mytree);
673 bar = buttonbar_new(1);
674 add_widget (dlg, bar);
675 ((Widget *) bar)->x = 0;
676 ((Widget *) bar)->y = LINES - 1;
678 if (run_dlg (dlg) == B_ENTER)
679 val = g_strdup (tree_selected_name (mytree));
681 destroy_dlg (dlg);
682 return val;
685 #ifdef USE_VFS
687 static char *ret_timeout;
689 #ifdef USE_NETCODE
690 static char *ret_passwd;
691 static char *ret_directory_timeout;
692 static char *ret_ftp_proxy;
693 #endif
695 void
696 configure_vfs (void)
698 #define VFSX 56
700 #ifdef USE_NETCODE
701 #define VFSY 17
702 #else
703 #define VFSY 8
704 #endif
706 char buffer2 [BUF_TINY];
707 #ifdef USE_NETCODE
708 char buffer3 [BUF_TINY];
709 #endif
711 QuickWidget confvfs_widgets [] =
713 /* 0 */ QUICK_BUTTON (30, VFSX, VFSY - 3, VFSY, N_("&Cancel"), B_CANCEL, NULL),
714 /* 1 */ QUICK_BUTTON (12, VFSX, VFSY - 3, VFSY, N_("&OK"), B_ENTER, NULL),
715 #ifdef USE_NETCODE
716 /* 2 */ QUICK_CHECKBOX (4, VFSX, 12, VFSY, N_("Use passive mode over pro&xy"), &ftpfs_use_passive_connections_over_proxy),
717 /* 3 */ QUICK_CHECKBOX (4, VFSX, 11, VFSY, N_("Use &passive mode"), &ftpfs_use_passive_connections),
718 /* 4 */ QUICK_CHECKBOX (4, VFSX, 10, VFSY, N_("&Use ~/.netrc"), &use_netrc),
719 /* 5 */ QUICK_INPUT (4, VFSX, 9, VFSY, ftpfs_proxy_host, 48, 0, "input-ftp-proxy", &ret_ftp_proxy),
720 /* 6 */ QUICK_CHECKBOX (4, VFSX, 8, VFSY, N_("&Always use ftp proxy"), &ftpfs_always_use_proxy),
721 /* 7 */ QUICK_LABEL (49, VFSX, 7, VFSY, N_("sec")),
722 /* 8 */ QUICK_INPUT (38, VFSX, 7, VFSY, buffer3, 10, 0, "input-timeout", &ret_directory_timeout),
723 /* 9 */ QUICK_LABEL (4, VFSX, 7, VFSY, N_("ftpfs directory cache timeout:")),
724 /* 10 */ QUICK_INPUT (4, VFSX, 6, VFSY, ftpfs_anonymous_passwd, 48, 0, "input-passwd", &ret_passwd),
725 /* 11 */ QUICK_LABEL (4, VFSX, 5, VFSY, N_("ftp anonymous password:")),
726 #endif
727 /* 12 */ QUICK_LABEL (49, VFSX, 3, VFSY, N_("sec")),
728 /* 13 */ QUICK_INPUT (38, VFSX, 3, VFSY, buffer2, 10, 0, "input-timo-vfs", &ret_timeout),
729 /* 14 */ QUICK_LABEL (4, VFSX, 3, VFSY, N_("Timeout for freeing VFSs:")),
730 QUICK_END
733 QuickDialog confvfs_dlg =
735 VFSX, VFSY, -1, -1, N_(" Virtual File System Setting "),
736 "[Virtual FS]", confvfs_widgets, FALSE
739 #ifdef SE_NETCODE
740 g_snprintf (buffer3, sizeof (buffer3), "%i", ftpfs_directory_timeout);
741 #endif
742 g_snprintf (buffer2, sizeof (buffer2), "%i", vfs_timeout);
744 if (quick_dialog (&confvfs_dlg) != B_CANCEL) {
745 vfs_timeout = atoi (ret_timeout);
746 g_free (ret_timeout);
748 if (vfs_timeout < 0 || vfs_timeout > 10000)
749 vfs_timeout = 10;
750 #ifdef USE_NETCODE
751 g_free (ftpfs_anonymous_passwd);
752 ftpfs_anonymous_passwd = ret_passwd;
753 g_free (ftpfs_proxy_host);
754 ftpfs_proxy_host = ret_ftp_proxy;
755 ftpfs_directory_timeout = atoi(ret_directory_timeout);
756 g_free (ret_directory_timeout);
757 #endif
760 #undef VFSX
761 #undef VFSY
764 #endif /* USE_VFS */
766 char *
767 cd_dialog (void)
769 const char *label = N_("cd");
770 const int ylen = 5;
771 const int xlen = 57;
773 int len;
775 #ifdef ENABLE_NLS
776 label = _(label);
777 #endif
779 len = str_term_width1 (label);
782 char *my_str;
784 QuickWidget quick_widgets [] =
786 /* 0 */ QUICK_INPUT (4 + len, xlen, 2, ylen, "", xlen - 7 - len, 2, "input" , &my_str),
787 /* 1 */ QUICK_LABEL (3, xlen, 2, ylen, label),
788 QUICK_END
791 QuickDialog Quick_input =
793 xlen, ylen, 2, LINES - 2 - ylen, _("Quick cd"),
794 "[Quick cd]", quick_widgets, TRUE
797 return (quick_dialog (&Quick_input) != B_CANCEL) ? my_str : NULL;
801 void
802 symlink_dialog (const char *existing, const char *new, char **ret_existing,
803 char **ret_new)
805 QuickWidget quick_widgets[] =
807 /* 0 */ QUICK_BUTTON (50, 80, 6, 8, N_("&Cancel"), B_CANCEL, NULL),
808 /* 1 */ QUICK_BUTTON (16, 80, 6, 8, N_("&OK"), B_ENTER, NULL),
809 /* 2 */ QUICK_INPUT (4, 80, 5, 8, new, 58, 0, "input-1", ret_new),
810 /* 3 */ QUICK_LABEL (4, 80, 4, 8, N_("Symbolic link filename:")),
811 /* 4 */ QUICK_INPUT (4, 80, 3, 8, existing, 58, 0, "input-2", ret_existing),
812 /* 5 */ QUICK_LABEL (4, 80, 2, 8, N_("Existing filename (filename symlink will point to):")),
813 QUICK_END
816 QuickDialog Quick_input =
818 64, 12, -1, -1, N_("Symbolic link"),
819 "[File Menu]", quick_widgets, FALSE
822 if (quick_dialog (&Quick_input) == B_CANCEL) {
823 *ret_new = NULL;
824 *ret_existing = NULL;
828 #ifdef WITH_BACKGROUND
829 #define B_STOP (B_USER+1)
830 #define B_RESUME (B_USER+2)
831 #define B_KILL (B_USER+3)
833 static int JOBS_X = 60;
834 #define JOBS_Y 15
835 static WListbox *bg_list;
836 static Dlg_head *jobs_dlg;
838 static void
839 jobs_fill_listbox (void)
841 static const char *state_str [2];
842 TaskList *tl = task_list;
844 if (!state_str [0]){
845 state_str [0] = _("Running ");
846 state_str [1] = _("Stopped");
849 while (tl){
850 char *s;
852 s = g_strconcat (state_str [tl->state], " ", tl->info, (char *) NULL);
853 listbox_add_item (bg_list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl);
854 g_free (s);
855 tl = tl->next;
859 static int
860 task_cb (int action)
862 TaskList *tl;
863 int sig = 0;
865 if (!bg_list->list)
866 return 0;
868 /* Get this instance information */
869 tl = (TaskList *) bg_list->current->data;
871 # ifdef SIGTSTP
872 if (action == B_STOP){
873 sig = SIGSTOP;
874 tl->state = Task_Stopped;
875 } else if (action == B_RESUME){
876 sig = SIGCONT;
877 tl->state = Task_Running;
878 } else
879 # endif
880 if (action == B_KILL){
881 sig = SIGKILL;
884 if (sig == SIGINT)
885 unregister_task_running (tl->pid, tl->fd);
887 kill (tl->pid, sig);
888 listbox_remove_list (bg_list);
889 jobs_fill_listbox ();
891 /* This can be optimized to just redraw this widget :-) */
892 dlg_redraw (jobs_dlg);
894 return 0;
897 static struct
899 const char* name;
900 int xpos;
901 int value;
902 int (*callback)(int);
904 job_buttons [] =
906 {N_("&Stop"), 3, B_STOP, task_cb},
907 {N_("&Resume"), 12, B_RESUME, task_cb},
908 {N_("&Kill"), 23, B_KILL, task_cb},
909 {N_("&OK"), 35, B_CANCEL, NULL }
912 void
913 jobs_cmd (void)
915 register int i;
916 int n_buttons = sizeof (job_buttons) / sizeof (job_buttons[0]);
918 #ifdef ENABLE_NLS
919 static int i18n_flag = 0;
920 if (!i18n_flag)
922 int startx = job_buttons [0].xpos;
923 int len;
925 for (i = 0; i < n_buttons; i++)
927 job_buttons [i].name = _(job_buttons [i].name);
929 len = str_term_width1 (job_buttons [i].name) + 4;
930 JOBS_X = max (JOBS_X, startx + len + 3);
932 job_buttons [i].xpos = startx;
933 startx += len;
936 /* Last button - Ok a.k.a. Cancel :) */
937 job_buttons [n_buttons - 1].xpos =
938 JOBS_X - str_term_width1 (job_buttons [n_buttons - 1].name) - 7;
940 i18n_flag = 1;
942 #endif /* ENABLE_NLS */
944 jobs_dlg = create_dlg (0, 0, JOBS_Y, JOBS_X, dialog_colors, NULL,
945 "[Background jobs]", _("Background Jobs"),
946 DLG_CENTER | DLG_REVERSE);
948 bg_list = listbox_new (2, 3, JOBS_Y - 9, JOBS_X - 7, NULL);
949 add_widget (jobs_dlg, bg_list);
951 i = n_buttons;
952 while (i--)
954 add_widget (jobs_dlg, button_new (JOBS_Y-4,
955 job_buttons [i].xpos, job_buttons [i].value,
956 NORMAL_BUTTON, job_buttons [i].name,
957 job_buttons [i].callback));
960 /* Insert all of task information in the list */
961 jobs_fill_listbox ();
962 run_dlg (jobs_dlg);
964 destroy_dlg (jobs_dlg);
966 #endif /* WITH_BACKGROUND */
968 #ifdef WITH_SMBFS
969 struct smb_authinfo *
970 vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
971 const char *user)
973 static int dialog_x = 44;
974 enum { b0 = 3, dialog_y = 12};
975 struct smb_authinfo *return_value;
976 static const char* labs[] = {N_("Domain:"), N_("Username:"), N_("Password:")};
977 static const char* buts[] = {N_("&OK"), N_("&Cancel")};
978 static int ilen = 30, istart = 14;
979 static int b2 = 30;
980 char *title;
981 WInput *in_password;
982 WInput *in_user;
983 WInput *in_domain;
984 Dlg_head *auth_dlg;
986 #ifdef ENABLE_NLS
987 static int i18n_flag = 0;
989 if (!i18n_flag)
991 register int i = sizeof(labs)/sizeof(labs[0]);
992 int l1, maxlen = 0;
994 while (i--)
996 l1 = str_term_width1 (labs [i] = _(labs [i]));
997 if (l1 > maxlen)
998 maxlen = l1;
1000 i = maxlen + ilen + 7;
1001 if (i > dialog_x)
1002 dialog_x = i;
1004 for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; )
1006 l1 += str_term_width1 (buts [i] = _(buts [i]));
1008 l1 += 15;
1009 if (l1 > dialog_x)
1010 dialog_x = l1;
1012 ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */
1013 istart = dialog_x - 3 - ilen;
1015 b2 = dialog_x - (str_term_width1 (buts[1]) + 6);
1017 i18n_flag = 1;
1020 #endif /* ENABLE_NLS */
1022 if (!domain)
1023 domain = "";
1024 if (!user)
1025 user = "";
1027 title = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
1029 auth_dlg = create_dlg (0, 0, dialog_y, dialog_x, dialog_colors, NULL,
1030 "[Smb Authinfo]", title, DLG_CENTER | DLG_REVERSE);
1032 g_free (title);
1034 in_user = input_new (5, istart, INPUT_COLOR, ilen, user, "auth_name", INPUT_COMPLETE_DEFAULT);
1035 add_widget (auth_dlg, in_user);
1037 in_domain = input_new (3, istart, INPUT_COLOR, ilen, domain, "auth_domain", INPUT_COMPLETE_DEFAULT);
1038 add_widget (auth_dlg, in_domain);
1039 add_widget (auth_dlg, button_new (9, b2, B_CANCEL, NORMAL_BUTTON,
1040 buts[1], 0));
1041 add_widget (auth_dlg, button_new (9, b0, B_ENTER, DEFPUSH_BUTTON,
1042 buts[0], 0));
1044 in_password = input_new (7, istart, INPUT_COLOR, ilen, "", "auth_password", INPUT_COMPLETE_DEFAULT);
1045 in_password->completion_flags = 0;
1046 in_password->is_password = 1;
1047 add_widget (auth_dlg, in_password);
1049 add_widget (auth_dlg, label_new (7, 3, labs[2]));
1050 add_widget (auth_dlg, label_new (5, 3, labs[1]));
1051 add_widget (auth_dlg, label_new (3, 3, labs[0]));
1053 run_dlg (auth_dlg);
1055 switch (auth_dlg->ret_value) {
1056 case B_CANCEL:
1057 return_value = 0;
1058 break;
1059 default:
1060 return_value = g_new (struct smb_authinfo, 1);
1061 if (return_value) {
1062 return_value->host = g_strdup (host);
1063 return_value->share = g_strdup (share);
1064 return_value->domain = g_strdup (in_domain->buffer);
1065 return_value->user = g_strdup (in_user->buffer);
1066 return_value->password = g_strdup (in_password->buffer);
1070 destroy_dlg (auth_dlg);
1072 return return_value;
1074 #endif /* WITH_SMBFS */