root/src/filemanager/boxes.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. configure_callback
  2. skin_apply
  3. skin_name_to_label
  4. skin_dlg_callback
  5. sel_skin_button
  6. appearance_box_callback
  7. panel_listing_callback
  8. sel_charset_button
  9. tree_callback
  10. confvfs_callback
  11. jobs_fill_listbox
  12. task_cb
  13. configure_box
  14. appearance_box
  15. panel_options_box
  16. panel_listing_box
  17. sort_box
  18. confirm_box
  19. display_bits_box
  20. display_bits_box
  21. tree_box
  22. configure_vfs_box
  23. cd_box
  24. symlink_box
  25. jobs_box

   1 /*
   2    Some misc dialog boxes for the program.
   3 
   4    Copyright (C) 1994-2022
   5    Free Software Foundation, Inc.
   6 
   7    Written by:
   8    Miguel de Icaza, 1994, 1995
   9    Jakub Jelinek, 1995
  10    Andrew Borodin <aborodin@vmail.ru>, 2009-2022
  11 
  12    This file is part of the Midnight Commander.
  13 
  14    The Midnight Commander is free software: you can redistribute it
  15    and/or modify it under the terms of the GNU General Public License as
  16    published by the Free Software Foundation, either version 3 of the License,
  17    or (at your option) any later version.
  18 
  19    The Midnight Commander is distributed in the hope that it will be useful,
  20    but WITHOUT ANY WARRANTY; without even the implied warranty of
  21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22    GNU General Public License for more details.
  23 
  24    You should have received a copy of the GNU General Public License
  25    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  26  */
  27 
  28 /** \file boxes.c
  29  *  \brief Source: Some misc dialog boxes for the program
  30  */
  31 
  32 #include <config.h>
  33 
  34 #include <ctype.h>
  35 #include <signal.h>
  36 #include <stdio.h>
  37 #include <stdlib.h>
  38 #include <string.h>
  39 #include <sys/types.h>
  40 #include <sys/stat.h>
  41 
  42 #include "lib/global.h"
  43 
  44 #include "lib/tty/tty.h"
  45 #include "lib/tty/color.h"      /* tty_use_colors() */
  46 #include "lib/tty/key.h"        /* XCTRL and ALT macros  */
  47 #include "lib/skin.h"           /* INPUT_COLOR */
  48 #include "lib/mcconfig.h"       /* Load/save user formats */
  49 #include "lib/strutil.h"
  50 
  51 #include "lib/vfs/vfs.h"
  52 #ifdef ENABLE_VFS_FTP
  53 #include "src/vfs/ftpfs/ftpfs.h"
  54 #endif /* ENABLE_VFS_FTP */
  55 
  56 #include "lib/util.h"           /* Q_() */
  57 #include "lib/widget.h"
  58 
  59 #include "src/setup.h"
  60 #include "src/history.h"        /* MC_HISTORY_ESC_TIMEOUT */
  61 #include "src/execute.h"        /* pause_after_run */
  62 #ifdef ENABLE_BACKGROUND
  63 #include "src/background.h"     /* task_list */
  64 #endif
  65 
  66 #ifdef HAVE_CHARSET
  67 #include "lib/charsets.h"
  68 #include "src/selcodepage.h"
  69 #endif
  70 
  71 #include "command.h"            /* For cmdline */
  72 #include "dir.h"
  73 #include "tree.h"
  74 #include "layout.h"             /* for get_nth_panel_name proto */
  75 #include "filemanager.h"
  76 
  77 #include "boxes.h"
  78 
  79 /*** global variables ****************************************************************************/
  80 
  81 /*** file scope macro definitions ****************************************************************/
  82 
  83 #ifdef ENABLE_BACKGROUND
  84 #define B_STOP   (B_USER+1)
  85 #define B_RESUME (B_USER+2)
  86 #define B_KILL   (B_USER+3)
  87 #endif /* ENABLE_BACKGROUND */
  88 
  89 /*** file scope type declarations ****************************************************************/
  90 
  91 /*** file scope variables ************************************************************************/
  92 
  93 static unsigned long configure_old_esc_mode_id, configure_time_out_id;
  94 
  95 /* Index in list_formats[] for "brief" */
  96 static const int panel_list_brief_idx = 1;
  97 /* Index in list_formats[] for "user defined" */
  98 static const int panel_list_user_idx = 3;
  99 
 100 static char **status_format;
 101 static unsigned long panel_list_formats_id, panel_user_format_id, panel_brief_cols_id;
 102 static unsigned long user_mini_status_id, mini_user_format_id;
 103 
 104 #ifdef HAVE_CHARSET
 105 static int new_display_codepage;
 106 #endif /* HAVE_CHARSET */
 107 
 108 #if defined(ENABLE_VFS) && defined(ENABLE_VFS_FTP)
 109 static unsigned long ftpfs_always_use_proxy_id, ftpfs_proxy_host_id;
 110 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
 111 
 112 static GPtrArray *skin_names;
 113 static gchar *current_skin_name;
 114 
 115 #ifdef ENABLE_BACKGROUND
 116 static WListbox *bg_list = NULL;
 117 #endif /* ENABLE_BACKGROUND */
 118 
 119 static unsigned long shadows_id;
 120 
 121 /* --------------------------------------------------------------------------------------------- */
 122 /*** file scope functions ************************************************************************/
 123 /* --------------------------------------------------------------------------------------------- */
 124 
 125 static cb_ret_t
 126 configure_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 127 {
 128     switch (msg)
 129     {
 130     case MSG_NOTIFY:
 131         /* message from "Single press" checkbutton */
 132         if (sender != NULL && sender->id == configure_old_esc_mode_id)
 133         {
 134             const gboolean not_single = !CHECK (sender)->state;
 135             Widget *ww;
 136 
 137             /* input line */
 138             ww = widget_find_by_id (w, configure_time_out_id);
 139             widget_disable (ww, not_single);
 140 
 141             return MSG_HANDLED;
 142         }
 143         return MSG_NOT_HANDLED;
 144 
 145     default:
 146         return dlg_default_callback (w, sender, msg, parm, data);
 147     }
 148 }
 149 
 150 /* --------------------------------------------------------------------------------------------- */
 151 
 152 static void
 153 skin_apply (const gchar * skin_override)
     /* [previous][next][first][last][top][bottom][index][help]  */
 154 {
 155     GError *mcerror = NULL;
 156 
 157     mc_skin_deinit ();
 158     mc_skin_init (skin_override, &mcerror);
 159     mc_fhl_free (&mc_filehighlight);
 160     mc_filehighlight = mc_fhl_new (TRUE);
 161     dlg_set_default_colors ();
 162     input_set_default_colors ();
 163     if (mc_global.mc_run_mode == MC_RUN_FULL)
 164         command_set_default_colors ();
 165     panel_deinit ();
 166     panel_init ();
 167     repaint_screen ();
 168 
 169     mc_error_message (&mcerror, NULL);
 170 }
 171 
 172 /* --------------------------------------------------------------------------------------------- */
 173 
 174 static const gchar *
 175 skin_name_to_label (const gchar * name)
     /* [previous][next][first][last][top][bottom][index][help]  */
 176 {
 177     if (strcmp (name, "default") == 0)
 178         return _("< Default >");
 179     return name;
 180 }
 181 
 182 /* --------------------------------------------------------------------------------------------- */
 183 
 184 static cb_ret_t
 185 skin_dlg_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 186 {
 187     switch (msg)
 188     {
 189     case MSG_RESIZE:
 190         {
 191             WDialog *d = DIALOG (w);
 192             const WRect *wd = &WIDGET (d->data)->rect;
 193             WRect r = w->rect;
 194 
 195             r.y = wd->y + (wd->lines - r.lines) / 2;
 196             r.x = wd->x + wd->cols / 2;
 197 
 198             return dlg_default_callback (w, NULL, MSG_RESIZE, 0, &r);
 199         }
 200 
 201     default:
 202         return dlg_default_callback (w, sender, msg, parm, data);
 203     }
 204 }
 205 
 206 /* --------------------------------------------------------------------------------------------- */
 207 
 208 static int
 209 sel_skin_button (WButton * button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 210 {
 211     int result;
 212     WListbox *skin_list;
 213     WDialog *skin_dlg;
 214     const gchar *skin_name;
 215     unsigned int i;
 216     unsigned int pos = 1;
 217 
 218     (void) action;
 219 
 220     skin_dlg =
 221         dlg_create (TRUE, 0, 0, 13, 24, WPOS_KEEP_DEFAULT, TRUE, dialog_colors, skin_dlg_callback,
 222                     NULL, "[Appearance]", _("Skins"));
 223     /* use Appearance dialog for positioning */
 224     skin_dlg->data = WIDGET (button)->owner;
 225 
 226     /* set dialog location before all */
 227     send_message (skin_dlg, NULL, MSG_RESIZE, 0, NULL);
 228 
 229     skin_list = listbox_new (1, 1, 11, 22, FALSE, NULL);
 230     skin_name = "default";
 231     listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name),
 232                       (void *) skin_name, FALSE);
 233 
 234     if (strcmp (skin_name, current_skin_name) == 0)
 235         listbox_select_entry (skin_list, 0);
 236 
 237     for (i = 0; i < skin_names->len; i++)
 238     {
 239         skin_name = g_ptr_array_index (skin_names, i);
 240         if (strcmp (skin_name, "default") != 0)
 241         {
 242             listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name),
 243                               (void *) skin_name, FALSE);
 244             if (strcmp (skin_name, current_skin_name) == 0)
 245                 listbox_select_entry (skin_list, pos);
 246             pos++;
 247         }
 248     }
 249 
 250     /* make list stick to all sides of dialog, effectively make it be resized with dialog */
 251     group_add_widget_autopos (GROUP (skin_dlg), skin_list, WPOS_KEEP_ALL, NULL);
 252 
 253     result = dlg_run (skin_dlg);
 254     if (result == B_ENTER)
 255     {
 256         gchar *skin_label;
 257 
 258         listbox_get_current (skin_list, &skin_label, (void **) &skin_name);
 259         g_free (current_skin_name);
 260         current_skin_name = g_strdup (skin_name);
 261         skin_apply (skin_name);
 262 
 263         button_set_text (button, str_fit_to_term (skin_label, 20, J_LEFT_FIT));
 264     }
 265     widget_destroy (WIDGET (skin_dlg));
 266 
 267     return 0;
 268 }
 269 
 270 /* --------------------------------------------------------------------------------------------- */
 271 
 272 static cb_ret_t
 273 appearance_box_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 274 {
 275     switch (msg)
 276     {
 277     case MSG_INIT:
 278 #ifdef ENABLE_SHADOWS
 279         if (!tty_use_colors ())
 280 #endif
 281         {
 282             Widget *shadow;
 283 
 284             shadow = widget_find_by_id (w, shadows_id);
 285             CHECK (shadow)->state = FALSE;
 286             widget_disable (shadow, TRUE);
 287         }
 288         return MSG_HANDLED;
 289 
 290     case MSG_NOTIFY:
 291         if (sender != NULL && sender->id == shadows_id)
 292         {
 293             mc_global.tty.shadows = CHECK (sender)->state;
 294             repaint_screen ();
 295             return MSG_HANDLED;
 296         }
 297         return MSG_NOT_HANDLED;
 298 
 299     default:
 300         return dlg_default_callback (w, sender, msg, parm, data);
 301     }
 302 }
 303 
 304 /* --------------------------------------------------------------------------------------------- */
 305 
 306 static cb_ret_t
 307 panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 308 {
 309     switch (msg)
 310     {
 311     case MSG_NOTIFY:
 312         if (sender != NULL && sender->id == panel_list_formats_id)
 313         {
 314             WCheck *ch;
 315             WInput *in1, *in2, *in3;
 316 
 317             in1 = INPUT (widget_find_by_id (w, panel_user_format_id));
 318             in2 = INPUT (widget_find_by_id (w, panel_brief_cols_id));
 319             ch = CHECK (widget_find_by_id (w, user_mini_status_id));
 320             in3 = INPUT (widget_find_by_id (w, mini_user_format_id));
 321 
 322             if (!ch->state)
 323                 input_assign_text (in3, status_format[RADIO (sender)->sel]);
 324             input_update (in1, FALSE);
 325             input_update (in2, FALSE);
 326             input_update (in3, FALSE);
 327             widget_disable (WIDGET (in1), RADIO (sender)->sel != panel_list_user_idx);
 328             widget_disable (WIDGET (in2), RADIO (sender)->sel != panel_list_brief_idx);
 329             return MSG_HANDLED;
 330         }
 331 
 332         if (sender != NULL && sender->id == user_mini_status_id)
 333         {
 334             WInput *in;
 335 
 336             in = INPUT (widget_find_by_id (w, mini_user_format_id));
 337 
 338             if (CHECK (sender)->state)
 339             {
 340                 widget_disable (WIDGET (in), FALSE);
 341                 input_assign_text (in, status_format[3]);
 342             }
 343             else
 344             {
 345                 WRadio *r;
 346 
 347                 r = RADIO (widget_find_by_id (w, panel_list_formats_id));
 348                 widget_disable (WIDGET (in), TRUE);
 349                 input_assign_text (in, status_format[r->sel]);
 350             }
 351             /* input_update (in, FALSE); */
 352             return MSG_HANDLED;
 353         }
 354 
 355         return MSG_NOT_HANDLED;
 356 
 357     default:
 358         return dlg_default_callback (w, sender, msg, parm, data);
 359     }
 360 }
 361 
 362 /* --------------------------------------------------------------------------------------------- */
 363 
 364 #ifdef HAVE_CHARSET
 365 static int
 366 sel_charset_button (WButton * button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 367 {
 368     int new_dcp;
 369 
 370     (void) action;
 371 
 372     new_dcp = select_charset (-1, -1, new_display_codepage, TRUE);
 373 
 374     if (new_dcp != SELECT_CHARSET_CANCEL)
 375     {
 376         const char *cpname;
 377 
 378         new_display_codepage = new_dcp;
 379         cpname = (new_display_codepage == SELECT_CHARSET_OTHER_8BIT) ?
 380             _("Other 8 bit") :
 381             ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
 382         if (cpname != NULL)
 383             mc_global.utf8_display = str_isutf8 (cpname);
 384         else
 385             cpname = _("7-bit ASCII");  /* FIXME */
 386 
 387         button_set_text (button, cpname);
 388         widget_draw (WIDGET (WIDGET (button)->owner));
 389     }
 390 
 391     return 0;
 392 }
 393 #endif /* HAVE_CHARSET */
 394 
 395 /* --------------------------------------------------------------------------------------------- */
 396 
 397 static cb_ret_t
 398 tree_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 399 {
 400     WDialog *h = DIALOG (w);
 401 
 402     switch (msg)
 403     {
 404     case MSG_RESIZE:
 405         {
 406             WRect r = w->rect;
 407             Widget *bar;
 408 
 409             r.lines = LINES - 9;
 410             r.cols = COLS - 20;
 411             dlg_default_callback (w, NULL, MSG_RESIZE, 0, &r);
 412 
 413             bar = WIDGET (find_buttonbar (h));
 414             bar->rect.x = 0;
 415             bar->rect.y = LINES - 1;
 416             return MSG_HANDLED;
 417         }
 418 
 419     case MSG_ACTION:
 420         return send_message (find_tree (h), NULL, MSG_ACTION, parm, NULL);
 421 
 422     default:
 423         return dlg_default_callback (w, sender, msg, parm, data);
 424     }
 425 }
 426 
 427 /* --------------------------------------------------------------------------------------------- */
 428 
 429 #if defined(ENABLE_VFS) && defined (ENABLE_VFS_FTP)
 430 static cb_ret_t
 431 confvfs_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 432 {
 433     switch (msg)
 434     {
 435     case MSG_NOTIFY:
 436         /* message from "Always use ftp proxy" checkbutton */
 437         if (sender != NULL && sender->id == ftpfs_always_use_proxy_id)
 438         {
 439             const gboolean not_use = !CHECK (sender)->state;
 440             Widget *wi;
 441 
 442             /* input */
 443             wi = widget_find_by_id (w, ftpfs_proxy_host_id);
 444             widget_disable (wi, not_use);
 445             return MSG_HANDLED;
 446         }
 447         return MSG_NOT_HANDLED;
 448 
 449     default:
 450         return dlg_default_callback (w, sender, msg, parm, data);
 451     }
 452 }
 453 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
 454 
 455 /* --------------------------------------------------------------------------------------------- */
 456 
 457 #ifdef ENABLE_BACKGROUND
 458 static void
 459 jobs_fill_listbox (WListbox * list)
     /* [previous][next][first][last][top][bottom][index][help]  */
 460 {
 461     static const char *state_str[2] = { "", "" };
 462     TaskList *tl;
 463 
 464     if (state_str[0][0] == '\0')
 465     {
 466         state_str[0] = _("Running");
 467         state_str[1] = _("Stopped");
 468     }
 469 
 470     for (tl = task_list; tl != NULL; tl = tl->next)
 471     {
 472         char *s;
 473 
 474         s = g_strconcat (state_str[tl->state], " ", tl->info, (char *) NULL);
 475         listbox_add_item (list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl, FALSE);
 476         g_free (s);
 477     }
 478 }
 479 
 480 /* --------------------------------------------------------------------------------------------- */
 481 
 482 static int
 483 task_cb (WButton * button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 484 {
 485     TaskList *tl;
 486     int sig = 0;
 487 
 488     (void) button;
 489 
 490     if (bg_list->list == NULL)
 491         return 0;
 492 
 493     /* Get this instance information */
 494     listbox_get_current (bg_list, NULL, (void **) &tl);
 495 
 496 #ifdef SIGTSTP
 497     if (action == B_STOP)
 498     {
 499         sig = SIGSTOP;
 500         tl->state = Task_Stopped;
 501     }
 502     else if (action == B_RESUME)
 503     {
 504         sig = SIGCONT;
 505         tl->state = Task_Running;
 506     }
 507     else
 508 #endif
 509     if (action == B_KILL)
 510         sig = SIGKILL;
 511 
 512     if (sig == SIGKILL)
 513         unregister_task_running (tl->pid, tl->fd);
 514 
 515     kill (tl->pid, sig);
 516     listbox_remove_list (bg_list);
 517     jobs_fill_listbox (bg_list);
 518 
 519     /* This can be optimized to just redraw this widget :-) */
 520     widget_draw (WIDGET (WIDGET (button)->owner));
 521 
 522     return 0;
 523 }
 524 #endif /* ENABLE_BACKGROUND */
 525 
 526 /* --------------------------------------------------------------------------------------------- */
 527 /*** public functions ****************************************************************************/
 528 /* --------------------------------------------------------------------------------------------- */
 529 
 530 void
 531 configure_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 532 {
 533     const char *pause_options[] = {
 534         N_("&Never"),
 535         N_("On dum&b terminals"),
 536         N_("Alwa&ys")
 537     };
 538 
 539     int pause_options_num;
 540 
 541     pause_options_num = G_N_ELEMENTS (pause_options);
 542 
 543     {
 544         char time_out[BUF_TINY] = "";
 545         char *time_out_new;
 546 
 547         quick_widget_t quick_widgets[] = {
 548             /* *INDENT-OFF* */
 549             QUICK_START_COLUMNS,
 550                 QUICK_START_GROUPBOX (N_("File operations")),
 551                     QUICK_CHECKBOX (N_("&Verbose operation"), &verbose, NULL),
 552                     QUICK_CHECKBOX (N_("Compute tota&ls"), &file_op_compute_totals, NULL),
 553                     QUICK_CHECKBOX (N_("Classic pro&gressbar"), &classic_progressbar, NULL),
 554                     QUICK_CHECKBOX (N_("Mkdi&r autoname"), &auto_fill_mkdir_name, NULL),
 555                     QUICK_CHECKBOX (N_("&Preallocate space"), &mc_global.vfs.preallocate_space,
 556                                     NULL),
 557                 QUICK_STOP_GROUPBOX,
 558                 QUICK_START_GROUPBOX (N_("Esc key mode")),
 559                     QUICK_CHECKBOX (N_("S&ingle press"), &old_esc_mode, &configure_old_esc_mode_id),
 560                     QUICK_LABELED_INPUT (N_("Timeout:"), input_label_left,
 561                                          (const char *) time_out, MC_HISTORY_ESC_TIMEOUT,
 562                                          &time_out_new, &configure_time_out_id, FALSE, FALSE,
 563                                          INPUT_COMPLETE_NONE),
 564                 QUICK_STOP_GROUPBOX,
 565                 QUICK_START_GROUPBOX (N_("Pause after run")),
 566                     QUICK_RADIO (pause_options_num, pause_options, &pause_after_run, NULL),
 567                 QUICK_STOP_GROUPBOX,
 568             QUICK_NEXT_COLUMN,
 569                 QUICK_START_GROUPBOX (N_("Other options")),
 570                     QUICK_CHECKBOX (N_("Use internal edi&t"), &use_internal_edit, NULL),
 571                     QUICK_CHECKBOX (N_("Use internal vie&w"), &use_internal_view, NULL),
 572                     QUICK_CHECKBOX (N_("A&sk new file name"),
 573                                     &editor_ask_filename_before_edit, NULL),
 574                     QUICK_CHECKBOX (N_("Auto m&enus"), &auto_menu, NULL),
 575                     QUICK_CHECKBOX (N_("&Drop down menus"), &drop_menus, NULL),
 576                     QUICK_CHECKBOX (N_("S&hell patterns"), &easy_patterns, NULL),
 577                     QUICK_CHECKBOX (N_("Co&mplete: show all"),
 578                                     &mc_global.widget.show_all_if_ambiguous, NULL),
 579                     QUICK_CHECKBOX (N_("Rotating d&ash"), &nice_rotating_dash, NULL),
 580                     QUICK_CHECKBOX (N_("Cd follows lin&ks"), &mc_global.vfs.cd_symlinks, NULL),
 581                     QUICK_CHECKBOX (N_("Sa&fe delete"), &safe_delete, NULL),
 582                     QUICK_CHECKBOX (N_("Safe overwrite"), &safe_overwrite, NULL),       /* w/o hotkey */
 583                     QUICK_CHECKBOX (N_("A&uto save setup"), &auto_save_setup, NULL),
 584                     QUICK_SEPARATOR (FALSE),
 585                     QUICK_SEPARATOR (FALSE),
 586                 QUICK_STOP_GROUPBOX,
 587             QUICK_STOP_COLUMNS,
 588             QUICK_BUTTONS_OK_CANCEL,
 589             QUICK_END
 590             /* *INDENT-ON* */
 591         };
 592 
 593         WRect r = { -1, -1, 0, 60 };
 594 
 595         quick_dialog_t qdlg = {
 596             r, N_("Configure options"), "[Configuration]",
 597             quick_widgets, configure_callback, NULL
 598         };
 599 
 600         g_snprintf (time_out, sizeof (time_out), "%d", old_esc_mode_timeout);
 601 
 602 #ifndef USE_INTERNAL_EDIT
 603         quick_widgets[17].state = WST_DISABLED;
 604 #endif
 605 
 606         if (!old_esc_mode)
 607             quick_widgets[10].state = quick_widgets[11].state = WST_DISABLED;
 608 
 609 #ifndef HAVE_POSIX_FALLOCATE
 610         mc_global.vfs.preallocate_space = FALSE;
 611         quick_widgets[7].state = WST_DISABLED;
 612 #endif
 613 
 614         if (quick_dialog (&qdlg) == B_ENTER)
 615         {
 616             if (time_out_new[0] == '\0')
 617                 old_esc_mode_timeout = 0;
 618             else
 619                 old_esc_mode_timeout = atoi (time_out_new);
 620         }
 621 
 622         g_free (time_out_new);
 623     }
 624 }
 625 
 626 /* --------------------------------------------------------------------------------------------- */
 627 
 628 void
 629 appearance_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 630 {
 631     gboolean shadows = mc_global.tty.shadows;
 632 
 633     current_skin_name = g_strdup (mc_skin__default.name);
 634     skin_names = mc_skin_list ();
 635 
 636     {
 637         quick_widget_t quick_widgets[] = {
 638             /* *INDENT-OFF* */
 639             QUICK_START_COLUMNS,
 640                 QUICK_LABEL (N_("Skin:"), NULL),
 641             QUICK_NEXT_COLUMN,
 642                 QUICK_BUTTON (str_fit_to_term (skin_name_to_label (current_skin_name), 20, J_LEFT_FIT),
 643                               B_USER, sel_skin_button, NULL),
 644             QUICK_STOP_COLUMNS,
 645             QUICK_SEPARATOR (TRUE),
 646             QUICK_CHECKBOX (N_("&Shadows"), &mc_global.tty.shadows, &shadows_id),
 647             QUICK_BUTTONS_OK_CANCEL,
 648             QUICK_END
 649             /* *INDENT-ON* */
 650         };
 651 
 652         WRect r = { -1, -1, 0, 54 };
 653 
 654         quick_dialog_t qdlg = {
 655             r, N_("Appearance"), "[Appearance]",
 656             quick_widgets, appearance_box_callback, NULL
 657         };
 658 
 659         if (quick_dialog (&qdlg) == B_ENTER)
 660             mc_config_set_string (mc_global.main_config, CONFIG_APP_SECTION, "skin",
 661                                   current_skin_name);
 662         else
 663         {
 664             skin_apply (NULL);
 665             mc_global.tty.shadows = shadows;
 666         }
 667     }
 668 
 669     g_free (current_skin_name);
 670     g_ptr_array_foreach (skin_names, (GFunc) g_free, NULL);
 671     g_ptr_array_free (skin_names, TRUE);
 672 }
 673 
 674 /* --------------------------------------------------------------------------------------------- */
 675 
 676 void
 677 panel_options_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 678 {
 679     gboolean simple_swap;
 680 
 681     simple_swap = mc_config_get_bool (mc_global.main_config, CONFIG_PANELS_SECTION,
 682                                       "simple_swap", FALSE);
 683     {
 684         const char *qsearch_options[] = {
 685             N_("Case &insensitive"),
 686             N_("Cas&e sensitive"),
 687             N_("Use panel sort mo&de")
 688         };
 689 
 690         quick_widget_t quick_widgets[] = {
 691             /* *INDENT-OFF* */
 692             QUICK_START_COLUMNS,
 693                 QUICK_START_GROUPBOX (N_("Main options")),
 694                     QUICK_CHECKBOX (N_("Show mi&ni-status"), &panels_options.show_mini_info, NULL),
 695                     QUICK_CHECKBOX (N_("Use SI si&ze units"), &panels_options.kilobyte_si, NULL),
 696                     QUICK_CHECKBOX (N_("Mi&x all files"), &panels_options.mix_all_files, NULL),
 697                     QUICK_CHECKBOX (N_("Show &backup files"), &panels_options.show_backups, NULL),
 698                     QUICK_CHECKBOX (N_("Show &hidden files"), &panels_options.show_dot_files, NULL),
 699                     QUICK_CHECKBOX (N_("&Fast dir reload"), &panels_options.fast_reload, NULL),
 700                     QUICK_CHECKBOX (N_("Ma&rk moves down"), &panels_options.mark_moves_down, NULL),
 701                     QUICK_CHECKBOX (N_("Re&verse files only"), &panels_options.reverse_files_only,
 702                                     NULL),
 703                     QUICK_CHECKBOX (N_("Simple s&wap"), &simple_swap, NULL),
 704                     QUICK_CHECKBOX (N_("A&uto save panels setup"), &panels_options.auto_save_setup,
 705                                     NULL),
 706                     QUICK_SEPARATOR (FALSE),
 707                     QUICK_SEPARATOR (FALSE),
 708                     QUICK_SEPARATOR (FALSE),
 709                 QUICK_STOP_GROUPBOX,
 710             QUICK_NEXT_COLUMN,
 711                 QUICK_START_GROUPBOX (N_("Navigation")),
 712                     QUICK_CHECKBOX (N_("L&ynx-like motion"), &panels_options.navigate_with_arrows,
 713                                     NULL),
 714                     QUICK_CHECKBOX (N_("Pa&ge scrolling"), &panels_options.scroll_pages, NULL),
 715                     QUICK_CHECKBOX (N_("Center &scrolling"), &panels_options.scroll_center, NULL),
 716                     QUICK_CHECKBOX (N_("&Mouse page scrolling"), &panels_options.mouse_move_pages,
 717                                     NULL),
 718                 QUICK_STOP_GROUPBOX,
 719                 QUICK_START_GROUPBOX (N_("File highlight")),
 720                     QUICK_CHECKBOX (N_("File &types"), &panels_options.filetype_mode, NULL),
 721                     QUICK_CHECKBOX (N_("&Permissions"), &panels_options.permission_mode, NULL),
 722                 QUICK_STOP_GROUPBOX,
 723                 QUICK_START_GROUPBOX (N_("Quick search")),
 724                     QUICK_RADIO (QSEARCH_NUM, qsearch_options, (int *) &panels_options.qsearch_mode,
 725                                  NULL),
 726                 QUICK_STOP_GROUPBOX,
 727             QUICK_STOP_COLUMNS,
 728             QUICK_BUTTONS_OK_CANCEL,
 729             QUICK_END
 730             /* *INDENT-ON* */
 731         };
 732 
 733         WRect r = { -1, -1, 0, 60 };
 734 
 735         quick_dialog_t qdlg = {
 736             r, N_("Panel options"), "[Panel options]",
 737             quick_widgets, NULL, NULL
 738         };
 739 
 740         if (quick_dialog (&qdlg) != B_ENTER)
 741             return;
 742     }
 743 
 744     mc_config_set_bool (mc_global.main_config, CONFIG_PANELS_SECTION, "simple_swap", simple_swap);
 745 
 746     if (!panels_options.fast_reload_msg_shown && panels_options.fast_reload)
 747     {
 748         message (D_NORMAL, _("Information"),
 749                  _("Using the fast reload option may not reflect the exact\n"
 750                    "directory contents. In this case you'll need to do a\n"
 751                    "manual reload of the directory. See the man page for\n" "the details."));
 752         panels_options.fast_reload_msg_shown = TRUE;
 753     }
 754 
 755     update_panels (UP_RELOAD, UP_KEEPSEL);
 756 }
 757 
 758 /* --------------------------------------------------------------------------------------------- */
 759 
 760 /* return list type */
 761 int
 762 panel_listing_box (WPanel * panel, int num, char **userp, char **minip, gboolean * use_msformat,
     /* [previous][next][first][last][top][bottom][index][help]  */
 763                    int *brief_cols)
 764 {
 765     int result = -1;
 766     const char *p = NULL;
 767 
 768     if (panel == NULL)
 769     {
 770         p = get_nth_panel_name (num);
 771         panel = panel_empty_new (p);
 772     }
 773 
 774     {
 775         gboolean user_mini_status;
 776         char panel_brief_cols_in[BUF_TINY];
 777         char *panel_brief_cols_out = NULL;
 778         char *panel_user_format = NULL;
 779         char *mini_user_format = NULL;
 780 
 781         /* Controls whether the array strings have been translated */
 782         const char *list_formats[LIST_FORMATS] = {
 783             N_("&Full file list"),
 784             N_("&Brief file list:"),
 785             N_("&Long file list"),
 786             N_("&User defined:")
 787         };
 788 
 789         quick_widget_t quick_widgets[] = {
 790             /* *INDENT-OFF* */
 791             QUICK_START_COLUMNS,
 792                 QUICK_RADIO (LIST_FORMATS, list_formats, &result, &panel_list_formats_id),
 793             QUICK_NEXT_COLUMN,
 794                 QUICK_SEPARATOR (FALSE),
 795                 QUICK_LABELED_INPUT (_ ("columns"), input_label_right, panel_brief_cols_in,
 796                                      "panel-brief-cols-input", &panel_brief_cols_out,
 797                                      &panel_brief_cols_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
 798             QUICK_STOP_COLUMNS,
 799             QUICK_INPUT (panel->user_format, "user-fmt-input", &panel_user_format,
 800                          &panel_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
 801             QUICK_SEPARATOR (TRUE),
 802             QUICK_CHECKBOX (N_("User &mini status"), &user_mini_status, &user_mini_status_id),
 803             QUICK_INPUT (panel->user_status_format[panel->list_format], "mini_input",
 804                          &mini_user_format, &mini_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
 805             QUICK_BUTTONS_OK_CANCEL,
 806             QUICK_END
 807             /* *INDENT-ON* */
 808         };
 809 
 810         WRect r = { -1, -1, 0, 48 };
 811 
 812         quick_dialog_t qdlg = {
 813             r, N_("Listing format"), "[Listing Format...]",
 814             quick_widgets, panel_listing_callback, NULL
 815         };
 816 
 817         user_mini_status = panel->user_mini_status;
 818         result = panel->list_format;
 819         status_format = panel->user_status_format;
 820 
 821         g_snprintf (panel_brief_cols_in, sizeof (panel_brief_cols_in), "%d", panel->brief_cols);
 822 
 823         if ((int) panel->list_format != panel_list_brief_idx)
 824             quick_widgets[4].state = WST_DISABLED;
 825 
 826         if ((int) panel->list_format != panel_list_user_idx)
 827             quick_widgets[6].state = WST_DISABLED;
 828 
 829         if (!user_mini_status)
 830             quick_widgets[9].state = WST_DISABLED;
 831 
 832         if (quick_dialog (&qdlg) == B_CANCEL)
 833             result = -1;
 834         else
 835         {
 836             int cols;
 837             char *error = NULL;
 838 
 839             *userp = panel_user_format;
 840             *minip = mini_user_format;
 841             *use_msformat = user_mini_status;
 842 
 843             cols = strtol (panel_brief_cols_out, &error, 10);
 844             if (*error == '\0')
 845                 *brief_cols = cols;
 846             else
 847                 *brief_cols = panel->brief_cols;
 848 
 849             g_free (panel_brief_cols_out);
 850         }
 851     }
 852 
 853     if (p != NULL)
 854     {
 855         int i;
 856 
 857         g_free (panel->user_format);
 858         for (i = 0; i < LIST_FORMATS; i++)
 859             g_free (panel->user_status_format[i]);
 860         g_free (panel);
 861     }
 862 
 863     return result;
 864 }
 865 
 866 /* --------------------------------------------------------------------------------------------- */
 867 
 868 const panel_field_t *
 869 sort_box (dir_sort_options_t * op, const panel_field_t * sort_field)
     /* [previous][next][first][last][top][bottom][index][help]  */
 870 {
 871     char **sort_orders_names;
 872     gsize i;
 873     gsize sort_names_num = 0;
 874     int sort_idx = 0;
 875     const panel_field_t *result = NULL;
 876 
 877     sort_orders_names = panel_get_sortable_fields (&sort_names_num);
 878 
 879     for (i = 0; i < sort_names_num; i++)
 880         if (strcmp (sort_orders_names[i], _(sort_field->title_hotkey)) == 0)
 881         {
 882             sort_idx = i;
 883             break;
 884         }
 885 
 886     {
 887         quick_widget_t quick_widgets[] = {
 888             /* *INDENT-OFF* */
 889             QUICK_START_COLUMNS,
 890                 QUICK_RADIO (sort_names_num, (const char **) sort_orders_names, &sort_idx, NULL),
 891             QUICK_NEXT_COLUMN,
 892                 QUICK_CHECKBOX (N_("Executable &first"), &op->exec_first, NULL),
 893                 QUICK_CHECKBOX (N_("Cas&e sensitive"), &op->case_sensitive, NULL),
 894                 QUICK_CHECKBOX (N_("&Reverse"), &op->reverse, NULL),
 895             QUICK_STOP_COLUMNS,
 896             QUICK_BUTTONS_OK_CANCEL,
 897             QUICK_END
 898             /* *INDENT-ON* */
 899         };
 900 
 901         WRect r = { -1, -1, 0, 40 };
 902 
 903         quick_dialog_t qdlg = {
 904             r, N_("Sort order"), "[Sort Order...]",
 905             quick_widgets, NULL, NULL
 906         };
 907 
 908         if (quick_dialog (&qdlg) != B_CANCEL)
 909             result = panel_get_field_by_title_hotkey (sort_orders_names[sort_idx]);
 910 
 911         if (result == NULL)
 912             result = sort_field;
 913     }
 914 
 915     g_strfreev (sort_orders_names);
 916 
 917     return result;
 918 }
 919 
 920 /* --------------------------------------------------------------------------------------------- */
 921 
 922 void
 923 confirm_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 924 {
 925     quick_widget_t quick_widgets[] = {
 926         /* *INDENT-OFF* */
 927         /* TRANSLATORS: no need to translate 'Confirmation', it's just a context prefix */
 928         QUICK_CHECKBOX (Q_("Confirmation|&Delete"), &confirm_delete, NULL),
 929         QUICK_CHECKBOX (Q_("Confirmation|O&verwrite"), &confirm_overwrite, NULL),
 930         QUICK_CHECKBOX (Q_("Confirmation|&Execute"), &confirm_execute, NULL),
 931         QUICK_CHECKBOX (Q_("Confirmation|E&xit"), &confirm_exit, NULL),
 932         QUICK_CHECKBOX (Q_("Confirmation|Di&rectory hotlist delete"),
 933                         &confirm_directory_hotlist_delete, NULL),
 934         QUICK_CHECKBOX (Q_("Confirmation|&History cleanup"),
 935                         &mc_global.widget.confirm_history_cleanup, NULL),
 936         QUICK_BUTTONS_OK_CANCEL,
 937         QUICK_END
 938         /* *INDENT-ON* */
 939     };
 940 
 941     WRect r = { -1, -1, 0, 46 };
 942 
 943     quick_dialog_t qdlg = {
 944         r, N_("Confirmation"), "[Confirmation]",
 945         quick_widgets, NULL, NULL
 946     };
 947 
 948     (void) quick_dialog (&qdlg);
 949 }
 950 
 951 /* --------------------------------------------------------------------------------------------- */
 952 
 953 #ifndef HAVE_CHARSET
 954 void
 955 display_bits_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 956 {
 957     gboolean new_meta;
 958     int current_mode;
 959 
 960     const char *display_bits_str[] = {
 961         N_("&UTF-8 output"),
 962         N_("&Full 8 bits output"),
 963         N_("&ISO 8859-1"),
 964         N_("7 &bits")
 965     };
 966 
 967     quick_widget_t quick_widgets[] = {
 968         /* *INDENT-OFF* */
 969         QUICK_RADIO (4, display_bits_str, &current_mode, NULL),
 970         QUICK_SEPARATOR (TRUE),
 971         QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
 972         QUICK_BUTTONS_OK_CANCEL,
 973         QUICK_END
 974         /* *INDENT-ON* */
 975     };
 976 
 977     WRect r = { -1, -1, 0, 46 };
 978 
 979     quick_dialog_t qdlg = {
 980         r, _("Display bits"), "[Display bits]",
 981         quick_widgets, NULL, NULL
 982     };
 983 
 984     if (mc_global.full_eight_bits)
 985         current_mode = 0;
 986     else if (mc_global.eight_bit_clean)
 987         current_mode = 1;
 988     else
 989         current_mode = 2;
 990 
 991     new_meta = !use_8th_bit_as_meta;
 992 
 993     if (quick_dialog (&qdlg) != B_CANCEL)
 994     {
 995         mc_global.eight_bit_clean = current_mode < 3;
 996         mc_global.full_eight_bits = current_mode < 2;
 997 #ifndef HAVE_SLANG
 998         tty_display_8bit (mc_global.eight_bit_clean);
 999 #else
1000         tty_display_8bit (mc_global.full_eight_bits);
1001 #endif
1002         use_8th_bit_as_meta = !new_meta;
1003     }
1004 }
1005 
1006 /* --------------------------------------------------------------------------------------------- */
1007 #else /* HAVE_CHARSET */
1008 
1009 void
1010 display_bits_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
1011 {
1012     const char *cpname;
1013 
1014     new_display_codepage = mc_global.display_codepage;
1015 
1016     cpname = (new_display_codepage < 0) ? _("Other 8 bit")
1017         : ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
1018 
1019     {
1020         gboolean new_meta;
1021 
1022         quick_widget_t quick_widgets[] = {
1023             /* *INDENT-OFF* */
1024             QUICK_START_COLUMNS,
1025                 QUICK_LABEL (N_("Input / display codepage:"), NULL),
1026             QUICK_NEXT_COLUMN,
1027                 QUICK_BUTTON (cpname, B_USER, sel_charset_button, NULL),
1028             QUICK_STOP_COLUMNS,
1029             QUICK_SEPARATOR (TRUE),
1030                 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta, NULL),
1031             QUICK_BUTTONS_OK_CANCEL,
1032             QUICK_END
1033             /* *INDENT-ON* */
1034         };
1035 
1036         WRect r = { -1, -1, 0, 46 };
1037 
1038         quick_dialog_t qdlg = {
1039             r, N_("Display bits"), "[Display bits]",
1040             quick_widgets, NULL, NULL
1041         };
1042 
1043         new_meta = !use_8th_bit_as_meta;
1044         application_keypad_mode ();
1045 
1046         if (quick_dialog (&qdlg) == B_ENTER)
1047         {
1048             char *errmsg;
1049 
1050             mc_global.display_codepage = new_display_codepage;
1051 
1052             errmsg = init_translation_table (mc_global.source_codepage, mc_global.display_codepage);
1053             if (errmsg != NULL)
1054             {
1055                 message (D_ERROR, MSG_ERROR, "%s", errmsg);
1056                 g_free (errmsg);
1057             }
1058 
1059 #ifdef HAVE_SLANG
1060             tty_display_8bit (mc_global.display_codepage != 0 && mc_global.display_codepage != 1);
1061 #else
1062             tty_display_8bit (mc_global.display_codepage != 0);
1063 #endif
1064             use_8th_bit_as_meta = !new_meta;
1065 
1066             repaint_screen ();
1067         }
1068     }
1069 }
1070 #endif /* HAVE_CHARSET */
1071 
1072 /* --------------------------------------------------------------------------------------------- */
1073 /** Show tree in a box, not on a panel */
1074 
1075 char *
1076 tree_box (const char *current_dir)
     /* [previous][next][first][last][top][bottom][index][help]  */
1077 {
1078     WTree *mytree;
1079     WDialog *dlg;
1080     WGroup *g;
1081     Widget *wd;
1082     char *val = NULL;
1083     WButtonBar *bar;
1084 
1085     (void) current_dir;
1086 
1087     /* Create the components */
1088     dlg = dlg_create (TRUE, 0, 0, LINES - 9, COLS - 20, WPOS_CENTER, FALSE, dialog_colors,
1089                       tree_callback, NULL, "[Directory Tree]", _("Directory tree"));
1090     g = GROUP (dlg);
1091     wd = WIDGET (dlg);
1092 
1093     mytree = tree_new (2, 2, wd->rect.lines - 6, wd->rect.cols - 5, FALSE);
1094     group_add_widget_autopos (g, mytree, WPOS_KEEP_ALL, NULL);
1095     group_add_widget_autopos (g, hline_new (wd->rect.lines - 4, 1, -1), WPOS_KEEP_BOTTOM, NULL);
1096     bar = buttonbar_new ();
1097     group_add_widget (g, bar);
1098     /* restore ButtonBar coordinates after add_widget() */
1099     WIDGET (bar)->rect.x = 0;
1100     WIDGET (bar)->rect.y = LINES - 1;
1101 
1102     if (dlg_run (dlg) == B_ENTER)
1103     {
1104         const vfs_path_t *selected_name;
1105 
1106         selected_name = tree_selected_name (mytree);
1107         val = g_strdup (vfs_path_as_str (selected_name));
1108     }
1109 
1110     widget_destroy (wd);
1111     return val;
1112 }
1113 
1114 /* --------------------------------------------------------------------------------------------- */
1115 
1116 #ifdef ENABLE_VFS
1117 void
1118 configure_vfs_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
1119 {
1120     char buffer2[BUF_TINY];
1121 #ifdef ENABLE_VFS_FTP
1122     char buffer3[BUF_TINY];
1123 
1124     g_snprintf (buffer3, sizeof (buffer3), "%i", ftpfs_directory_timeout);
1125 #endif
1126 
1127     g_snprintf (buffer2, sizeof (buffer2), "%i", vfs_timeout);
1128 
1129     {
1130         char *ret_timeout;
1131 #ifdef ENABLE_VFS_FTP
1132         char *ret_passwd;
1133         char *ret_ftp_proxy;
1134         char *ret_directory_timeout;
1135 #endif /* ENABLE_VFS_FTP */
1136 
1137         quick_widget_t quick_widgets[] = {
1138             /* *INDENT-OFF* */
1139             QUICK_LABELED_INPUT (N_("Timeout for freeing VFSs (sec):"), input_label_left,
1140                                  buffer2, "input-timo-vfs", &ret_timeout, NULL, FALSE, FALSE,
1141                                  INPUT_COMPLETE_NONE),
1142 #ifdef ENABLE_VFS_FTP
1143             QUICK_SEPARATOR (TRUE),
1144             QUICK_LABELED_INPUT (N_("FTP anonymous password:"), input_label_left,
1145                                  ftpfs_anonymous_passwd, "input-passwd", &ret_passwd, NULL,
1146                                  FALSE, FALSE, INPUT_COMPLETE_NONE),
1147             QUICK_LABELED_INPUT (N_("FTP directory cache timeout (sec):"), input_label_left,
1148                                  buffer3, "input-timeout", &ret_directory_timeout, NULL,
1149                                  FALSE, FALSE, INPUT_COMPLETE_NONE),
1150             QUICK_CHECKBOX (N_("&Always use ftp proxy:"), &ftpfs_always_use_proxy,
1151                             &ftpfs_always_use_proxy_id),
1152             QUICK_INPUT (ftpfs_proxy_host, "input-ftp-proxy", &ret_ftp_proxy,
1153                          &ftpfs_proxy_host_id, FALSE, FALSE, INPUT_COMPLETE_HOSTNAMES),
1154             QUICK_CHECKBOX (N_("&Use ~/.netrc"), &ftpfs_use_netrc, NULL),
1155             QUICK_CHECKBOX (N_("Use &passive mode"), &ftpfs_use_passive_connections, NULL),
1156             QUICK_CHECKBOX (N_("Use passive mode over pro&xy"),
1157                             &ftpfs_use_passive_connections_over_proxy, NULL),
1158 #endif /* ENABLE_VFS_FTP */
1159             QUICK_BUTTONS_OK_CANCEL,
1160             QUICK_END
1161             /* *INDENT-ON* */
1162         };
1163 
1164         WRect r = { -1, -1, 0, 56 };
1165 
1166         quick_dialog_t qdlg = {
1167             r, N_("Virtual File System Setting"), "[Virtual FS]",
1168             quick_widgets,
1169 #ifdef ENABLE_VFS_FTP
1170             confvfs_callback,
1171 #else
1172             NULL,
1173 #endif
1174             NULL,
1175         };
1176 
1177 #ifdef ENABLE_VFS_FTP
1178         if (!ftpfs_always_use_proxy)
1179             quick_widgets[5].state = WST_DISABLED;
1180 #endif
1181 
1182         if (quick_dialog (&qdlg) != B_CANCEL)
1183         {
1184             /* cppcheck-suppress uninitvar */
1185             if (ret_timeout[0] == '\0')
1186                 vfs_timeout = 0;
1187             else
1188                 vfs_timeout = atoi (ret_timeout);
1189             g_free (ret_timeout);
1190 
1191             if (vfs_timeout < 0 || vfs_timeout > 10000)
1192                 vfs_timeout = 10;
1193 #ifdef ENABLE_VFS_FTP
1194             g_free (ftpfs_anonymous_passwd);
1195             /* cppcheck-suppress uninitvar */
1196             ftpfs_anonymous_passwd = ret_passwd;
1197             g_free (ftpfs_proxy_host);
1198             /* cppcheck-suppress uninitvar */
1199             ftpfs_proxy_host = ret_ftp_proxy;
1200             /* cppcheck-suppress uninitvar */
1201             if (ret_directory_timeout[0] == '\0')
1202                 ftpfs_directory_timeout = 0;
1203             else
1204                 ftpfs_directory_timeout = atoi (ret_directory_timeout);
1205             g_free (ret_directory_timeout);
1206 #endif
1207         }
1208     }
1209 }
1210 
1211 #endif /* ENABLE_VFS */
1212 
1213 /* --------------------------------------------------------------------------------------------- */
1214 
1215 char *
1216 cd_box (const WPanel * panel)
     /* [previous][next][first][last][top][bottom][index][help]  */
1217 {
1218     const Widget *w = CONST_WIDGET (panel);
1219     char *my_str;
1220 
1221     quick_widget_t quick_widgets[] = {
1222         QUICK_LABELED_INPUT (N_("cd"), input_label_left, "", "input", &my_str, NULL, FALSE, TRUE,
1223                              INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD),
1224         QUICK_END
1225     };
1226 
1227     WRect r = { w->rect.y + w->rect.lines - 6, w->rect.x, 0, w->rect.cols };
1228 
1229     quick_dialog_t qdlg = {
1230         r, N_("Quick cd"), "[Quick cd]",
1231         quick_widgets, NULL, NULL
1232     };
1233 
1234     return (quick_dialog (&qdlg) != B_CANCEL) ? my_str : NULL;
1235 }
1236 
1237 /* --------------------------------------------------------------------------------------------- */
1238 
1239 void
1240 symlink_box (const vfs_path_t * existing_vpath, const vfs_path_t * new_vpath,
     /* [previous][next][first][last][top][bottom][index][help]  */
1241              char **ret_existing, char **ret_new)
1242 {
1243     quick_widget_t quick_widgets[] = {
1244         /* *INDENT-OFF* */
1245         QUICK_LABELED_INPUT (N_("Existing filename (filename symlink will point to):"),
1246                              input_label_above, vfs_path_as_str (existing_vpath), "input-2",
1247                              ret_existing, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1248         QUICK_SEPARATOR (FALSE),
1249         QUICK_LABELED_INPUT (N_("Symbolic link filename:"), input_label_above,
1250                              vfs_path_as_str (new_vpath), "input-1",
1251                              ret_new, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1252         QUICK_BUTTONS_OK_CANCEL,
1253         QUICK_END
1254         /* *INDENT-ON* */
1255     };
1256 
1257     WRect r = { -1, -1, 0, 64 };
1258 
1259     quick_dialog_t qdlg = {
1260         r, N_("Symbolic link"), "[File Menu]",
1261         quick_widgets, NULL, NULL
1262     };
1263 
1264     if (quick_dialog (&qdlg) == B_CANCEL)
1265     {
1266         *ret_new = NULL;
1267         *ret_existing = NULL;
1268     }
1269 }
1270 
1271 /* --------------------------------------------------------------------------------------------- */
1272 
1273 #ifdef ENABLE_BACKGROUND
1274 void
1275 jobs_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
1276 {
1277     struct
1278     {
1279         const char *name;
1280         int flags;
1281         int value;
1282         int len;
1283         bcback_fn callback;
1284     }
1285     job_but[] =
1286     {
1287         /* *INDENT-OFF* */
1288         { N_("&Stop"), NORMAL_BUTTON, B_STOP, 0, task_cb },
1289         { N_("&Resume"), NORMAL_BUTTON, B_RESUME, 0, task_cb },
1290         { N_("&Kill"), NORMAL_BUTTON, B_KILL, 0, task_cb },
1291         { N_("&OK"), DEFPUSH_BUTTON, B_CANCEL, 0, NULL }
1292         /* *INDENT-ON* */
1293     };
1294 
1295     size_t i;
1296     const size_t n_but = G_N_ELEMENTS (job_but);
1297 
1298     WDialog *jobs_dlg;
1299     WGroup *g;
1300     int cols = 60;
1301     int lines = 15;
1302     int x = 0;
1303 
1304     for (i = 0; i < n_but; i++)
1305     {
1306 #ifdef ENABLE_NLS
1307         job_but[i].name = _(job_but[i].name);
1308 #endif /* ENABLE_NLS */
1309 
1310         job_but[i].len = str_term_width1 (job_but[i].name) + 3;
1311         if (job_but[i].flags == DEFPUSH_BUTTON)
1312             job_but[i].len += 2;
1313         x += job_but[i].len;
1314     }
1315 
1316     x += (int) n_but - 1;
1317     cols = MAX (cols, x + 6);
1318 
1319     jobs_dlg = dlg_create (TRUE, 0, 0, lines, cols, WPOS_CENTER, FALSE, dialog_colors, NULL, NULL,
1320                            "[Background jobs]", _("Background jobs"));
1321     g = GROUP (jobs_dlg);
1322 
1323     bg_list = listbox_new (2, 2, lines - 6, cols - 6, FALSE, NULL);
1324     jobs_fill_listbox (bg_list);
1325     group_add_widget (g, bg_list);
1326 
1327     group_add_widget (g, hline_new (lines - 4, -1, -1));
1328 
1329     x = (cols - x) / 2;
1330     for (i = 0; i < n_but; i++)
1331     {
1332         group_add_widget (g, button_new (lines - 3, x, job_but[i].value, job_but[i].flags,
1333                                          job_but[i].name, job_but[i].callback));
1334         x += job_but[i].len + 1;
1335     }
1336 
1337     (void) dlg_run (jobs_dlg);
1338     widget_destroy (WIDGET (jobs_dlg));
1339 }
1340 #endif /* ENABLE_BACKGROUND */
1341 
1342 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */