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-2024
   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 /*** forward declarations (file scope functions) *************************************************/
  92 
  93 /*** file scope variables ************************************************************************/
  94 
  95 static unsigned long configure_old_esc_mode_id, configure_time_out_id;
  96 
  97 /* Index in list_formats[] for "brief" */
  98 static const int panel_list_brief_idx = 1;
  99 /* Index in list_formats[] for "user defined" */
 100 static const int panel_list_user_idx = 3;
 101 
 102 static char **status_format;
 103 static unsigned long panel_list_formats_id, panel_user_format_id, panel_brief_cols_id;
 104 static unsigned long user_mini_status_id, mini_user_format_id;
 105 
 106 #ifdef HAVE_CHARSET
 107 static int new_display_codepage;
 108 #endif /* HAVE_CHARSET */
 109 
 110 #if defined(ENABLE_VFS) && defined(ENABLE_VFS_FTP)
 111 static unsigned long ftpfs_always_use_proxy_id, ftpfs_proxy_host_id;
 112 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
 113 
 114 static GPtrArray *skin_names;
 115 static gchar *current_skin_name;
 116 
 117 #ifdef ENABLE_BACKGROUND
 118 static WListbox *bg_list = NULL;
 119 #endif /* ENABLE_BACKGROUND */
 120 
 121 static unsigned long shadows_id;
 122 
 123 /* --------------------------------------------------------------------------------------------- */
 124 /*** file scope functions ************************************************************************/
 125 /* --------------------------------------------------------------------------------------------- */
 126 
 127 static cb_ret_t
 128 configure_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 129 {
 130     switch (msg)
 131     {
 132     case MSG_NOTIFY:
 133         /* message from "Single press" checkbutton */
 134         if (sender != NULL && sender->id == configure_old_esc_mode_id)
 135         {
 136             const gboolean not_single = !CHECK (sender)->state;
 137             Widget *ww;
 138 
 139             /* input line */
 140             ww = widget_find_by_id (w, configure_time_out_id);
 141             widget_disable (ww, not_single);
 142 
 143             return MSG_HANDLED;
 144         }
 145         return MSG_NOT_HANDLED;
 146 
 147     default:
 148         return dlg_default_callback (w, sender, msg, parm, data);
 149     }
 150 }
 151 
 152 /* --------------------------------------------------------------------------------------------- */
 153 
 154 static void
 155 skin_apply (const gchar *skin_override)
     /* [previous][next][first][last][top][bottom][index][help]  */
 156 {
 157     GError *mcerror = NULL;
 158 
 159     mc_skin_deinit ();
 160     mc_skin_init (skin_override, &mcerror);
 161     mc_fhl_free (&mc_filehighlight);
 162     mc_filehighlight = mc_fhl_new (TRUE);
 163     dlg_set_default_colors ();
 164     input_set_default_colors ();
 165     if (mc_global.mc_run_mode == MC_RUN_FULL)
 166         command_set_default_colors ();
 167     panel_deinit ();
 168     panel_init ();
 169     repaint_screen ();
 170 
 171     mc_error_message (&mcerror, NULL);
 172 }
 173 
 174 /* --------------------------------------------------------------------------------------------- */
 175 
 176 static const gchar *
 177 skin_name_to_label (const gchar *name)
     /* [previous][next][first][last][top][bottom][index][help]  */
 178 {
 179     if (strcmp (name, "default") == 0)
 180         return _("< Default >");
 181     return name;
 182 }
 183 
 184 /* --------------------------------------------------------------------------------------------- */
 185 
 186 static cb_ret_t
 187 skin_dlg_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 188 {
 189     switch (msg)
 190     {
 191     case MSG_RESIZE:
 192         {
 193             WDialog *d = DIALOG (w);
 194             const WRect *wd = &WIDGET (d->data.p)->rect;
 195             WRect r = w->rect;
 196 
 197             r.y = wd->y + (wd->lines - r.lines) / 2;
 198             r.x = wd->x + wd->cols / 2;
 199 
 200             return dlg_default_callback (w, NULL, MSG_RESIZE, 0, &r);
 201         }
 202 
 203     default:
 204         return dlg_default_callback (w, sender, msg, parm, data);
 205     }
 206 }
 207 
 208 /* --------------------------------------------------------------------------------------------- */
 209 
 210 static int
 211 sel_skin_button (WButton *button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 212 {
 213     int result;
 214     WListbox *skin_list;
 215     WDialog *skin_dlg;
 216     const gchar *skin_name;
 217     unsigned int i;
 218     unsigned int pos = 1;
 219 
 220     (void) action;
 221 
 222     skin_dlg =
 223         dlg_create (TRUE, 0, 0, 13, 24, WPOS_KEEP_DEFAULT, TRUE, dialog_colors, skin_dlg_callback,
 224                     NULL, "[Appearance]", _("Skins"));
 225     /* use Appearance dialog for positioning */
 226     skin_dlg->data.p = WIDGET (button)->owner;
 227 
 228     /* set dialog location before all */
 229     send_message (skin_dlg, NULL, MSG_RESIZE, 0, NULL);
 230 
 231     skin_list = listbox_new (1, 1, 11, 22, FALSE, NULL);
 232     skin_name = "default";
 233     listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name),
 234                       (void *) skin_name, FALSE);
 235 
 236     if (strcmp (skin_name, current_skin_name) == 0)
 237         listbox_set_current (skin_list, 0);
 238 
 239     for (i = 0; i < skin_names->len; i++)
 240     {
 241         skin_name = g_ptr_array_index (skin_names, i);
 242         if (strcmp (skin_name, "default") != 0)
 243         {
 244             listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name),
 245                               (void *) skin_name, FALSE);
 246             if (strcmp (skin_name, current_skin_name) == 0)
 247                 listbox_set_current (skin_list, pos);
 248             pos++;
 249         }
 250     }
 251 
 252     /* make list stick to all sides of dialog, effectively make it be resized with dialog */
 253     group_add_widget_autopos (GROUP (skin_dlg), skin_list, WPOS_KEEP_ALL, NULL);
 254 
 255     result = dlg_run (skin_dlg);
 256     if (result == B_ENTER)
 257     {
 258         gchar *skin_label;
 259 
 260         listbox_get_current (skin_list, &skin_label, (void **) &skin_name);
 261         g_free (current_skin_name);
 262         current_skin_name = g_strdup (skin_name);
 263         skin_apply (skin_name);
 264 
 265         button_set_text (button, str_fit_to_term (skin_label, 20, J_LEFT_FIT));
 266     }
 267     widget_destroy (WIDGET (skin_dlg));
 268 
 269     return 0;
 270 }
 271 
 272 /* --------------------------------------------------------------------------------------------- */
 273 
 274 static cb_ret_t
 275 appearance_box_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 276 {
 277     switch (msg)
 278     {
 279     case MSG_INIT:
 280 #ifdef ENABLE_SHADOWS
 281         if (!tty_use_colors ())
 282 #endif
 283         {
 284             Widget *shadow;
 285 
 286             shadow = widget_find_by_id (w, shadows_id);
 287             CHECK (shadow)->state = FALSE;
 288             widget_disable (shadow, TRUE);
 289         }
 290         return MSG_HANDLED;
 291 
 292     case MSG_NOTIFY:
 293         if (sender != NULL && sender->id == shadows_id)
 294         {
 295             mc_global.tty.shadows = CHECK (sender)->state;
 296             repaint_screen ();
 297             return MSG_HANDLED;
 298         }
 299         return MSG_NOT_HANDLED;
 300 
 301     default:
 302         return dlg_default_callback (w, sender, msg, parm, data);
 303     }
 304 }
 305 
 306 /* --------------------------------------------------------------------------------------------- */
 307 
 308 static cb_ret_t
 309 panel_listing_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 310 {
 311     switch (msg)
 312     {
 313     case MSG_NOTIFY:
 314         if (sender != NULL && sender->id == panel_list_formats_id)
 315         {
 316             WCheck *ch;
 317             WInput *in1, *in2, *in3;
 318 
 319             in1 = INPUT (widget_find_by_id (w, panel_user_format_id));
 320             in2 = INPUT (widget_find_by_id (w, panel_brief_cols_id));
 321             ch = CHECK (widget_find_by_id (w, user_mini_status_id));
 322             in3 = INPUT (widget_find_by_id (w, mini_user_format_id));
 323 
 324             if (!ch->state)
 325                 input_assign_text (in3, status_format[RADIO (sender)->sel]);
 326             input_update (in1, FALSE);
 327             input_update (in2, FALSE);
 328             input_update (in3, FALSE);
 329             widget_disable (WIDGET (in1), RADIO (sender)->sel != panel_list_user_idx);
 330             widget_disable (WIDGET (in2), RADIO (sender)->sel != panel_list_brief_idx);
 331             return MSG_HANDLED;
 332         }
 333 
 334         if (sender != NULL && sender->id == user_mini_status_id)
 335         {
 336             WInput *in;
 337 
 338             in = INPUT (widget_find_by_id (w, mini_user_format_id));
 339 
 340             if (CHECK (sender)->state)
 341             {
 342                 widget_disable (WIDGET (in), FALSE);
 343                 input_assign_text (in, status_format[3]);
 344             }
 345             else
 346             {
 347                 WRadio *r;
 348 
 349                 r = RADIO (widget_find_by_id (w, panel_list_formats_id));
 350                 widget_disable (WIDGET (in), TRUE);
 351                 input_assign_text (in, status_format[r->sel]);
 352             }
 353             /* input_update (in, FALSE); */
 354             return MSG_HANDLED;
 355         }
 356 
 357         return MSG_NOT_HANDLED;
 358 
 359     default:
 360         return dlg_default_callback (w, sender, msg, parm, data);
 361     }
 362 }
 363 
 364 /* --------------------------------------------------------------------------------------------- */
 365 
 366 #ifdef HAVE_CHARSET
 367 static int
 368 sel_charset_button (WButton *button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 369 {
 370     int new_dcp;
 371 
 372     (void) action;
 373 
 374     new_dcp = select_charset (-1, -1, new_display_codepage, TRUE);
 375 
 376     if (new_dcp != SELECT_CHARSET_CANCEL)
 377     {
 378         const char *cpname;
 379 
 380         new_display_codepage = new_dcp;
 381         cpname = (new_display_codepage == SELECT_CHARSET_OTHER_8BIT) ?
 382             _("Other 8 bit") :
 383             ((codepage_desc *) g_ptr_array_index (codepages, new_display_codepage))->name;
 384         if (cpname != NULL)
 385             mc_global.utf8_display = str_isutf8 (cpname);
 386         else
 387             cpname = _("7-bit ASCII");  /* FIXME */
 388 
 389         button_set_text (button, cpname);
 390         widget_draw (WIDGET (WIDGET (button)->owner));
 391     }
 392 
 393     return 0;
 394 }
 395 #endif /* HAVE_CHARSET */
 396 
 397 /* --------------------------------------------------------------------------------------------- */
 398 
 399 static cb_ret_t
 400 tree_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 401 {
 402     WDialog *h = DIALOG (w);
 403 
 404     switch (msg)
 405     {
 406     case MSG_RESIZE:
 407         {
 408             WRect r = w->rect;
 409             Widget *bar;
 410 
 411             r.lines = LINES - 9;
 412             r.cols = COLS - 20;
 413             dlg_default_callback (w, NULL, MSG_RESIZE, 0, &r);
 414 
 415             bar = WIDGET (buttonbar_find (h));
 416             bar->rect.x = 0;
 417             bar->rect.y = LINES - 1;
 418             return MSG_HANDLED;
 419         }
 420 
 421     case MSG_ACTION:
 422         return send_message (find_tree (h), NULL, MSG_ACTION, parm, NULL);
 423 
 424     default:
 425         return dlg_default_callback (w, sender, msg, parm, data);
 426     }
 427 }
 428 
 429 /* --------------------------------------------------------------------------------------------- */
 430 
 431 #if defined(ENABLE_VFS) && defined (ENABLE_VFS_FTP)
 432 static cb_ret_t
 433 confvfs_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 434 {
 435     switch (msg)
 436     {
 437     case MSG_NOTIFY:
 438         /* message from "Always use ftp proxy" checkbutton */
 439         if (sender != NULL && sender->id == ftpfs_always_use_proxy_id)
 440         {
 441             const gboolean not_use = !CHECK (sender)->state;
 442             Widget *wi;
 443 
 444             /* input */
 445             wi = widget_find_by_id (w, ftpfs_proxy_host_id);
 446             widget_disable (wi, not_use);
 447             return MSG_HANDLED;
 448         }
 449         return MSG_NOT_HANDLED;
 450 
 451     default:
 452         return dlg_default_callback (w, sender, msg, parm, data);
 453     }
 454 }
 455 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
 456 
 457 /* --------------------------------------------------------------------------------------------- */
 458 
 459 #ifdef ENABLE_BACKGROUND
 460 static void
 461 jobs_fill_listbox (WListbox *list)
     /* [previous][next][first][last][top][bottom][index][help]  */
 462 {
 463     static const char *state_str[2] = { "", "" };
 464     TaskList *tl;
 465 
 466     if (state_str[0][0] == '\0')
 467     {
 468         state_str[0] = _("Running");
 469         state_str[1] = _("Stopped");
 470     }
 471 
 472     for (tl = task_list; tl != NULL; tl = tl->next)
 473     {
 474         char *s;
 475 
 476         s = g_strconcat (state_str[tl->state], " ", tl->info, (char *) NULL);
 477         listbox_add_item_take (list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl, FALSE);
 478     }
 479 }
 480 
 481 /* --------------------------------------------------------------------------------------------- */
 482 
 483 static int
 484 task_cb (WButton *button, int action)
     /* [previous][next][first][last][top][bottom][index][help]  */
 485 {
 486     TaskList *tl;
 487     int sig = 0;
 488 
 489     (void) button;
 490 
 491     if (bg_list->list == NULL)
 492         return 0;
 493 
 494     /* Get this instance information */
 495     listbox_get_current (bg_list, NULL, (void **) &tl);
 496 
 497 #ifdef SIGTSTP
 498     if (action == B_STOP)
 499     {
 500         sig = SIGSTOP;
 501         tl->state = Task_Stopped;
 502     }
 503     else if (action == B_RESUME)
 504     {
 505         sig = SIGCONT;
 506         tl->state = Task_Running;
 507     }
 508     else
 509 #endif
 510     if (action == B_KILL)
 511         sig = SIGKILL;
 512 
 513     if (sig == SIGKILL)
 514         unregister_task_running (tl->pid, tl->fd);
 515 
 516     kill (tl->pid, sig);
 517     listbox_remove_list (bg_list);
 518     jobs_fill_listbox (bg_list);
 519 
 520     /* This can be optimized to just redraw this widget :-) */
 521     widget_draw (WIDGET (WIDGET (button)->owner));
 522 
 523     return 0;
 524 }
 525 #endif /* ENABLE_BACKGROUND */
 526 
 527 /* --------------------------------------------------------------------------------------------- */
 528 /*** public functions ****************************************************************************/
 529 /* --------------------------------------------------------------------------------------------- */
 530 
 531 void
 532 configure_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 533 {
 534     const char *pause_options[] = {
 535         N_("&Never"),
 536         N_("On dum&b terminals"),
 537         N_("Alwa&ys")
 538     };
 539 
 540     int pause_options_num;
 541 
 542     pause_options_num = G_N_ELEMENTS (pause_options);
 543 
 544     {
 545         char time_out[BUF_TINY] = "";
 546         char *time_out_new;
 547 
 548         quick_widget_t quick_widgets[] = {
 549             /* *INDENT-OFF* */
 550             QUICK_START_COLUMNS,
 551                 QUICK_START_GROUPBOX (N_("File operations")),
 552                     QUICK_CHECKBOX (N_("&Verbose operation"), &verbose, NULL),
 553                     QUICK_CHECKBOX (N_("Compute tota&ls"), &file_op_compute_totals, NULL),
 554                     QUICK_CHECKBOX (N_("Classic pro&gressbar"), &classic_progressbar, NULL),
 555                     QUICK_CHECKBOX (N_("Mkdi&r autoname"), &auto_fill_mkdir_name, NULL),
 556                     QUICK_CHECKBOX (N_("&Preallocate space"), &mc_global.vfs.preallocate_space,
 557                                     NULL),
 558                 QUICK_STOP_GROUPBOX,
 559                 QUICK_START_GROUPBOX (N_("Esc key mode")),
 560                     QUICK_CHECKBOX (N_("S&ingle press"), &old_esc_mode, &configure_old_esc_mode_id),
 561                     QUICK_LABELED_INPUT (N_("Timeout:"), input_label_left,
 562                                          (const char *) time_out, MC_HISTORY_ESC_TIMEOUT,
 563                                          &time_out_new, &configure_time_out_id, FALSE, FALSE,
 564                                          INPUT_COMPLETE_NONE),
 565                 QUICK_STOP_GROUPBOX,
 566                 QUICK_START_GROUPBOX (N_("Pause after run")),
 567                     QUICK_RADIO (pause_options_num, pause_options, &pause_after_run, NULL),
 568                 QUICK_STOP_GROUPBOX,
 569             QUICK_NEXT_COLUMN,
 570                 QUICK_START_GROUPBOX (N_("Other options")),
 571                     QUICK_CHECKBOX (N_("Use internal edi&t"), &use_internal_edit, NULL),
 572                     QUICK_CHECKBOX (N_("Use internal vie&w"), &use_internal_view, NULL),
 573                     QUICK_CHECKBOX (N_("A&sk new file name"),
 574                                     &editor_ask_filename_before_edit, NULL),
 575                     QUICK_CHECKBOX (N_("Auto m&enus"), &auto_menu, NULL),
 576                     QUICK_CHECKBOX (N_("&Drop down menus"), &drop_menus, NULL),
 577                     QUICK_CHECKBOX (N_("S&hell patterns"), &easy_patterns, NULL),
 578                     QUICK_CHECKBOX (N_("Co&mplete: show all"),
 579                                     &mc_global.widget.show_all_if_ambiguous, NULL),
 580                     QUICK_CHECKBOX (N_("Rotating d&ash"), &nice_rotating_dash, NULL),
 581                     QUICK_CHECKBOX (N_("Cd follows lin&ks"), &mc_global.vfs.cd_symlinks, NULL),
 582                     QUICK_CHECKBOX (N_("Sa&fe delete"), &safe_delete, NULL),
 583                     QUICK_CHECKBOX (N_("Safe overwrite"), &safe_overwrite, NULL),       /* w/o hotkey */
 584                     QUICK_CHECKBOX (N_("A&uto save setup"), &auto_save_setup, NULL),
 585                     QUICK_SEPARATOR (FALSE),
 586                     QUICK_SEPARATOR (FALSE),
 587                 QUICK_STOP_GROUPBOX,
 588             QUICK_STOP_COLUMNS,
 589             QUICK_BUTTONS_OK_CANCEL,
 590             QUICK_END
 591             /* *INDENT-ON* */
 592         };
 593 
 594         WRect r = { -1, -1, 0, 60 };
 595 
 596         quick_dialog_t qdlg = {
 597             r, N_("Configure options"), "[Configuration]",
 598             quick_widgets, configure_callback, NULL
 599         };
 600 
 601         g_snprintf (time_out, sizeof (time_out), "%d", old_esc_mode_timeout);
 602 
 603 #ifndef USE_INTERNAL_EDIT
 604         quick_widgets[17].state = WST_DISABLED;
 605 #endif
 606 
 607         if (!old_esc_mode)
 608             quick_widgets[10].state = quick_widgets[11].state = WST_DISABLED;
 609 
 610 #ifndef HAVE_POSIX_FALLOCATE
 611         mc_global.vfs.preallocate_space = FALSE;
 612         quick_widgets[7].state = WST_DISABLED;
 613 #endif
 614 
 615         if (quick_dialog (&qdlg) == B_ENTER)
 616         {
 617             if (time_out_new[0] == '\0')
 618                 old_esc_mode_timeout = 0;
 619             else
 620                 old_esc_mode_timeout = atoi (time_out_new);
 621         }
 622 
 623         g_free (time_out_new);
 624     }
 625 }
 626 
 627 /* --------------------------------------------------------------------------------------------- */
 628 
 629 void
 630 appearance_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 631 {
 632     gboolean shadows = mc_global.tty.shadows;
 633 
 634     current_skin_name = g_strdup (mc_skin__default.name);
 635     skin_names = mc_skin_list ();
 636 
 637     {
 638         quick_widget_t quick_widgets[] = {
 639             /* *INDENT-OFF* */
 640             QUICK_START_COLUMNS,
 641                 QUICK_LABEL (N_("Skin:"), NULL),
 642             QUICK_NEXT_COLUMN,
 643                 QUICK_BUTTON (str_fit_to_term (skin_name_to_label (current_skin_name), 20, J_LEFT_FIT),
 644                               B_USER, sel_skin_button, NULL),
 645             QUICK_STOP_COLUMNS,
 646             QUICK_SEPARATOR (TRUE),
 647             QUICK_CHECKBOX (N_("&Shadows"), &mc_global.tty.shadows, &shadows_id),
 648             QUICK_BUTTONS_OK_CANCEL,
 649             QUICK_END
 650             /* *INDENT-ON* */
 651         };
 652 
 653         WRect r = { -1, -1, 0, 54 };
 654 
 655         quick_dialog_t qdlg = {
 656             r, N_("Appearance"), "[Appearance]",
 657             quick_widgets, appearance_box_callback, NULL
 658         };
 659 
 660         if (quick_dialog (&qdlg) == B_ENTER)
 661             mc_config_set_string (mc_global.main_config, CONFIG_APP_SECTION, "skin",
 662                                   current_skin_name);
 663         else
 664         {
 665             skin_apply (NULL);
 666             mc_global.tty.shadows = shadows;
 667         }
 668     }
 669 
 670     g_free (current_skin_name);
 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     WRect r;
1080     WDialog *dlg;
1081     WGroup *g;
1082     Widget *wd;
1083     char *val = NULL;
1084     WButtonBar *bar;
1085 
1086     (void) current_dir;
1087 
1088     /* Create the components */
1089     dlg = dlg_create (TRUE, 0, 0, LINES - 9, COLS - 20, WPOS_CENTER, FALSE, dialog_colors,
1090                       tree_callback, NULL, "[Directory Tree]", _("Directory tree"));
1091     g = GROUP (dlg);
1092     wd = WIDGET (dlg);
1093 
1094     rect_init (&r, 2, 2, wd->rect.lines - 6, wd->rect.cols - 5);
1095     mytree = tree_new (&r, FALSE);
1096     group_add_widget_autopos (g, mytree, WPOS_KEEP_ALL, NULL);
1097     group_add_widget_autopos (g, hline_new (wd->rect.lines - 4, 1, -1), WPOS_KEEP_BOTTOM, NULL);
1098     bar = buttonbar_new ();
1099     group_add_widget (g, bar);
1100     /* restore ButtonBar coordinates after add_widget() */
1101     WIDGET (bar)->rect.x = 0;
1102     WIDGET (bar)->rect.y = LINES - 1;
1103 
1104     if (dlg_run (dlg) == B_ENTER)
1105     {
1106         const vfs_path_t *selected_name;
1107 
1108         selected_name = tree_selected_name (mytree);
1109         val = g_strdup (vfs_path_as_str (selected_name));
1110     }
1111 
1112     widget_destroy (wd);
1113     return val;
1114 }
1115 
1116 /* --------------------------------------------------------------------------------------------- */
1117 
1118 #ifdef ENABLE_VFS
1119 void
1120 configure_vfs_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
1121 {
1122     char buffer2[BUF_TINY];
1123 #ifdef ENABLE_VFS_FTP
1124     char buffer3[BUF_TINY];
1125 
1126     g_snprintf (buffer3, sizeof (buffer3), "%i", ftpfs_directory_timeout);
1127 #endif
1128 
1129     g_snprintf (buffer2, sizeof (buffer2), "%i", vfs_timeout);
1130 
1131     {
1132         char *ret_timeout;
1133 #ifdef ENABLE_VFS_FTP
1134         char *ret_passwd;
1135         char *ret_ftp_proxy;
1136         char *ret_directory_timeout;
1137 #endif /* ENABLE_VFS_FTP */
1138 
1139         quick_widget_t quick_widgets[] = {
1140             /* *INDENT-OFF* */
1141             QUICK_LABELED_INPUT (N_("Timeout for freeing VFSs (sec):"), input_label_left,
1142                                  buffer2, "input-timo-vfs", &ret_timeout, NULL, FALSE, FALSE,
1143                                  INPUT_COMPLETE_NONE),
1144 #ifdef ENABLE_VFS_FTP
1145             QUICK_SEPARATOR (TRUE),
1146             QUICK_LABELED_INPUT (N_("FTP anonymous password:"), input_label_left,
1147                                  ftpfs_anonymous_passwd, "input-passwd", &ret_passwd, NULL,
1148                                  FALSE, FALSE, INPUT_COMPLETE_NONE),
1149             QUICK_LABELED_INPUT (N_("FTP directory cache timeout (sec):"), input_label_left,
1150                                  buffer3, "input-timeout", &ret_directory_timeout, NULL,
1151                                  FALSE, FALSE, INPUT_COMPLETE_NONE),
1152             QUICK_CHECKBOX (N_("&Always use ftp proxy:"), &ftpfs_always_use_proxy,
1153                             &ftpfs_always_use_proxy_id),
1154             QUICK_INPUT (ftpfs_proxy_host, "input-ftp-proxy", &ret_ftp_proxy,
1155                          &ftpfs_proxy_host_id, FALSE, FALSE, INPUT_COMPLETE_HOSTNAMES),
1156             QUICK_CHECKBOX (N_("&Use ~/.netrc"), &ftpfs_use_netrc, NULL),
1157             QUICK_CHECKBOX (N_("Use &passive mode"), &ftpfs_use_passive_connections, NULL),
1158             QUICK_CHECKBOX (N_("Use passive mode over pro&xy"),
1159                             &ftpfs_use_passive_connections_over_proxy, NULL),
1160 #endif /* ENABLE_VFS_FTP */
1161             QUICK_BUTTONS_OK_CANCEL,
1162             QUICK_END
1163             /* *INDENT-ON* */
1164         };
1165 
1166         WRect r = { -1, -1, 0, 56 };
1167 
1168         quick_dialog_t qdlg = {
1169             r, N_("Virtual File System Setting"), "[Virtual FS]",
1170             quick_widgets,
1171 #ifdef ENABLE_VFS_FTP
1172             confvfs_callback,
1173 #else
1174             NULL,
1175 #endif
1176             NULL,
1177         };
1178 
1179 #ifdef ENABLE_VFS_FTP
1180         if (!ftpfs_always_use_proxy)
1181             quick_widgets[5].state = WST_DISABLED;
1182 #endif
1183 
1184         if (quick_dialog (&qdlg) != B_CANCEL)
1185         {
1186             /* cppcheck-suppress uninitvar */
1187             if (ret_timeout[0] == '\0')
1188                 vfs_timeout = 0;
1189             else
1190                 vfs_timeout = atoi (ret_timeout);
1191             g_free (ret_timeout);
1192 
1193             if (vfs_timeout < 0 || vfs_timeout > 10000)
1194                 vfs_timeout = 10;
1195 #ifdef ENABLE_VFS_FTP
1196             g_free (ftpfs_anonymous_passwd);
1197             /* cppcheck-suppress uninitvar */
1198             ftpfs_anonymous_passwd = ret_passwd;
1199             g_free (ftpfs_proxy_host);
1200             /* cppcheck-suppress uninitvar */
1201             ftpfs_proxy_host = ret_ftp_proxy;
1202             /* cppcheck-suppress uninitvar */
1203             if (ret_directory_timeout[0] == '\0')
1204                 ftpfs_directory_timeout = 0;
1205             else
1206                 ftpfs_directory_timeout = atoi (ret_directory_timeout);
1207             g_free (ret_directory_timeout);
1208 #endif
1209         }
1210     }
1211 }
1212 
1213 #endif /* ENABLE_VFS */
1214 
1215 /* --------------------------------------------------------------------------------------------- */
1216 
1217 char *
1218 cd_box (const WPanel *panel)
     /* [previous][next][first][last][top][bottom][index][help]  */
1219 {
1220     const Widget *w = CONST_WIDGET (panel);
1221     char *my_str;
1222 
1223     quick_widget_t quick_widgets[] = {
1224         QUICK_LABELED_INPUT (N_("cd"), input_label_left, "", "input", &my_str, NULL, FALSE, TRUE,
1225                              INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD),
1226         QUICK_END
1227     };
1228 
1229     WRect r = { w->rect.y + w->rect.lines - 6, w->rect.x, 0, w->rect.cols };
1230 
1231     quick_dialog_t qdlg = {
1232         r, N_("Quick cd"), "[Quick cd]",
1233         quick_widgets, NULL, NULL
1234     };
1235 
1236     return (quick_dialog (&qdlg) != B_CANCEL) ? my_str : NULL;
1237 }
1238 
1239 /* --------------------------------------------------------------------------------------------- */
1240 
1241 void
1242 symlink_box (const vfs_path_t *existing_vpath, const vfs_path_t *new_vpath,
     /* [previous][next][first][last][top][bottom][index][help]  */
1243              char **ret_existing, char **ret_new)
1244 {
1245     quick_widget_t quick_widgets[] = {
1246         /* *INDENT-OFF* */
1247         QUICK_LABELED_INPUT (N_("Existing filename (filename symlink will point to):"),
1248                              input_label_above, vfs_path_as_str (existing_vpath), "input-2",
1249                              ret_existing, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1250         QUICK_SEPARATOR (FALSE),
1251         QUICK_LABELED_INPUT (N_("Symbolic link filename:"), input_label_above,
1252                              vfs_path_as_str (new_vpath), "input-1",
1253                              ret_new, NULL, FALSE, FALSE, INPUT_COMPLETE_FILENAMES),
1254         QUICK_BUTTONS_OK_CANCEL,
1255         QUICK_END
1256         /* *INDENT-ON* */
1257     };
1258 
1259     WRect r = { -1, -1, 0, 64 };
1260 
1261     quick_dialog_t qdlg = {
1262         r, N_("Symbolic link"), "[File Menu]",
1263         quick_widgets, NULL, NULL
1264     };
1265 
1266     if (quick_dialog (&qdlg) == B_CANCEL)
1267     {
1268         *ret_new = NULL;
1269         *ret_existing = NULL;
1270     }
1271 }
1272 
1273 /* --------------------------------------------------------------------------------------------- */
1274 
1275 #ifdef ENABLE_BACKGROUND
1276 void
1277 jobs_box (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
1278 {
1279     struct
1280     {
1281         const char *name;
1282         int flags;
1283         int value;
1284         int len;
1285         bcback_fn callback;
1286     }
1287     job_but[] = {
1288         /* *INDENT-OFF* */
1289         { N_("&Stop"), NORMAL_BUTTON, B_STOP, 0, task_cb },
1290         { N_("&Resume"), NORMAL_BUTTON, B_RESUME, 0, task_cb },
1291         { N_("&Kill"), NORMAL_BUTTON, B_KILL, 0, task_cb },
1292         { N_("&OK"), DEFPUSH_BUTTON, B_CANCEL, 0, NULL }
1293         /* *INDENT-ON* */
1294     };
1295 
1296     size_t i;
1297     const size_t n_but = G_N_ELEMENTS (job_but);
1298 
1299     WDialog *jobs_dlg;
1300     WGroup *g;
1301     int cols = 60;
1302     int lines = 15;
1303     int x = 0;
1304 
1305     for (i = 0; i < n_but; i++)
1306     {
1307 #ifdef ENABLE_NLS
1308         job_but[i].name = _(job_but[i].name);
1309 #endif /* ENABLE_NLS */
1310 
1311         job_but[i].len = str_term_width1 (job_but[i].name) + 3;
1312         if (job_but[i].flags == DEFPUSH_BUTTON)
1313             job_but[i].len += 2;
1314         x += job_but[i].len;
1315     }
1316 
1317     x += (int) n_but - 1;
1318     cols = MAX (cols, x + 6);
1319 
1320     jobs_dlg = dlg_create (TRUE, 0, 0, lines, cols, WPOS_CENTER, FALSE, dialog_colors, NULL, NULL,
1321                            "[Background jobs]", _("Background jobs"));
1322     g = GROUP (jobs_dlg);
1323 
1324     bg_list = listbox_new (2, 2, lines - 6, cols - 6, FALSE, NULL);
1325     jobs_fill_listbox (bg_list);
1326     group_add_widget (g, bg_list);
1327 
1328     group_add_widget (g, hline_new (lines - 4, -1, -1));
1329 
1330     x = (cols - x) / 2;
1331     for (i = 0; i < n_but; i++)
1332     {
1333         group_add_widget (g, button_new (lines - 3, x, job_but[i].value, job_but[i].flags,
1334                                          job_but[i].name, job_but[i].callback));
1335         x += job_but[i].len + 1;
1336     }
1337 
1338     (void) dlg_run (jobs_dlg);
1339     widget_destroy (WIDGET (jobs_dlg));
1340 }
1341 #endif /* ENABLE_BACKGROUND */
1342 
1343 /* --------------------------------------------------------------------------------------------- */

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